1

我有一个带有一个默认值的表单:

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

4

2 回答 2

0

该字段options始终具有默认值的原因可能是实际查询。不要直接对数据进行非规范化和设置,而是将else片段修改为:

} else {
    $form = $this->createForm(new GearType(), new Gear(), array(
        'validation_groups' => array('not-validating')
    ));
    $form->bind($request);
}

该表单将仅针对与该组关联的验证进行验证,这将避免在表单构建为 formnot-validating时显示常见警报。requiredGET

关于“验证组”的文档: http: //symfony.com/doc/current/book/forms.html#validation-groups

问题类似于:Symfony2 中的实体表单字段和验证?

于 2013-03-13T06:38:26.170 回答
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';
        }
于 2013-02-19T03:04:10.690 回答