【问题标题】:Symfony2 form: enable/disable field from listenerSymfony2 表单:启用/禁用侦听器的字段
【发布时间】:2015-07-03 05:45:05
【问题描述】:

我需要根据给定字段的值禁用/重新启用表单字段。为了实现它,我在 onPreSubmit 事件上使用了一个监听器。然后,如果一个字段应该被禁用,它会再次添加到表单中

$form->add('name', 'text', array("disabled" => "disabled");

从某种意义上说,这很好用:如果一个字段已启用但应该禁用,那么结果就可以了。 在另一种意义上,如果一个字段被禁用,那么这个字段就不会被发送。在侦听器中,该字段已启用,但在最终结果中,初始值不再存在。

我假设,因为该字段被禁用,它没有被发送,所以 Symfony 认为它有一个空值。从 preSubmit 或 Submit 事件的侦听器,如果我这样做:

$event->getData()

然后将所有在表单中但不在 POST 数据中的字段设置为 null。 有没有办法简单地激活字段,保持初始值?还是不考虑缺失字段的价值?

【问题讨论】:

    标签: forms symfony events


    【解决方案1】:

    您的问题类似于Symfony's documentation on dynamic form modification 中的示例。在您的情况下,值取决于禁用/重新启用“名称”字段的“给定字段”等效于 Symfony 文档的“运动”字段,以及您的“名称”字段(更具体地说是“禁用”选项)等价于 Symfony 文档的“位置”字段(更具体地说是“选择”选项)。

    上面,我提供了 Symfony 2.8 文档的链接,因为它是您在问题中提到的版本,但它不再维护。如果您想了解最新信息,请参阅more recent doc

    【讨论】:

      【解决方案2】:

      除了Marino Di Celemente的回答之外,这是对Symfony 3.2的disableField方法稍作调整

      use Symfony\Component\Form\FormInterface;
      private function disableField(FormInterface $field)
      {
          $parent  = $field->getParent();
          $options = $field->getConfig()->getOptions();
          $name    = $field->getName();
          $type    = get_class($field->getConfig()->getType()->getInnerType());
          $parent->remove($name);
          $parent->add($name, $type, array_merge($options, ['disabled' => true]));
      }
      

      【讨论】:

        【解决方案3】:

        迟到总比没有好:)

        今天我遇到了同样的问题,总而言之,您不能使用侦听器更改字段的选项,因为选项属性是私有的,并且只有 getOption 和 getOptions,但您可以删除并添加该字段的克隆

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $this->buildUserForm($builder, $options);
        
            $builder->addEventListener(
                FormEvents::PRE_SET_DATA,
                function (FormEvent $event) {
                    $form = $event->getForm();
                    $user = $event->getData();
                    if($user->getBirthday()){ 
                        $this->disableField($form->get('birthday'));
                    }
                }
            );
        }
        
        private function disableField($field){
            $parent = $field->getParent();
            $options = $field->getConfig()->getOptions();
            $name = $field->getName();
            $type = $field->getConfig()->getType()->getName();
            $parent->remove($name);
            $parent->add($name, $type, array_merge($options,['disabled' => true]));
        }
        

        【讨论】:

          猜你喜欢
          • 2017-07-11
          • 1970-01-01
          • 1970-01-01
          • 2013-09-07
          • 1970-01-01
          • 1970-01-01
          • 2017-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多