Question

J'essaie de créer une application basée sur l'API REST et AngularJS.J'ai suivi ce tutoriel http://npmasters.com/2012/11/25/Symfony2-Rest-FOSRestBundle.html mais je dois modifier certains détails (méthodes dépréciées) et en ce moment, lorsque je poste pour créer une nouvelle entité, j'obtiens l'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))
        ;
    }

pour le moment, à mon avis, je ne rends qu'un seul formulaire MAIS JE SUIS EN PHASE DE TEST:

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

{%block content %}

<div ng-view></div>

{{ form(form) }}

{% endblock %}

ET c'est le contrôleur REST qui est censé vider l'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,
 );
}

CHOSE ÉTRANGE: lorsque je mets le même code du contrôleur REST vers MainController, le formulaire est validé et la nouvelle entité est vidée, mais d'une manière ou d'une autre, le contrôleur REST génère une erreur...

Était-ce utile?

La solution

C'est parce que lorsque vous générez le formulaire, vous ajoutez des boutons Soumettre, mais lorsque vous les validez, vous n'êtes pas.Essayez:

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

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

Autres conseils

Si vous souhaitez que le validateur ignore les champs supplémentaires, vous devriez essayer de transmettre 'allow_extra_fields' => true en option pour FormBuilder.

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 de référence:

    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/dynamic_frokbook/form/dynamic_form_modification.html#cookbookbookbook-dynamic-form-Modification-Suppressing-Form-validation

Si vous ajoutez un seul bouton de soumission ou similaire, vous utilisez la solution Chausseur indiquée

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

Toutefois, dans le cas où vous utilisez une collectionType et incorporer un ensemble de sous-formulaires, vous devez inclure 'allec_add'=> true dans vos paramètres pour ce type.Par exemple, dans votre constructeur de formulaire d'entitéType:

$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'incorporation si vous avez plusieurs niveaux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top