同一字段多次Symfony 4表单

时间:2018-08-14 18:43:57

标签: forms symfony entity repeat

我有一个实体报告,其中包含许多答案

class Report
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Answer", mappedBy="report")
     */
     private $answers; 
     ...
}

class Answer
{

    /**
     * @ORM\ManyToOne(targetEntity="Report", inversedBy="answers")
     */
     private $report;
     ...
}

我在我的 ReportType 中手动添加了问题(我知道这不是最好的方法,但是问题永远不会改变,我只对答案感兴趣。)

class ReportAnswersType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('answers', ChoiceType::class, array(
            'label' => 'Room state',
            'multiple' => false, 'expanded' => false,
            'choices'  => array('OK' => 'OK', 'NG' => 'NG', 'NP' => 'NP',),
        ))
        ->add('answers', IntegerType::class, array(
            'label' => 'Temperature',
        ))
        ->add('answers', ChoiceType::class, array(
            'label' => 'Is it good?',
            'multiple' => false, 'expanded' => false,
            'choices'  => array('YES' => 'YES', 'NO' => 'NO',),
        ))
        ...
    }
    ->add('save', SubmitType::class);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Report::class,
    ));
}

我想做的是生成一个包含3个问题的表格,并将每个答案插入数据库中。
但是呈现的表单仅显示最后一个问题(因为每个-> add('answers',...)我都会替换最后一个添加的问题)。

我尝试了不同的解决方案来解决此问题:

  • 遵循How to Embed a Collection of Forms上的文档,其中包括将每个答案(带有问题标签)添加到Controller中的Report中,然后呈现ReportType。问题是我的每个问题都有不同的类型(选择,文本,整数...),我不知道如何分别自定义它们。
  • 我还尝试在ReportType中执行this,但它只显示最后添加的问题。

感谢您的帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用Entity-Attribute-Value模型来解决此问题。我建议使用sidus / eav-model-bundle。这将是很多工作,但您会学到很多。使用EAV模型,您可以有N个问题和答案。 我想不出使用简单的表单类型来解决这个问题。

答案 1 :(得分:0)

我设法使其正常运行。最后,我按照How to Embed a Collection of Forms上的说明进行操作。
为了使其正常工作,我在 Answer 实体中添加了 question questionType 字段。然后在 AnswerType.php 上,我每次都会检查问题的类型,然后根据该问题创建答案的类型。看起来像这样:

 $builder->addEventListener(FormEvents::POST_SET_DATA, function ($event) {
        $builder = $event->getForm();
        $answer = $event->getData();
        $questionType = $answer->getQuestionType();
        $question = $answer->getQuestion();
        if ($questionType == 1){
            $builder->add('answer', ChoiceType::class, array(
                'label' => $question,
                'multiple' => false, 'expanded' => false,
                'choices'  => array('OK' => 'OK', 'NG' => 'NG', 'NP' => 'NP',),
            ));
        }
        else if($questionType == 2){
            $builder->add('answer', ChoiceType::class, array(
                'label' => $question,
                'multiple' => false, 'expanded' => false,
                'choices'  => array('SI' => 'SI', 'NO' => 'NO',),
            ));
        }
       else ...
 }