web-dev-qa-db-fra.com

Erreur Symfony2.4 'Ce formulaire ne doit pas contenir de champs supplémentaires'

J'essaie de créer une application basée sur REST api ang AngularJS. J'ai suivi ce tutoriel http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html mais je dois changer certains détails (méthodes dépréciées) et dès que je poste pour créer nouvelle entité que je reçois erreur «Ce formulaire ne doit pas contenir de champs supplémentaires».

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(),
                )
        );
    }
}

mon formulaire 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))
        ;
    }

actuellement, à mon avis, je ne remplis qu'une seule forme MAIS JE SUIS AU STADE DU TEST:

{%extends 'MyBundle::layout.html.twig' %}

{%block content %}

<div ng-view></div>

{{ form(form) }}

{% endblock %}

ET c'est le contrôleur REST qui est supposé vider une entité donnée:

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,
 );
}

WEIRD THING: lorsque je mets le même code du contrôleur REST à MainController, le formulaire est validé et la nouvelle entité est vidée, mais le contrôleur REST génère une erreur ...

11
mmmm

C'est parce que lorsque vous générez le formulaire, vous ajoutez des boutons d'envoi, mais vous ne les validez pas. essayer:

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

Le bouton d'envoi est techniquement un champ même si symfony ne le mappera pas par défaut à une propriété d'entité. Ainsi, lorsque vous générez le formulaire avec un bouton d'envoi, puis que vous le soumettez, le formulaire que vous générez dans votre action de contrôleur de validation doit également comporter un bouton d'envoi.

16
Chase

Si vous souhaitez que le validateur ignore des champs supplémentaires, essayez de transmettre 'allow_extra_fields' => true en tant qu'option au FormBuilder.

22
Rudiger

Si vous voulez désactiver la validation des champs, vous devez ajouter

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

Et dans la méthode 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')
                .
                .
                .
    } 

Pour plus de détails: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-dynamic-form-modification-suppressing-form-validation

3
Dapter20

Si vous ajoutez un seul bouton SubmitType ou similaire, vous utilisez la solution Chausser indiquée. 

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

Toutefois, si vous utilisez un TypeType et incorporez un ensemble de sous-formulaires, vous devez inclure 'allow_add' => true dans vos paramètres pour ce type. Par exemple, dans votre générateur de formulaire EntityType:

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

Assurez-vous de le faire pour tous les niveaux d'intégration si vous avez plusieurs niveaux.

1
tlarson