Symfony2 - FormType中的条件


Symfony2 - Condition in FormType

我有一个类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,
    ]);
}
?>

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

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

提前感谢您的帮助。

啊,很好,你已经实现了你的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);
?>

试试这样:

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