Symfony2 - FormType中的条件

时间:2015-10-12 16:36:07

标签: php symfony

我的表单有一个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';
    }
}
?>

注册实体与名为Product

的实体有关系

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

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

如果产品标题的值为“超级产品”,然后我在表单中添加一个字段。

但是我不知道我必须用来在FormType中调用另一个Entity值的语法。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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';
        }
    }
?>

那是&#34; is_a()&#34;函数检查通过表单类型类构造函数传入的产品变量是否是产品实体的实例,因此您可以确保getTitle()函数存在。

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

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

答案 1 :(得分:0)

尝试这样的事情:

$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;