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

Правило Compound

Правило Compound применяется к форме или к отдельному полю формы и указывает, что данный элемент является составным. Составная форма может содержать внутри себя другие поля, которые добавляются через метод add. По умолчанию в Symfony все формы являются составными, поэтому правило Compound чаще всего используется для того, чтобы явно включить или отключить это поведение. Если передать значение false, поле перестаёт быть составным и не может содержать дочерние элементы. Правило удобно применять в типах форм, которые описываются через классы-наследники AbstractType.

Синтаксис

use Symfony\Component\Form\Extension\Core\Type\TextType; $builder->add('title', TextType::class, [ 'compound' => true, ]);

Пример

Давайте создадим составное поле address, внутри которого будут находиться поля street и city:

<?php namespace App\Form; use Symfony\Component\Form\AbstractType; 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('address', null, [ 'compound' => true, ]); $builder->get('address')->add('street', TextType::class); $builder->get('address')->add('city', TextType::class); } } ?>

Пример

Давайте отключим составность поля title, чтобы оно не могло содержать дочерние элементы:

<?php namespace App\Form; use Symfony\Component\Form\AbstractType; 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('title', TextType::class, [ 'compound' => false, ]); } } ?>

Результат выполнения кода при попытке добавить дочернее поле:

"Unable to add form to a non-compound form."

Пример

Давайте обработаем составную форму в контроллере и выведем данные дочерних полей через getData:

<?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); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $address = $form->get('address')->getData(); return new Response($address['street'] . ' ' . $address['city']); } return $this->render('article/index.html.twig', [ 'form' => $form->createView(), ]); } } ?>

Результат выполнения кода для полей 'abcde' и 'hello':

abcde hello

Пример

Давайте выведем составное поле в Twig-шаблоне через функцию form_row:

{{ form_start(form) }} {{ form_row(form.title) }} {{ form_row(form.address.street) }} {{ form_row(form.address.city) }} {{ form_end(form) }}

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

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