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 :

Comment remplir un sélect Form avec deux valeurs issues de deux Entity différentes


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut Comment remplir un sélect Form avec deux valeurs issues de deux Entity différentes
    Bonjour,

    Je rencontre un problème sur la construction d'un sélect de formulaire. Voilà j'ai deux entités liées par une relation OneToMany

    Articles : id_article, id_cat
    Categories : id_cat, id_theme, nom

    Je souhaiterais construire un sélect avec un html de cette forme. <option value="id_article">nom</option> avec id_article et nom venant de deux entités différentes.

    Voici mon formulaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $builder
     
                ->add('articles',   'entity', array(
                                       'class' => 'MyappArticlesBundle:Articles',
                                       'query_builder' => function(\Myapp\ArticlesBundle\Entity\ArticlesRepository $er)use($id_theme)
                                            {   
                                                  return $er->getArticlesByTheme($id_theme);
     
                                            },
                                        'property'=>'c.nom',
                                        'empty_value' => 'Choisissez'
     
                                   ))
    Et mo repository

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function getArticlesByTheme($id_theme)
        {   
            $query = $this->createQueryBuilder('a')
     
                        ->leftJoin('MyappArticlesBundle:Categories', 'c')
                        ->where('a.idCat = c.idCat')
                        ->andWhere('c.idTheme = :id_theme')
                        ->setParameter('id_theme', $id_theme);
     
            return $query;
     
     
        }
    J'obtiens cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Neither the property "c" nor one of the methods "getC()"
    Je voudrais savoir comment on peut construire un select avec deux valeurs issues de deux entités différentes. J'ai tenté plusieurs combinaisons en enlevant par exemple le c de c.nom dans mon Query Builder mais j'obtiens toute forme d'erreur. Merci

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Hello,

    Dans l'option property, tu ne peux passer qu'une méthode de ta classe racine, en l'occurrence Article.

    Si tu souhaites afficher une valeur d'un objet lié, il faut que tu déclares une méthode qui te retourne cette valeur dans l'entité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Article {
        public function getCategoryName()
        {
            return $this->category->getName();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ->add('articles',   'entity', array(
        'class' => 'MyappArticlesBundle:Article',
        'query_builder' => function(ArticleRepository $er) use ($id_theme) {   
              return $er->getArticlesByThemeQb($id_theme);
        },
        'property'=>'categoryName',
        'empty_value' => 'Choisissez',
    ))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function getArticlesByThemeQb($id_theme)
    {   
        $qb = $this->createQueryBuilder('a')
            ->addSelect('c')
            ->join('a.category', 'c', 'WITH', 'c.idTheme = :id_theme')
            ->setParameter('id_theme', $id_theme)
        ;
     
        return $qb; 
    }
    À peu de chose près ça devrait être bon, je me suis permis de renommer quelques variables car elles sont très mal nommées. Je te laisse retrouver tes petits avec ça.
    ++

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut
    Merci Nico_F pour l'attention accordée à mon soucis qui persiste déjà depuis 3 semaines sans que je ne trouve de solution. J'ai tenté de faire comme tu as dit. Mais ça ne marche pas. Le champ nom reste vide. Du coup dans le HTML de mon select, j'ai toujours ceci => <option value="1"></option>. Or ce que je voudrais avoir c'est <option value="1">voiture</option>
    Avec la valeur 1 = id_article issue de ma première entité Articles. Et voiture = nom issue de ma deuxième entité categories.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Entité 1 = Articles : id_article, id_cat
    Entité 2 = Categories : id_cat, id_theme, nom


    Un var_dump de mon query builder avec ta solution me donne ceci
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    array (size=8)
      0 => 
        object(Myapp\ArticlesBundle\Entity\Articles)[511]
          private 'idArticle' => int 1
          private 'idCat' => int 1
          private 'nom' => null
      1 => 
        object(Myapp\ArticlesBundle\Entity\Categories)[502]
          private 'idCat' => int 1
          private 'nom' => string 'Mercedes' (length=10)
          private 'idTheme' => int 1
      2 => 
        object(Myapp\ArticlesBundle\Entity\Articles)[500]
          private 'idArticle' => int 2
          private 'idTheme' => int 1
          private 'idCat' => int 2
          private 'nom' => null
      3 => 
        object(Myapp\ArticlesBundle\Entity\Categories)[520]
          private 'idCat' => int 2
          private 'nom' => string 'Peugeot' (length=9)
          private 'idTheme' => int 1
      4 => 
        object(Myapp\ArticlesBundle\Entity\Articles)[487]
          private 'idArticle' => int 3
          private 'idTheme' => int 1
          private 'idCat' => int 3
          private 'nom' => null
      5 => 
        object(Myapp\ArticlesBundle\Entity\Categories)[506]
          private 'idCat' => int 3
          private 'nom' => string 'Nissan' (length=13)
          private 'idTheme' => int 1
      6 => 
        object(Myapp\ArticlesBundle\Entity\Articles)[519]
          private 'idArticle' => int 6
          private 'idTheme' => int 1
          private 'idCat' => int 4
          private 'nom' => null
      7 => 
        object(Myapp\ArticlesBundle\Entity\Categories)[513]
          private 'idCat' => int 4
          private 'nom' => string 'Wolkswagen' (length=4)
          private 'idTheme' => int 1

  4. #4
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Si ça ne fonctionne pas c'est que ton modèle ne tient pas la route.

    Et ça se voit au nom de tes variables puisque tu as des champs id_truc, id_machin : pas d'ID dans les attributs quand on fait de l'objet : on a des collections ou des objets mais certainement pas des clés étrangères, laisse ça à la base de données. Commence peut-être par revoir les bases de l'objet et l'utilisation d'un ORM.

    Avant de vouloir afficher le bon attribut de la bonne classe, fais en sorte de pouvoir accéder à ta catégorie depuis Article sous forme d'objet pour que ton modèle et donc par conséquent tes requêtes DQL soient cohérentes.

    Un article c'est un id, un nom et une categorie. Donc tes attributs c'est $id, $nom et $categorie, et pas id_article, nom, id_categorie ou je ne sais trop quoi.
    La méthode $article->getCategorie() doit retourner un objet, pas un integer.

    Une fois que ça ce sera cohérent, tu pourras faire quelque chose de propre avec tes requêtes DQL.

    Si tu n'y arrives pas ou que tu bloques je te suggère de nous montrer plutôt tes entités et leurs annotations car le problème vient de là.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 178
    Par défaut
    Bonjour Nico_F en donnant ceci comme exemple c'était juste pour bien faire comprendre mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Entité 1 = Articles : id_article, id_cat
    Entité 2 = Categories : id_cat, id_theme, nom
    Je te rassure que ça ne vient pas de mon modèle, puisque si je fais un createQuery j'ai bien toutes mes données comme il faut. Par contre dès que je change en createQueryBuilder, les objets qu'ils me retournent ne sont pas bons. Bref, j'ai trouvé une autre solution. Je suis passé par un "choice".


    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
     public function buildForm(FormBuilderInterface $builder, array $options)
        {   
            $id_theme = $this->id_theme ;
     
            $articles = array();
     
            $query = $this->em->getRepository('MyappArticlesBundle:Article')->getArticlesByTheme($id_theme);
     
            foreach ($query as $ref) {
                $articles [$ref['id_article']]= $ref['nom'];
            }
     
            $builder
                    ->add('Articles','choice',array( 'label' => false,
                                             'choices' => $articles 
     
    ));
     
        }
    Du coup j'ai bien mon sélect avec <option value="id_article">nom</option> comme je le souhaitais avec id_article et nom issu de mes entité différentes. Je ne pense que ce soit la meilleure façon de faire donc je laisse le sujet en suspend. Merci

  6. #6
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Si tu ne veux pas nous montrer ton vrai modèle ni le remettre en question tu n'auras pas plus d'aide.

    Je confirme que ce que tu as fait n'est pas une solution élégante.

    Bon courage.

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/07/2010, 11h11
  2. Réponses: 1
    Dernier message: 02/07/2010, 15h25
  3. comment remplir un doc word avec un formulaire
    Par enretard dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/07/2008, 10h12
  4. Comment remplir une liste déroulante avec une macro sans doublons
    Par alex.a dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/06/2007, 18h34
  5. [C#] Comment remplir un DataTable typé avec un DataSet ?
    Par Invité dans le forum Accès aux données
    Réponses: 11
    Dernier message: 25/04/2006, 14h56

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