В Symfony, динамическое добавление полей в форму можно реализовать с помощью форматера коллекции ("collection" field type). Этот форматер позволяет сгенерировать динамическое количество полей на основе заданного прототипа.
Для начала, создайте класс формы, используя FormBuilderInterface
, и определите нужные поля. Для динамического добавления полей, определите поле коллекции, которое будет использоваться в качестве контейнера для новых полей. Параметр "entry_type" определяет прототип поля, которое будет использовано для каждого добавленного элемента. Например:
use SymfonyComponentFormExtensionCoreTypeCollectionType; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; class MyFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('dynamicFields', CollectionType::class, [ 'entry_type' => TextType::class, 'allow_add' => true, 'allow_delete' => true, 'by_reference' => false, ]); } }
В приведенном выше примере, dynamicFields
- это поле коллекции, а TextType::class
- это прототип поля, который будет использован для каждого добавленного элемента.
Теперь, в контроллере, создайте экземпляр класса формы и передайте его в функцию createView()
. Затем передайте результат функции handleRequest()
для обработки данных из запроса:
use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationRequest; class MyController extends AbstractController { public function myAction(Request $request) { $form = $this->createForm(MyFormType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // Обработка данных формы } return $this->render('my_template.html.twig', [ 'form' => $form->createView(), ]); } }
На шаблоне my_template.html.twig
вы можете отобразить форму с помощью функции form()
:
{{ form(form) }}
Теперь, на странице отображаются вводимые поля, а пользователь может динамически добавлять или удалять их с помощью кнопок "Add" и "Remove".
Примечание: для правильной и безопасной обработки данных с помощью коллекции полей в Symfony, необходимо использовать JavaScript-библиотеку, такую как jQuery, для добавления и удаления полей динамически на фронтенде. Это гарантирует, что данные формы будут отправлены корректно.