В Symfony вы можете создать форму в форме, используя встроенные возможности Symfony Form Component и некоторые дополнительные функции.
Для создания формы в форме сначала вам необходимо создать два отдельных типа формы: внешний тип формы и внутренний тип формы.
Внутренний тип формы представляет собой форму, которая будет вложена в форму верхнего уровня. Вы можете создать его как обычный класс формы, расширив абстрактный класс AbstractType. Давайте представим, что у нас есть класс формы для формы верхнего уровня, которая имеет поле с вложенной формой:
use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; class InnerFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('field1') ->add('field2'); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ // опции вашей внутренней формы ]); } }
Затем вы должны создать внешний тип формы, который будет содержать поле, отображающее вложенную форму. Вы также можете создать его как класс формы, расширив абстрактный класс AbstractType:
use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class OuterFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('field3') ->add('inner_form', InnerFormType::class); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ // опции вашей внешней формы ]); } }
После создания типов формы вы можете использовать их в вашем контроллере для создания инстансов формы и отображения их:
use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentRoutingAnnotationRoute; class MyController extends AbstractController { /** * @Route("/my-route", name="my_route") */ public function myAction(Request $request) { $form = $this->createForm(OuterFormType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // обработка формы } return $this->render('my_template.html.twig', [ 'form' => $form->createView(), ]); } }
В шаблоне my_template.html.twig вы можете отобразить форму верхнего уровня и вложенную форму с помощью метода form_row:
{{ form_start(form) }} {{ form_row(form.field3) }} {{ form_row(form.inner_form.field1) }} {{ form_row(form.inner_form.field2) }} {{ form_rest(form) }} {{ form_end(form) }}
Это примерно то, как можно создать форму в форме в Symfony. Вы можете настроить типы формы и шаблоны отображения согласно вашим требованиям.