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

Метод addViewTransformer класса FormBuilder

Метод addViewTransformer класса FormBuilder добавляет view-преобразователь (view transformer) к полю формы. Первым параметром передаётся объект, реализующий интерфейс DataTransformerInterface. Этот преобразователь работает между нормализованными данными и данными, которые видит пользователь в поле формы. Метод возвращает сам объект FormBuilder, что позволяет строить цепочку вызовов.

View-преобразователь применяется после model-преобразователя. Он полезен, когда нужно показать значение в форме в одном формате, а хранить в модели - в другом. Например, хранить дату как объект DateTime, а в поле показывать строку 'Y-m-d'.

Синтаксис

<?php public function addViewTransformer(DataTransformerInterface $viewTransformer, bool $forcePrepend = false): static ?>

Первый параметр $viewTransformer - объект-преобразователь. Второй параметр $forcePrepend определяет, добавить преобразователь в начало или в конец цепочки. По умолчанию преобразователь добавляется в конец.

Пример

Давайте создадим простой view-преобразователь, который переводит строку в верхний регистр при отображении и обратно при отправке:

<?php namespace AppForm; use SymfonyComponentFormDataTransformerInterface; class UpperCaseTransformer implements DataTransformerInterface { public function transform(mixed $value): mixed { return strtoupper((string) $value); } public function reverseTransform(mixed $value): mixed { return strtolower((string) $value); } } ?>

Теперь добавим этот преобразователь к полю формы через метод addViewTransformer:

<?php namespace AppForm; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('title', null, [ 'label' => 'Article title', ]) ->get('title') ->addViewTransformer(new UpperCaseTransformer()); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => null, ]); } } ?>

Если в поле ввести 'abcde', то при отображении формы значение будет показано как 'ABCDE', а в модель попадёт строка в нижнем регистре 'abcde'.

Пример

Давайте рассмотрим более практичный пример - преобразование даты из объекта DateTime в строку для отображения в текстовом поле:

<?php namespace AppForm; use DateTime; use SymfonyComponentFormDataTransformerInterface; use SymfonyComponentFormExceptionTransformationFailedException; class DateToStringTransformer implements DataTransformerInterface { public function transform(mixed $value): mixed { if (null === $value) { return ''; } if (!$value instanceof DateTime) { throw new TransformationFailedException('Expected a DateTime object.'); } return $value->format('Y-m-d'); } public function reverseTransform(mixed $value): mixed { if (empty($value)) { return null; } $date = DateTime::createFromFormat('Y-m-d', $value); if (false === $date) { throw new TransformationFailedException('Invalid date format.'); } return $date; } } ?>

Подключим преобразователь к полю формы:

<?php namespace AppForm; use SymfonyComponentFormAbstractType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class ArticleType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('createdAt', null, [ 'label' => 'Created at', ]) ->get('createdAt') ->addViewTransformer(new DateToStringTransformer()); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => null, ]); } } ?>

В модель попадёт объект DateTime, а в поле формы пользователь увидит строку в формате '2024-01-15'.

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

  • класс FormBuilder,
    который строит форму и управляет её полями
  • метод add,
    который добавляет поле в форму
  • метод addModelTransformer,
    который добавляет model-преобразователь данных
  • метод get,
    который возвращает дочерний элемент формы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить