РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
335 of 1361 menu

Правило Collection

Правило Collection вешается на поле формы, значением которого является массив. Оно создаёт для каждого элемента массива вложенную форму по заданному типу. Первым параметром передаётся тип вложенной формы, параметром allow_add разрешается добавление новых элементов, а параметром allow_delete - удаление существующих.

Синтаксис

use Symfony\Component\Form\Extension\Core\Type\CollectionType; $builder->add('items', CollectionType::class, [ 'entry_type' => TextType::class, 'allow_add' => true, 'allow_delete' => true, ]);

Пример

Давайте создадим форму с полем items, которое является коллекцией текстовых полей:

<?php namespace App\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('items', CollectionType::class, [ 'entry_type' => TextType::class, 'allow_add' => true, 'allow_delete' => true, ]); } } ?>

Теперь создадим контроллер, который инициализирует форму массивом значений и выводит результат:

<?php namespace App\Controller; use App\Form\ArticleType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class ArticleController extends AbstractController { public function index(Request $request): Response { $form = $this->createForm(ArticleType::class, [ 'items' => ['abcde', 'article', 'user'], ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $res = $form->getData(); return new Response(json_encode($res)); } return $this->render('article/index.html.twig', [ 'form' => $form->createView(), ]); } } ?>

Отрисуем форму в Twig-шаблоне:

{{ form_start(form) }} {{ form_widget(form) }} <button type="submit">Send</button> {{ form_end(form) }}

Результат выполнения кода после отправки формы:

{"items":["abcde","article","user"]}

Пример

Давайте добавим к коллекции параметр prototype, чтобы можно было добавлять новые элементы через JavaScript:

<?php namespace App\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('items', CollectionType::class, [ 'entry_type' => TextType::class, 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, ]); } } ?>

Теперь в Twig-шаблоне можно получить шаблон нового элемента через переменную prototype:

{{ form_start(form) }} <ul id="items-list"> {% for item in form.items %} <li>{{ form_row(item) }}</li> {% endfor %} </ul> <button type="button" id="add-item">Add</button> <button type="submit">Send</button> <span id="prototype" data-prototype="{{ form_widget(form.items.vars.prototype)|e }}"></span> {{ form_end(form) }}

Результат выполнения кода для массива ['abcde', 'article']:

<ul id="items-list"> <li><input type="text" name="article[items][0]" value="abcde"></li> <li><input type="text" name="article[items][1]" value="article"></li> </ul>

Смотрите также

  • тип CollectionType,
    который создаёт коллекцию полей формы
  • метод add,
    который добавляет поле в форму
  • метод getData,
    который возвращает данные формы
  • метод createView,
    который создаёт представление формы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить