【问题标题】:Symfony2 - Condition in FormTypeSymfony2 - FormType 中的条件
【发布时间】:2015-10-12 16:36:07
【问题描述】:

我的表单有一个类 RegisterType:

<?php
class RegisterType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('price');        
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Register'
        ));
    }

    public function getName()
    {
        return 'register';
    }
}
?>

注册实体与名为产品的实体有关系

我想将此条件添加到 buildForm 函数中:

<?php
if ($product->getTitle() == 'SuperProduct') {
    $builder->add('amount', 'money', [
        'required' => FALSE,
    ]);
}
?>

如果产品标题的值为“SuperProduct”,那么我在表单中添加一个字段。

但我不知道在 FormType 中调用另一个实体值时必须使用的语法。

提前感谢您的帮助。

【问题讨论】:

  • 保持简单。只是不需要该字段,然后检查您需要在控制器中检查的内容,并且不要与表单类型混淆。

标签: php symfony


【解决方案1】:

很好,您已经将 FormType 实现为一个独立的类,而不是在控制器中,所以我要做的是将您的产品实体作为选项传递给您的 FormType 类中的私有变量。我不确定您的产品属于哪个类别或它所在的名称空间,因此您必须填写。

我也写了这个,期望你将来可以有多个选项来传递,所以它对你编写的其他 FormType 类很有用。当您创建 FormType 类的实例时,可以设置您在类范围中定义的每个变量。请务必将这些变量初始化为 false 而不是 null,否则构造函数中的代码将看不到它们。

<?php
    class RegisterType extends AbstractType
    {
        private $product = false;

        public function __construct(array $options = [])
        {
            foreach ($options as $name => $value) {
                if (isset($this->$name)) {
                    $this->$name => $value;
                }
            }
        }

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name')
                ->add('price')
            ;

            if ($this->product && is_a("\Namespace\To\Your\Entity\Called\Product", $this->product)) {
                if ($this->product->getTitle() == 'SuperProduct') {
                    $builder
                        ->add('amount', 'money', [
                            'required' => FALSE,
                        ])
                    ;
                }
            }
        }

        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AppBundle\Entity\Register'
            ));
        }

        public function getName()
        {
            return 'register';
        }
    }
?>

那个“is_a()”函数检查通过表单类型类构造函数传入的产品变量是否真的是你的产品实体的一个实例,所以你可以确定getTitle()函数存在。

现在,当您创建 RegisterType 类的新实例时,您需要传递包含您的产品的选项数组。两个概念变量名称供您在此处重命名。

<?php
    $form = $this->createForm(new RegisterType([
        "product" => $instanceOfProductEntityOrNull,
    ]), $theEntityTheFormWillBeHandling);
?>

【讨论】:

    【解决方案2】:

    试试这样的:

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $product = $event->getData();
        $form = $event->getForm();
    
        if ($product->getTitle() == 'SuperProduct') {
            $form->add('name', 'text');
        }
    });
    

    并且不要忘记具体用途

    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents; 
    

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2012-12-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      相关资源
      最近更新 更多