Одно и то же поле несколько раз Форма Symfony 4

У меня есть Entity Отчет, который содержит много Ответы.

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

class Answer
{

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

Я вручную добавляю вопросы в свой Тип отчета (я знаю, что это не лучший подход, но вопросы никогда не изменятся, и меня интересуют только ответы).

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 вопросами и вставило каждый из ответов в базу данных. Но визуализированная форма показывает только последний вопрос (потому что с каждым -> добавить ('ответы', ...) я заменяю последний добавленный).

Я пробовал разные решения, чтобы решить эту проблему:

  • Следуя документации по Как встроить коллекцию форм, которая заключается в добавлении каждого ответа (с меткой вопроса) в Отчет в Контроллере и последующем рендеринге ReportType. Проблема в том, что каждый из моих вопросов имеет разный тип (выбор, текст, целое число ...), и я не знаю, как настроить их индивидуально.
  • И я также попытался сделать это в моем ReportType, но он показывает только последний добавленный вопрос.

Я ценю любую помощь, спасибо!

JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
0
0
872
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать модель Entity – Attribute – Value для решения этой проблемы. Я бы посоветовал использовать sidus / eav-model-bundle. Это будет большая работа, но вы многому научитесь. Используя модель EAV, у вас может быть N вопросов и ответов. Я не могу думать о решении этой проблемы с помощью простых типов форм.

Ответ принят как подходящий

Мне удалось заставить его работать. В итоге я выполнил инструкцию на Как встроить коллекцию форм.
Чтобы заставить его работать, я добавил поля вопрос и тип вопроса в свою сущность Отвечать. И на 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 ...
 }

Другие вопросы по теме