Форма Symfony2.4 "Эта форма не должна содержать лишних полей" ошибка
Я пытаюсь создать приложение на основе REST API и AngularJS. Я следовал этому руководству http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html но мне пришлось изменить некоторые детали (устаревшие методы), и прямо сейчас, когда я публикую для создания новой сущности, я получаю Эта форма не должна содержать лишних полей.
class MainController extends Controller
{
public function indexAction(Request $request)
{
$form = $this->createForm(new TaskType(),null,array('action' => $this->generateUrl('post_tasks').'.json'))
->add('submit','submit');
$note_form = $this->createForm(new NoteType())
->add('submit','submit');
return $this->render('MyBundle:Main:index.html.twig',
array(
'form'=>$form->createView(),
'note_form'=>$note_form->createView(),
)
);
}
}
моя форма TaskType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('timeStart','datetime',array(
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'date_format' => 'yyyy-MM-dd',
'data' => new \DateTime('now')
))
->add('timeStop','datetime',array(
'date_widget' => 'single_text',
'time_widget' => 'single_text',
'date_format' => 'yyyy-MM-dd',
'data' => new \DateTime('now')
))
->add('project')
->add('descriptionTask')
->add('isCompleted',null,array('required' => false))
->add('isVisible',null,array('required' => false))
;
}
Прямо сейчас, на мой взгляд, я отрисовываю только одну форму, НО Я НА ЭТАПЕ ТЕСТИРОВАНИЯ:
{%extends 'MyBundle::layout.html.twig' %}
{%block content %}
<div ng-view></div>
{{ form(form) }}
{% endblock %}
И это контроллер REST, который должен очищать данную сущность:
public function cpostAction(Request $request)
{
$entity = new Task();
$form = $this->createForm(new TaskType(), $entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirectView(
$this->generateUrl(
'get_organisation',
array('id' => $entity->getId())
),
Codes::HTTP_CREATED
);
}
return array(
'form' => $form,
);
}
Странная вещь: когда я помещаю тот же код из контроллера REST в MainController, то форма проверяется и новая сущность сбрасывается, но каким-то образом контроллер REST выдает ошибку...
4 ответа
Это потому, что когда вы генерируете форму, вы добавляете кнопки отправки, а когда вы проверяете их, это не так. пытаться:
public function cpostAction(Request $request)
{
$entity = new Task();
$form = $this->createForm(new TaskType(), $entity)->add('submit','submit');
...
Кнопка отправки технически является полем, хотя symfony по умолчанию не отображает ее в свойстве объекта. Поэтому, когда вы генерируете форму с помощью кнопки отправки, а затем отправляете эту форму, форма, которую вы генерируете в действии контроллера проверки, также должна иметь кнопку отправки.
Если вы хотите, чтобы валидатор игнорировал дополнительные поля, попробуйте передать 'allow_extra_fields' => true
как вариант для FormBuilder.
Работа в Symfony 4/5 в CustomFormType
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => CustomFormType::class,
'allow_extra_fields' => true // <<<<<<<<<<<<<<<<<<<<<
]);
}
Если вы хотите отключить проверку полей, вы должны добавить
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
'validation_groups' => false,
));
}
И в методе buildForm:
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
$event->stopPropagation();
}, 900);
$builder->add('field1','text')
->add('field2','text')
.
.
.
}
Для получения дополнительной информации: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html
Если вы добавляете одну кнопку SubmitType или аналогичную, вы используете решение, указанное Chausser
$entity = new Task();
$form = $this->createForm(new TaskType(), $entity)->add('submit','SubmitType::class');
Однако, если вы используете CollectionType и встраиваете набор подформ, вам необходимо включить в ваши параметры 'allow_add' => true для этого типа. Например, в вашем конструкторе форм EntityType:
$builder->add('subEntities', CollectionType::class, array(
'entry_type' => SubEntityType::class,
'entry_options' => array('label' => false),
'allow_add' => true,
))
Убедитесь, что вы делаете это для всех уровней встраивания, если у вас есть несколько уровней.