объединить формы (предпочтительно)
Предполагая, что у вас есть две сущности Vendor
и Address
и формы для этих сущностей VendorType
и AddressType
, вы можете создать тип формы VendorAddressType
, который в качестве функции buildForm
имеет
$builder->add('vendor', VendorType::class)
->add('address', AddressType::class);
и при создании формы VendorAddressType
вы предоставляете массив ['vendor' => $vendor, 'address' => $address]
. (вы можете аналогичным образом передавать опции в подформы). Параметр data_class
для каждой подчиненной формы может быть соответствующим классом, параметр data_class
для комбинированной формы должен быть null
.
теперь, в обычных шаблонах форм Symfony, эти формы отображаются иначе, чем на самом деле в одной форме, но эти шаблоны могут быть расширены, так что вместо form_row
s вы вызываете form_widget
для form.vendor
и form.address
вместо (см. https://symfony.com/doc/current/form/form_themes.html#creating-a-form-theme-in-the-same-template-as-the-form)
объединить формы буквально (не предпочтительно)
То же предположение, что и раньше, вы можете скопировать содержимое каждого типа формы в новую форму VendorAddress, а затем установить атрибут property_path
для всех полей, чтобы они указывали на соответствующие объекты, например:
$builder->add('vendorfieldA', SomeType::class, ['property_path' => 'vendor.fieldA'])
, который будет смотреть в предоставленном массиве данных (см. Выше) на ключ vendor
и выбирать его свойство fieldA
.
Я бы не советовал этому подходу, поскольку любые изменения в формах с одним объектом должны повторяться для форм с несколькими объектами. Вместо этого я бы посоветовал создавать статические функции buildForm (добавляя параметр prefix
или что-то в этом роде), которые можно вызывать из комбинированного типа формы через VendorType::staticBuildForm($builder, $prefix)
($prefix = 'vendor.'
). (вы должны преобразовать этот префикс в нечто, что вы также можете добавить / добавить к имени поля формы или указать это явно)