#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
Чтобы лучше понять внутренние текущие процессы, я счел полезным указать некоторые из задействованных переменных в определенных точках потока, поскольку, на мой взгляд, документации в этой области немного не хватает.