Symfony: Как создать форму опроса с ChoiceType?

Для создания формы опроса с типом выбора (ChoiceType) в Symfony вы должны выполнить несколько шагов.

1. Создайте сущность для представления опроса. Это можно сделать с помощью команды Symfony Console:

php bin/console make:entity Survey

Вы будете задавать вопросы опроса в качестве свойств этой сущности.

2. Задайте свойства опроса (например, question, options, answer). Они будут определять вопросы, варианты ответов и выбранный ответ в опросе.

3. Определите форму для сущности опроса. Для этого можно использовать класс формы Symfony:

// src/Form/SurveyType.php

namespace AppForm;

use AppEntitySurvey;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;

class SurveyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('question')
            ->add('options', ChoiceType::class, [
                'choices' => [
                    'Option 1' => 'option1',
                    'Option 2' => 'option2',
                    'Option 3' => 'option3',
                ],
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('answer'); // Ваш код может отличаться в зависимости от структуры вашей сущности опроса
    }

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

Здесь мы используем тип выбора (ChoiceType), чтобы предоставить пользователю возможность выбрать несколько опций из представленного списка. Флаги multiple и expanded установлены как true, чтобы позволить выбрать несколько опций и представить их в виде флажкового списка.

4. Создайте контроллер, который будет отображать форму опроса и обрабатывать ее:

// src/Controller/SurveyController.php

namespace AppController;

use AppEntitySurvey;
use AppFormSurveyType;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyBundleFrameworkBundleControllerAbstractController;

class SurveyController extends AbstractController
{
    /**
     * @Route("/survey/create", name="survey_create")
     */
    public function create(Request $request): Response
    {
        $survey = new Survey();
        $form = $this->createForm(SurveyType::class, $survey);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // Обработка данных опроса, например, сохранение в базе данных
            // $entityManager = $this->getDoctrine()->getManager();
            // $entityManager->persist($survey);
            // $entityManager->flush();

            return $this->redirectToRoute('survey_success');
        }

        return $this->render('survey/create.html.twig', [
            'form' => $form->createView(),
        ]);
    }

    /**
     * @Route("/survey/success", name="survey_success")
     */
    public function success(): Response
    {
        return $this->render('survey/success.html.twig');
    }
}

Здесь мы создаем экземпляр опроса и связываем его с формой SurveyType. В методе create() обрабатываем отправку формы и сохранение данных. Если форма прошла валидацию, то происходит редирект на страницу success.

5. Создайте шаблон для отображения формы опроса:

{# templates/survey/create.html.twig #}

{% extends 'base.html.twig' %}

{% block body %}
    <h1>Create Survey</h1>
    {{ form_start(form) }}
    {{ form_widget(form) }}
    <button type="submit">Submit</button>
    {{ form_end(form) }}
{% endblock %}

Это пример шаблона, который отображает форму опроса. В форме мы используем функции form_start(), form_widget(), form_end(), чтобы отобразить поля формы, кнопку отправки и закрыть форму. Форма имеет тип POST и действие также ссылаются на метод create контроллера SurveyController.

6. Создайте шаблон для страницы успешного создания опроса:

{# templates/survey/success.html.twig #}

{% extends 'base.html.twig' %}

{% block body %}
    <h1>Survey Created Successfully</h1>
{% endblock %}

Это простой шаблон для отображения страницы успешного создания опроса.

Теперь у вас есть форма опроса с типом выбора (ChoiceType) в Symfony. Вы можете настроить свойства формы опроса, добавить валидацию и дополнительные функции, в зависимости от ваших потребностей.