У меня есть один суперкласс, который расширяется двумя сущностями. Суперкласс имеет отношение N: M с другим объектом. В формуле последнего мне нужно разделить два подтипа на исключение отдельных полей.
Это его метод FormType :: buildForm:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('options_subtype_1', 'entity', [
'class' => 'AcmeExampleBundle:Options',
'expanded' => true,
'multiple' => true,
'property_path'=> 'options',
'query_builder' => /* specific filter 1 */
])
->add('options_subtype_2', 'entity', [
'class' => 'AcmeExampleBundle:Options',
'expanded' => true,
'multiple' => true,
'property_path'=> 'options',
'query_builder' => /* specific filter 2 */
])
;
}
Однако при отправке формы параметры не сохраняются, за исключением случаев, когда я комментирую одно из двух полей выше (оставленное слева сохраняется). Я представляю обстановку property_path
к одному и тому же свойству из двух полей одной формы не работает.
Как мне этого добиться?
Я все еще ищу идеальное решение для себя. Сейчас я решаю подобные проблемы с отображением скрытого поля и события формы PRE_SUBMIT. Это может выглядеть как
FormType :: buildForm
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('options_subtype_1', 'entity', [
'class' => 'AcmeExampleBundle:Options',
'expanded' => true,
'multiple' => true,
'mapped'=> false,
'data' => $builder->getData()->getOptions(),
'query_builder' => /* specific filter 1 */
])
->add('options_subtype_2', 'entity', [
'class' => 'AcmeExampleBundle:Options',
'expanded' => true,
'multiple' => true,
'mapped' => false,
'data' => $builder->getData()->getOptions(),
'query_builder' => /* specific filter 2 */
])
->add('options', 'entity', [
'class' => 'AcmeExampleBundle:Options',
'required' => false,
'multiple' => true,
'attr' => ['style' => 'visibility: hidden;'],
'label' => false
]);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$data = $event->getData();
unset($data['options']);
$data['options'] = array_merge($data['options_subtype_1'], $data['options_subtype_2']);
$event->setData($data);
}
);
}
Других решений пока нет …