Symfony 2 формирует дополнительные поля
Я меняю некоторые поля с помощью AJAX, и когда я пытаюсь сохранить форму, я получаю ошибку, которая Extra fields are not allowed
.
Как изменить это свойство валидатора, например validatorPass()
в sf1.4?
Или его возможное изменение в форме для принятия дополнительных полей?
Я использую SonataAdminBundle для создания форм.
3 answers
Вы можете удалить дополнительные поля из данных запроса, прежде чем привязывать их к форме:
// The JSON PUT data will include all attributes in the entity, even
// those that are not updateable by the user and are not in the form.
// We need to remove these extra fields or we will get a
// "This form should not contain extra fields" Form Error
$data = $request->request->all();
$children = $form->all();
$data = array_intersect_key($data, $children);
$form->bind($data);
В моем случае решение было действительно простым, просто добавьте allow_add в поле вашей коллекции, ниже моего примера
->add('Details', 'collection', array(
'type' => new DetailsType(),
'allow_add' => true,
'allow_delete' => true,
'label' => ' '
))
Вы также можете ознакомиться с официальной документацией по этому вопросу http://symfony.com/doc/current/cookbook/form/form_collections.html
Первое, что вам нужно сделать, это сообщить коллекции форм, что она получит неизвестное количество тегов. До сих пор вы добавили два тега, и тип формы ожидает получить ровно два, в противном случае будет выдана ошибка: Эта форма не должна содержать дополнительных полей. Чтобы сделать это гибким, добавьте параметр allow_add в поле коллекции.
Вы не можете добавлять дополнительные поля, так как они не объявлены в сущности. Существует решение, позволяющее обойти вашу проблему:
- создайте динамическую форму, в которую можно добавлять дополнительные поля.
У вас есть пример того, как это работает на github: https://github.com/Keirua/KeiruaProdCustomerDemoBundle
И полный учебник по этому адресу (но в Французский):
Http://blog.keiruaprod.fr/2012/01/18/formulaires-dynamiques-avec-symfony2/
PS: Похоже, Соната использует этот способ для добавления полей.