Для сохранения формы, в которую встроена коллекция другой формы, в Symfony, вам потребуется выполнить несколько шагов.
1. Создайте основную форму, которая будет содержать коллекцию других форм. Для этого вам понадобится использовать класс CollectionType
, предоставляемый Symfony.
use SymfonyComponentFormExtensionCoreTypeCollectionType; use SymfonyComponentFormExtensionCoreTypeSubmitType; use SymfonyComponentFormExtensionCoreTypeTextType; // ... public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('collection', CollectionType::class, [ 'entry_type' => YourEmbeddedFormType::class, // Замените на ваш класс формы, который будет встроен в коллекцию 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ]) ->add('save', SubmitType::class, ['label' => 'Сохранить']); }
2. Создайте класс для встроенной формы (в данном примере назван YourEmbeddedFormType
), который будет содержать все необходимые поля для этой формы.
use SymfonyComponentFormAbstractType; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentFormFormBuilderInterface; // ... public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('field1', TextType::class) ->add('field2', TextType::class) // и так далее, добавьте все необходимые поля ; }
3. Создайте контроллер для обработки отправленной формы. Вам потребуется получить данные формы из запроса (Request
) и выполнить процедуру проверки и сохранения данных.
use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentRoutingAnnotationRoute; class YourController extends AbstractController { /** * @Route("/your-route", name="your_route") */ public function yourAction(Request $request) { $form = $this->createForm(YourMainFormType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); // Здесь можно выполнить сохранение данных или другие необходимые действия return $this->redirectToRoute('your_success_route'); } return $this->render('your_template.html.twig', [ 'form' => $form->createView(), ]); } }
4. Создайте шаблон для рендеринга формы (your_template.html.twig
), в котором вы можете отобразить форму с помощью переменной form
:
<form method="post" action="{{ path('your_route') }}"> {{ form_row(form.collection) }} <button type="submit">Сохранить</button> </form>
5. Создайте шаблон для успешного завершения действия (your_success_template.html.twig
), который будет отображаться после успешного сохранения данных, и содержит только информацию об успешном сохранении или переход на другую страницу, в зависимости от ваших требований.
<h1>Данные успешно сохранены!</h1>
Теперь у вас есть подробная инструкция по сохранению формы, в которую встроена коллекция других форм, с использованием Symfony. Вы можете настроить и доработать этот пример под свои требования, добавив или изменив поля формы и дополнив сохранением данных соответствующим образом.