Symfony 2-基于实体关联的动态表单生成


Symfony 2 - Dynamic form generation based on Entities association

我有以下设置:

实体结果

/**
 * @ORM'OneToMany(targetEntity="Answer", mappedBy="result", cascade={"persist", "remove"}, orphanRemoval=true)
 */
private $answers;

实体答案

/**
 * @ORM'ManyToOne(targetEntity="Result", inversedBy="answerswers", cascade={"persist"})
 * @ORM'JoinColumn(name="result_id", referencedColumnName="id")
 */
private $result;

表单结果类型

public function buildForm(FormBuilderInterface $builder, array $options)
{      
    $builder
        ->add('answers', 'collection', array(
            'type' => new AnswerType(),               
        ))
    ;
}

表单AnswerType:-我想让这个动态的,目前不推荐使用:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('value', 'choice', array(
        'choices'   => Answer::getChoices(),
        'expanded'  => true,
        'required'  => true,
    ))
    ;
}

我想做的事:

结果表单有一个AnswerType集合。我希望每个AnswerType都是动态的,这取决于答案链接到的当前。

例如,如果我在Answer::getRandomStatus()上有一个函数-如果它是true-则AnswerType的value字段为text,否则为choice

我的猜测是AnswerTypebuildForm方法,但$builder->getData() returns null,我无法区分。

这应该会给你想要的答案:

http://symfony.com/doc/2.0/cookbook/form/dynamic_form_modification.html

为了更好地理解以上内容,您可以查看一下:

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/FormEvents.php

我也在寻找这个,但想要一个已经实现的解决方案。看看CollectionType的源代码,它大量使用了这些事件。

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CollectionType.phphttps://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/EventListener/ResizeFormListener.php