预填充动态表单字段

时间:2013-10-30 17:53:50

标签: symfony symfony-forms

文档解释了how to dynamically modify forms using form events,特别是POST_SUBMIT事件。

按照此示例,在POST_SUBMIT事件侦听器中,我无法添加具有预填充数据的字段,如:$form->add('position', 'text', array('data' => 'It works'));

该字段已添加但为空。

知道我该怎么办?


修改

基本上,表单类型如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder->add('colors', 'choice', array(
        'choices' => array('blue', 'green', 'red'),
        'multiple' => true,
        'expanded' => true,
        'mapped' => false,
    ));

    $builder->get('colors')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
        // ... Some logic to determine data to pre populate $myValue
        $myValue = 'It works';

        $form = $event->getForm()->getParent();
        $form->add('position', 'text', array(
            'data' => $myValue
        ));
    });

}

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,提交的数据替换了默认值。 所以,在我的PRE_SUBMIT监听器中,我检查了数据是否已提交,如果不是,我将其插入:

public function onPreSubmit(FormEvent $event)
{
    $form = $event->getForm();
    $data = $event->getData();
    if(!isset($data['MY_FIELD'])) {
        $data['MY_FIELD'] = $myCustomData;
        $event->setData($data);
    }
}

在我的情况下' MY_FIELD'是一个实体的嵌入形式,$ myCustomData是我的实体与它的字段集。

答案 1 :(得分:0)

你的意思是当你加载它时字段显示为空,或者字段没有发布$ myValue数据?在提交表单之前,表单不会运行post_submit事件侦听器,因此在呈现表单时它将显示为空白。提交表单后,它仍然不会显示$ myValue数据,因为控制器将重定向或加载不同的页面。 如果您只想在加载表单时最初显示数据,我认为您不需要使用事件侦听器。在创建表单之后但在呈现表单之前,您可以直接在控制器中设置表单值。

$form->get('position')->setData($myValue);

或许你确实想在那里使用一个事件监听器,你可能想要使用PRE_SET_DATA。您提到的食谱链接有几个示例,我想您可能想重新访问该代码。