IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Formulaire Symfony2 Collection [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut Formulaire Symfony2 Collection
    Bonjour,

    Je sais que des questions similaires ont déjà été posé mais je n'ai pas trouvé de réponse.
    Ma structure :
    Une classe qui contient des horaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Personne
    {
       /**
        * @ORM\ManyToMany(targetEntity="Horaire", cascade={"persist"})
        */
        protected $horaires;
    }
    Classe horaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    class Horaire
    {
        /**
         * @ORM\Column(type="integer")
         */
        private $jourSemaine;
     
       /**
         * @ORM\Column(type="time", nullable="true")
         */
        private $ouverture;
     
        /**
         * @ORM\Column(type="time", nullable="true") 
         */
        private $fermeture;
    }
    Avec les formulaires appropriés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    class PersonneForm extends AbstractType 
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
          $builder->add('horaires', 'collection', array('type' => new HoraireForm(),
                                                                   'prototype' => false,
                                                                   'allow_add' => false));
        }
    }
     
    class HoraireForm extends AbstractType 
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('jourSemaine', 'hidden');
            $builder->add('ouverture', 'time', array('widget' => 'single_text',
                                                     'input' => 'string',
                                                     'required' => false));
            $builder->add('fermeture', 'time', array('widget' => 'single_text',
                                                     'input' => 'string',
                                                     'required' => false));
        }
    }
    Jusqu'ici rien de compliquer.
    Lors de l'instanciation du formulaire, la classe Personne contient un array de 14 Horaire (pour faire les jours de le semaine).
    Le formulaire est bien instancié.

    Le problème arrive au moment de la validation du formulaire : "This form should not contain extra fields".

    Le bind du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $request = Request::createFromGlobals();
    $personne = new Personne();
    $form = $this->get('form.factory')->create(new PersonneForm(), $personne);
    $form->bindRequest($request);
    if($form->isValid())
    ...
    Le problème vient du champs horaires, si je le retire le formulaire est bien validé, sinon il n'est pas validé.

    Pour l'affichage du formulaire j'utilise twig et j'affiche horaire avec form_widget.

    J'ai essaye de ne laisser que la propriété jourSemaine dans le formulaire des horaires, cela ne change rien.

    J'ai fais un var_dump de $_GET pour vérifier les informations passé, il y a bien mes 14 Horaire dans un array 'horaires'.

    Si vous avez une idée du problème ?
    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Dans ta collection de HoraireForm tu as mis "allow_add" à false
    et dans ton controlleur tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $personne = new Personne();
    $form = $this->get('form.factory')->create(new PersonneForm(), $personne);
    $form->bindRequest($request);
    if($form->isValid())
    donc à quel moment sont créés les 14 horaires dont tu parles? dans le constructeur?

    Je pense que tu n'utilises pas le même traitement pour l'affichage du formulaire et sa validation. Donc à la validation on se retrouve bien avec un objet personne mais sans horaire, et comme l'option allow_add est à false, rien n'est bindé avec la requete utilisateur.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    Les horaires sont crées avant.
    Elles sont affichées dans la visualisation du formulaire.

    J'ai mis allow_add à false mais même sans cela ne change rien.
    Je peux t'envoyer le retour du var_dump($_GET) si tu veux.

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Les horaires sont crées avant.
    Elles sont affichées dans la visualisation du formulaire.
    oui ils sont "crées" avant et bien affiché dans ton formulaire, mais lorsque tu valides celui-ci, tu renvois sur le code du controller que tu as montré, donc avec un new Personne, et pas d'horaires.
    le formulaire ne s'attend donc pas à avoir des horaires pour l'entité Personne.

    J'ai mis allow_add à false mais même sans cela ne change rien.
    Tu optiens le même résultat en mettant allow_add à true ?

    la valeur de allow_add est false par défaut.
    http://symfony.com/doc/current/refer...html#allow-add

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Je peux t'envoyer le retour du var_dump($_GET) si tu veux.
    ça parait plus logique de transmettre ces données par post

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 21
    Par défaut
    oui ils sont "crées" avant et bien affiché dans ton formulaire, mais lorsque tu valides celui-ci, tu renvois sur le code du controller que tu as montré, donc avec un new Personne, et pas d'horaires.
    le formulaire ne s'attend donc pas à avoir des horaires pour l'entité Personne.
    Je vais essayer ça tout de suite, c'est possible que ça soit le problème.
    Je te tiens au courant.

    Bon bah merci beaucoup, je pensais que le allow_add était pour empêcher d'ajouter une entité "en plus" dans la collection que celle déjà présente.

  6. #6
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2014
    Messages : 46
    Par défaut Retourner à la vue un résultat trié
    Bonjour, je veux retourner à ma vue un résultat trié par date voilà mon code dans le contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public function indexAction()
        {
            $em = $this->getDoctrine()->getManager();
     
            $entities = $em->getRepository('TrituxGrhBundle:CV')->findAll();
     
            return array(
                'entities' => $entities
            );
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Formulaire de collection entités
    Par albacore dans le forum Symfony
    Réponses: 1
    Dernier message: 09/09/2011, 10h50
  2. [AC-2007] envoi de formulaire pour collecte de données
    Par Alain7751 dans le forum IHM
    Réponses: 1
    Dernier message: 31/07/2009, 14h49
  3. Session Formulaire et Collection
    Par Snyper dans le forum Struts 1
    Réponses: 7
    Dernier message: 05/04/2009, 12h56
  4. [Spring MVC] Problème formulaire avec Collection
    Par arN34 dans le forum Spring Web
    Réponses: 1
    Dernier message: 16/09/2006, 13h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo