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

Событие PRE_SET_DATA

Событие PRE_SET_DATA возникает в форме до того, как данные будут установлены в поля через метод setData. Это событие позволяет подготовить или изменить данные, которые будут переданы в форму. Первым параметром слушатель получает объект события PreSetDataEvent, содержащий устанавливаемые данные и саму форму.

Синтаксис

use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); $form = $event->getForm(); });

Пример

Давайте создадим форму и подпишемся на событие PRE_SET_DATA, чтобы изменить устанавливаемые данные:

<?php namespace App\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('title', TextType::class); $builder->add('save', SubmitType::class); $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); if ($data === null) { return; } $data['title'] = strtoupper($data['title']); $event->setData($data); }); } } ?>

Пример

Давайте выведем данные до и после их изменения в событии:

<?php namespace App\Controller; use App\Form\ArticleType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_form')] public function form(): Response { $data = ['title' => 'abcde']; $form = $this->createForm(ArticleType::class, $data); return new Response($form->getData()['title']); } } ?>

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

"ABCDE"

Пример

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

<?php namespace App\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('title', TextType::class); $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $data = $event->getData(); $form = $event->getForm(); if ($data !== null && $data['title'] === 'article') { $form->add('views', IntegerType::class); } }); } } ?>

Если в форму передать массив ['title' => 'article'], то в форме появится дополнительное поле views. При другом значении title это поле добавлено не будет.

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

  • событие POST_SET_DATA,
    которое возникает после установки данных формы
  • событие PRE_SUBMIT,
    которое возникает до обработки отправленных данных
  • класс Form,
    который представляет форму и управляет её данными
  • метод setData,
    который устанавливает данные в форму
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить