Форма Symfony2: выберите объект или добавьте новый
У меня есть объект order
и client
.
Мне интересно, возможно ли с помощью системы форм Symfony2 создать форму заказа, которая позволит:
- Выберите несколько клиентов из раскрывающегося списка (сочетание форм
collection
и entity
)
- И создавать новые клиенты "на лету" (по умолчанию для типа
collection
), если нет в раскрывающемся списке.
Я видел способ сделать это, создав несколько форм на одной странице, но это не так, как хотелось бы.
Есть ли лучшие способы сделать это?
Ответы
Ответ 1
У меня была аналогичная проблема, которая может привести к вашему решению:
У меня есть отношение "Категория и элемент" ( "Много-к-одному" ), и я хотел либо выбрать существующий элемент, либо создать новый элемент.
В моем классе Form:
$builder->add('item', 'entity', array(
'label' => 'Item',
'class' => 'ExampleItemBundle:Item',
));
$builder->add('itemNew', new EmbedItemForm(), array(
'required' => FALSE,
'mapped' => FALSE,
'property_path' => 'item',
));
$builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {
$data = $event->getData();
$form = $event->getForm();
if (!empty($data['itemNew']['name'])) {
$form->remove('item');
$form->add('itemNew', new EmbedItemForm(), array(
'required' => TRUE,
'mapped' => TRUE,
'property_path' => 'item',
));
}
});
Ответ 2
Вы можете сопоставить два поля в форме с тем же свойством, используя опцию property_path
. Затем, используя события формы, используйте представленные данные, чтобы принять решение и изменить форму, чтобы только одно из полей имеет параметр mapped
, который true
.
Ответ 3
Если я понял, вы хотите создать и хранить новых клиентов в форме "на лету", на данный момент. Я думаю, что вы должны сделать это с помощью JavaScript и установить дополнительные действия в своем контроллере.
- JS → Захват события для добавления нового клиента в вашу базу данных (т.е. "Добавить новое" событие нажатия кнопки)
- JS → Внутри этого события вызовите через AJAX ваш контроллер со значениями нового клиента. (Использование FOSJsRoutingBundle легко сделать)
- Symfony2 → Внутри вашего нового действия сохраните нового клиента в своей базе данных.
- JS → Событие OnSuccess, в вашем вызове AJAX, добавьте нового клиента в DropDownBox
(ddb.append(новый тег элемента)
Просто сделав это, ваш новый клиент будет сохранен в базе данных и добавлен в ваш dropdownbox
Ответ 4
Со своей стороны у меня была такая же проблема, и я решил ее, создав 2 атрибута в formType
;
Например, для вас это будет:
customer->entity
new_customer-> collection
В вашем файле сущности вашего заказа вам нужно будет добавить 3 метода (getter, setter и remover), getter и remover ничего не делают, но setter должен вызвать setCustomer(c)
Я не уверен, что это лучший способ, но это единственный способ понять это!
Ответ 5
Тип формы collection
позволяет добавлять и удалять на лету с атрибутами allow_add
и allow_delete
.
Дополнительная информация, следуя этим двум ссылкам:
Если вам не нравится получать дополнительные формы на одной странице, вы можете интегрировать их в диалоговые окна... Но вам определенно нужна форма для создания новых элементов...