我的表单有一个默认值:
class GearType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('options')
->add('model', 'choice', array('choices' => $this->getModelChoices(), 'data' => 2));
}
其中一个要求是表格可以通过在URL中传递参数来预先填充。对潜在客户来说,复制和粘贴链接到电子邮件,传播者等也是一个很好的功能。
我是这样做的:
/**
* @Route("/car/gear")
* @Template()
*/
public function gearAction(Request $request)
{
$form = $this->createForm(new GearType());
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
return 'is valid';
}
} else {
$get = $this->getRequest()->query->all();
if (!empty($get)) {
$normalizer = new GetSetMethodNormalizer();
$form->setData($normalizer->denormalize($get, new Gear())); # look here
}
}
return array('form' => $form->createView());
}
不幸的是,字段'选项'始终具有默认值,而是作为参数传递的值。 我试图改变行#在这里改为
$gear = $normalizer->denormalize($get, new Gear());
$form = $this->createForm(new GearType(), $gear);
但没有结果。
似乎解决方案是将其他参数传递给GearType对象。我不喜欢这个解决方案。有谁知道更好的方法?
答案 0 :(得分:0)
添加此代码段,并根据需要在[]之间进行修改
$form->bind($request);
if ( [ passed parameters from querystring ] ){ //// New Code
$form->getData()->setOptions( [ processed parameter ]); //// New Code
} //// New Code
if ($form->isValid()) {
return 'is valid';
}
答案 1 :(得分:0)
字段options
始终具有默认值的原因可能是实际查询。而不是直接非规范化和设置数据,将else
片段修改为:
} else {
$form = $this->createForm(new GearType(), new Gear(), array(
'validation_groups' => array('not-validating')
));
$form->bind($request);
}
表单只会针对与not-validating
组相关联的验证进行验证,如果表单是required
构建的,则会避免显示常见的GET
警报。
关于'验证群组'的文档:http://symfony.com/doc/current/book/forms.html#validation-groups