Правило 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,
который создаёт представление формы