Правило 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,
который строит структуру формы