使用事件侦听器和Symfony2中的FormEvent :: PRE_SET_DATA事件设置数据

时间:2014-06-19 20:15:23

标签: forms symfony entity formbuilder

我尝试根据表单中的其他数据修改表单中的某些数据。来自the docs

  

在Form :: setData()方法的开头调度FormEvents :: PRE_SET_DATA事件。它可以用于:

     
      
  • 修改预填充期间提供的数据
  •   
  • 根据预先填充的数据修改表单(动态添加或删除字段)。
  •   

这条粗线使我相信应该可以在buildForm函数中执行以下操作:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SET_DATA,
        function(\Symfony\Component\Form\FormEvent $event) use ($options) {
            if ($options['default_to_nickname']) {
                $securityContext = $this->container->get('security.context');
                $nickname = null;
                if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
                    $user = $securityContext->getToken()->getUser();
                    $nickname = $user->getNickName();
                    if (isset($nickname))
                    {
                        $options['data'] = $nickname;
                        //$event->setData($nickname); //this doesn't work either
                    }
                }
            }
        }
    );
}

但是,options['data'] = $nickname;$event->setData($nickname);都不会导致表单填充正确的数据。我可以看到,当我调用$event->setData($nickname);时,在FormEvent对象中设置了数据,但是当实际呈现表单时,数据未设置。我期待错误的事吗?我已经研究过在此之后是否有其他东西可能会修改它,并且没有。非常欢迎任何帮助!

1 个答案:

答案 0 :(得分:0)

您必须致电$event->getForm()->get('your_property')->setData($nickname)。如果该属性尚不存在,请将get()方法替换为add($property, $type, ['data' => $nickname])

请参阅:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#adding-an-event-subscriber-to-a-form-class