Symfony2表单 - 如何使用默认值覆盖字段

时间:2013-02-16 17:38:25

标签: php forms symfony

我的表单有一个默认值:

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对象。我不喜欢这个解决方案。有谁知道更好的方法?

2 个答案:

答案 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

问题类似于:Entity form field and validation in Symfony2?