Формы Symfony: как отобразить только одно из полей встроенного типа формы

#symfony #symfony-forms

#symfony #symfony-forms

Вопрос:

Я пытаюсь разработать форму, которая позже будет использоваться в качестве базовой формы для специализированных вариантов. Таким образом, он будет иметь inherit_data => true . Кроме того, он сопоставляется с базовым классом данных.

В этой базовой форме я также использую пользовательский тип формы, который имеет несколько полей. Вот где я сейчас застрял. Я хочу, чтобы только одно из полей пользовательского внутреннего типа формы отображалось обратно в фактическую базовую форму, чтобы сопоставление с базовым классом данных можно было выполнить правильно.

Я попытаюсь показать это с помощью некоторых упрощенных классов, которые, надеюсь, передают то, что я хочу:

 class BaseFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('unproblematicProperty')
            ->add('myProblematicProperty', InnerFormType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'inherit_data' => true,
            'data_class' => BaseDataClass::class,
        ]);
    }
}
  

Затем некоторый InnerFormType:

 class InnerFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('shouldBeMappedToMyProblematicProperty')
            ->add('shouldntBeMapped1')
            ->add('shouldntBeMapped2')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
        ]);
    }
}
  

Цель состоит в том, чтобы экземпляр класса данных мог быть создан правильно, и мне не нужно было создавать части
BaseFormType без сопоставления, даже если они содержат фактические данные для создаваемых объектов. Т.е. я не хочу, чтобы часть гидратации объекта выполнялась путем привязки типа формы ккласс данных и его часть вручную в контроллере.

Итак, как я могу добиться прямого «обратного сопоставления» значения из shouldBeMappedToMyProblematicProperty в myProblematicProperty?

Если вопрос нуждается в улучшении или дополнительной информации, я сделаю все возможное, чтобы отредактировать его соответствующим образом.

Ответ №1:

Как я выяснил, это может быть элегантно достигнуто путем реализации DataMapperInterface в InnerFormType .

Контракт заключается в реализации двух методов:

  • mapDataToForms($ViewData, повторяющиеся $forms)
  • mapFormsToData(повторяющиеся $forms, amp;$ViewData)

Обратите внимание, что если вам нужно изменить представление ваших данных (в моем случае, например, перенос строк в UnicodeStrings и наоборот), DataMapper не подходит для этого.

Для этого используйте DataTransformers (реализовать DataTransformer Interface).

Обратите внимание, что при получении метода отображения данных mapDataToForms вызывается перед преобразованием DataTransformers, в то время как при отправке формы reverseTransform DataTransformer вызывается перед mapFormsToData DataMapper.

Смотрите также: https://symfony.com/doc/current/form/data_mappers.html

Чтобы лучше понять внутренние текущие процессы, я счел полезным указать некоторые из задействованных переменных в определенных точках потока, поскольку, на мой взгляд, документации в этой области немного не хватает.