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 :

Bind d'un formulaire [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut Bind d'un formulaire
    Bonjour,
    Encore un petit problème dont je voudrais vous faire part
    Dans la classe de mon formulaire, j'ai un champ qui me permet de sélectionner un TypeMedia.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $builder
        .....
        ->add('type', 'entity', array(
                'class' => 'MyBundle:TypeMedia',
                'property' => 'nom',
                'query_builder' => function(EntityRepository $er) use($lisible) {
                                    return $er->createQueryBuilder('dc')
                                    ->where("dc.lisible = :lis")
                                    ->setParameter('lis', $lisible)
                                    ->orderBy('dc.nom', 'ASC');
                                },
            )
    Le formulaire est bien rendu, les choix proposés correspondent bien au booléen $lisible que je fournis à la fonction. Par contre, lorsque je soumets le formulaire, lors du bind, tous les champs sont bien acceptés à l'exception de celui-ci. J'ai un peu cherché dans le code et je pense comprendre que dans le bind (plus exactement lorsque la fonction 'getEntitiesByIds' est appelée, la requête ne retourne aucun enregistrement car la variable '$lisible' n'est semble-t-il plus transmise. La clause where se retrouve simplement avec 'where("dc.lisible = :lis")' sans que le paramètre 'lis' soit initialisé. Pour preuve, si je remplace le code ci-dessus par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    return $er->createQueryBuilder('dc')
                  ->where("dc.lisible = '1'")       // :lis est à '1' dans l'exemple au-dessus.
                  ->orderBy('dc.nom', 'ASC');
    je n'ai plus de problème et le formulaire en entier est accepté. Comment procéder pour que la requête lors du bind soit correcte ?
    Merci de votre attention.

    Cordialement,
    Jean-Pierre.

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Bonjour,

    Ou est récupéré ce $lisible ?

    Si c'est dans le controller, il faut que tu le passe en argument sans dans le constructeur du formulaire soit dans les options. C'est normalement plus propre dans le constructeur.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Merci Stephan,
    Je le passe dans les options de la création du formulaire dans mon contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $form = $this->createForm(new MediaType(), $un_media,
                                                 array('url' => $url,
                                                        'em' => $em,
                                                    'lisible' => $lisible
                                                 )
                          );
    Je le récupère ainsi dans la fonction buildForm de la classe du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $lisible = $options['lisible'];
            .....
    Je pense que c'est correct, non ?

    Cordialement,
    Jean-Pierre

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Personne pour me donner une petite piste ?

    Cordialement,
    Jean-Pierre.

  5. #5
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    peux tu poster le code complet de l action ?

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Volontiers Stephan, si cela peut aider
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public function addAction($type)
    {
        $request = $this->get('request');
        $un_media = new Media(); 
     
        $lisible = ($type == 'livre') ? 1 : 0;
        $url = $this->get('router')->generate('_list_auteurs', array(), true);
        $em = $this->getDoctrine()->getEntityManager();
     
        $form = $this->createForm(new MediaType(), $un_media,
                array('url' => $url,
                        'em' => $em,
                        'lisible' => $lisible
                )
        );
     
        if ('POST' == $request->getMethod()) { // Si on a posté le formulaire
             $form->bind($request);
     
             if ($form->isValid()) { 
                 $em = $this->getDoctrine()->getEntityManager();
                 $un_media = $form->getData();
                 $em->persist($un_media);
                 $em->flush();
     
                 return new RedirectResponse($this->generateUrl('_welcome'));
             }
        }
     
        return $this->render('MyBundle:Media:add.html.twig',
                                      array('form' => $form->createView(),
                                               'un_media' => $un_media,
                                               'type' => $type
                                      ));
    }
    Cordialement,
    Jean-Pierre

  7. #7
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Je pense que tu fais une erreur de compréhension.

    La méthode bind récupère les données dans envoyées en post dans la request et essaye de calquer à ton objet.

    Donc je ne pense que $lisible soit un élément de ton objet.

    Post l'objet Media pour voir.

    Tu peux aussi utiliser la méthode var_dump() pour voir ce que remonte les objets request bind et autres.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    Merci Stephan pour t'être penché sur mon problème. Mon objet Media contient un attribut TypeMedia qui indique le type du media (Livre, livre numérique, DIVX, DVD, etc..). J'ai voulu différencier les medias 'lisible' (Livre, revue, etc.) des videos. Effectivement, je n'ai pas mis d'attribut dans ma classe pour signaler ce fait. Il serait en effet plus logique que je place un attribut 'lisible' dans ma classe TypeMedia.
    J'ai décortiqué un peu déjà avec var_dump et ce que j'ai remarqué, c'est que lors du bind, les champs du formulaire sont 'validé' pour vérifier qu'ils correspondent à ce qu'attend l'objet. Une requête est effectuée pour essayer de trouver l'identifiant lu dans le champ TypeMedia, mais la variable 'lisible' n'est pas transmise à cette requête et donc le paramètre :lis de la requête est mis à 0. L'identifiant fourni par le formulaire n'est donc pas trouvé dans le résultat de la requête et mon champ est mis à null. Si je sélectionne un type 'vidéo' (lisible = 0), le champ est correctement transmis à l'objet Media et l'enregistrement s'effectue dans ma base.
    Je continue mes recherches et je fais un point dans la soirée.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 80
    Points : 58
    Points
    58
    Par défaut
    J'ai compris ! Je n'étais pas du tout sur la bonne piste ! Lorsque je crée mon formulaire (function addAction($type)), ma variable $type est correctement positionnée. Par contre, lorsque je le valide, la variable $type est à 0 quand la fonction est de nouveau appelée.
    Le problème vient de mon template Twig, dans lequel je n'ai pas pensé à renvoyer la variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="{{ path('_add_media') }}" method="post" {{ form_enctype(form) }} novalidate>
    En faisant ainsi, tout roule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="{{ path('_add_media', {'type': type} ) }}" method="post" {{ form_enctype(form) }} novalidate>
    Désolé pour le dérangement et merci beaucoup Stephan pour ton support.
    J'ai encore beaucoup à apprendre sur PHP et Symfony, vous risquez donc de me supporter encore quelques temps

    Cordialement,
    Jean-Pierre

  10. #10
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Pour tout te dire, j'ai commencé le symfony en version 1.4 sans aucune connaissance, à part du bricolage. Et Symfony2, est dur au début, mais plus tu avances plus c'est simple et donc tu avances encore plus vite. Ne te décourage pas.

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

Discussions similaires

  1. [1.x] Bind et les formulaires
    Par bihman dans le forum Symfony
    Réponses: 4
    Dernier message: 28/09/2010, 16h47
  2. Utiliser le binding dans un formulaire
    Par karas.uchiwa dans le forum Flex
    Réponses: 6
    Dernier message: 05/01/2010, 20h37
  3. binding d'un formulaire à du JSON
    Par LEK dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/11/2009, 16h42
  4. Problème de Binding avec un formulaire
    Par vilveq dans le forum Flex
    Réponses: 7
    Dernier message: 06/08/2009, 11h03
  5. [VS2005][C#]Formulaire, ComboBox bindings
    Par Oufti dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/06/2006, 18h14

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