【问题标题】:add model transformer for a certain form field in form events在表单事件中为某个表单字段添加模型转换器
【发布时间】:2015-08-17 05:20:52
【问题描述】:

我发现唯一可行的方法是在表单类型的 buildForm 方法中添加模型转换器,如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $transformer = new IssueToNumberTransformer($entityManager);
    $builder->add(
        $builder->create('issue', 'text')->addModelTransformer($transformer)
    ); 
}

但是我有一个表单域,当另一个表单域具有有效值时会显示,所以我宁愿在FormEvent::PRE_SET_DATA 事件中创建表单域。

1。一种错误的方式

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($builder) {
     /** @var $order \VMSP\OrderBundle\Entity\OrderInterface */
     $order = $event->getData();
     $form  = $event->getForm();
     /** @var $serviceType \VMSP\StoreBundle\Entity\ServiceType */
     $serviceType = $order->getServiceType();

     //only home service needs user's address
     if ($serviceType && $serviceType->getType() == ServiceType::TYPE_HOME_SERVICE) {
         //won't work
         $form->add(
             $builder->create('address','hidden')
                     ->addModelTransformer($this->addressTransformer),
             array(
                 'label' => 'vmsp_order.contact.form.address',
             )
         );
    }
}

有人建议

$form->add(
   $builder->create('address', 'hidden')
           ->addModelTransformer($this->addressTransformer),
   array( 'label' => 'vmsp_order.contact.form.address')
);

不幸的是,它抛出了这个错误:

给定类型为“字符串、整数或 Symfony\Component\Form\FormInterface”、“Symfony\Component\Form\FormBuilder”的预期参数

2。另一个错误的方式

if ($serviceType && $serviceType->getType() == ServiceType::TYPE_HOME_SERVICE) {
    $form->add(
        'address', 
        'hidden', 
        array('label' => 'vmsp_order.contact.form.address')
    );

    $form->get('address')
         ->getConfig()
         ->addModelTransformer($this->addressTransformer);
}

出现错误:

一旦将构建器转换为 FormConfigInterface 实例,就无法再访问 FormConfigBuilder 方法。

我在上面列出了两种错误的方式,因为我发现很多帖子都说这些方式是正确的,当然,它们不是。这篇文章和symfony2-form-events-and-model-transformers 是同一个问题,但这个答案不是我需要的,所以我的问题是,有什么方法可以在某个表单字段的表单事件中添加模型转换器?

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

    您的“1. 一种错误的方式”不起作用,因为 $builder->addModelTransformer() 返回 FormConfigBuilderInterface$form->add() 需要 FormInterface(请参阅您的错误消息)。

    要使其工作,只需添加 getForm()

    $form->add(
        $builder->create('address','hidden')
            ->addModelTransformer($this->addressTransformer)
            ->getForm()   // Creates the form
            ...
    

    【讨论】:

      【解决方案2】:

      我建议在反向模式下进行。配置您的隐藏地址字段并在必要时将其删除:

      public function buildForm(FormBuilderInterface $builder, array $options)
      {
          $transformer = new IssueToNumberTransformer($entityManager);
          $builder->add(
              $builder->create('issue', 'text')->addModelTransformer($transformer)
          )->add('address','hidden')
           ->addModelTransformer($this->addressTransformer);
      }
      

      然后,检查监听器是否应该删除隐藏字段:

       ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($builder) {
           /** @var $order \VMSP\OrderBundle\Entity\OrderInterface */
           $order = $event->getData();
           $form  = $event->getForm();
           /** @var $serviceType \VMSP\StoreBundle\Entity\ServiceType */
           $serviceType = $order->getServiceType();
      
           //only home service needs user's address
           if (!$serviceType || $serviceType->getType() != ServiceType::TYPE_HOME_SERVICE) {
               //will work
               $form->remove('address');
          }
      }
      

      我想知道为什么第一个错误的方法不起作用?出现哪个错误?

      【讨论】:

        猜你喜欢
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 2015-07-15
        • 2023-03-25
        • 1970-01-01
        • 2020-05-29
        相关资源
        最近更新 更多