Форма Symfony2.4 Ошибка «Эта форма не должна содержать дополнительных полей»

StackOverflow https://stackoverflow.com//questions/23018907

Вопрос

Я пытаюсь создать приложение на основе 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 выдает ошибку...

Это было полезно?

Решение

Это потому, что когда вы генерируете форму, вы добавляете кнопки «Отправить», но когда вы проверяете их, нет.попробуйте:

public function cpostAction(Request $request)
{
    $entity = new Task();
    $form = $this->createForm(new TaskType(), $entity)->add('submit','submit');
    ...
.

Кнопка «Отправка» технически является полем, даже если Symfony не сопоставляет его в свойство объекта по умолчанию.Поэтому, когда вы генерируете форму с кнопкой отправки, а затем отправьте эту форму, которую вы генерируете в вашем контроллере Validation, необходимо также иметь кнопку отправки.

Другие советы

Если вы хотите, чтобы валидатор игнорировал дополнительные поля, попробуйте передать 'allow_extra_fields' => true как опция FormBuilder.

Если вы хотите отключить проверку поля, вы должны добавить

public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection' => false,
        'validation_groups' => false,
    ));
}
.

и в методе создания формы:

    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#cookbook-dynamic-form-modification-supessing-form-validation

Если вы добавляете один кнопку PUMPTITTYPE или аналогичный, вы используете решение Chausser, указанный

$entity = new Task();
$form = $this->createForm(new TaskType(), $entity)->add('submit','SubmitType::class');
.

Однако, если вы используете CollectionType и встраивать набор Sub-форм, вам необходимо включить «allow_add»=> True в ваших параметрах для этого типа.Например, в вашем построителе формы Entitytype:

$builder->add('subEntities', CollectionType::class, array(
                'entry_type' => SubEntityType::class,
                'entry_options' => array('label' => false),
                'allow_add' => true,
            ))
.

Убедитесь, что вы сделаете это для всех уровней встраивания, если у вас есть несколько уровней.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top