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 :

Entities passed to the choice field must have a "__toString()" [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut Entities passed to the choice field must have a "__toString()"
    mon formulaire UtilisateurProfil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                ->add('nom')
                ->add('prenom')
                ->add('email')
                ->add('tel_mobile')
                ->add('nationalite') //<-ici le champ de type select
    mon entity UtilisateurProfil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        /**
         * @ORM\ManyToOne(targetEntity="Nationalite", inversedBy="utilisateurProfils")
         * @ORM\JoinColumn(name="nationalite_id", referencedColumnName="id")
         */
        private $nationalite;
     
        public function getNationalite()
        {
            return $this->nationalite;
        }
    mon entity nationalite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /**
         * @ORM\OneToMany(targetEntity="UtilisateurProfil", mappedBy="nationalite")
         */
        private $utilisateurProfils;
     
        public function __construct()
        {
            $this->utilisateurProfils = new ArrayCollection();
        }
    Lorsque j'affiche l’édition du formulaire:
    Le menu déroulant nationalité plante dès l'instant ou il existe un enregistrement dans la table (ex: id => 1, nom => 'francais')

    message d'erreur (concerne l'affichage du menu déroulant):nationalite):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entities passed to the choice field must have a "__toString()" method defined (or you can also override the "property" option).

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Il te faut rajouter une méthode __toString() dans ton entité.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function __toString() {
        return $this->label;
    }

  3. #3
    Membre averti
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    oui effectivement

    http://symfony.com/doc/current/refer....html#property

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                    ->add('nationalite', 'entity', array(
                        'class' => 'ColocPublicBundle:Nationalite',
    //                    'query_builder' => function(EntityRepository $er) {
    //                        return $er->createQueryBuilder('u')
    //                                ->orderBy('u.id', 'ASC');
    //                    },
                        'property' => 'nom',

  4. #4
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Par défaut
    Bonjour,

    je me permet de revenir sur le sujet. La première méthode donné par Guybrush113 fonctionne sans problème (Merci).
    Seulement, ça m'embête car on est pas censé toucher aux entités. Je préfère rajouter mes fonctions dans les entités repository et ici ça ne fonctionne pas.

    J'aimerais donc comprendre la méthode de pingolitipus que je n'arrive pas à appliquer pour mon cas.

    Merci.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Par défaut
    Bonjour, qu'est ce qui ne fonctionne pas??
    il te faut rajouter propriété dans ton champ entity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       ->add('nationalite', 'entity', array(
                        'class' => 'Coloc\PublicBundle\Nationalite',
                        'property' => 'label',
    Voila.

  6. #6
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Par défaut
    Bonjour et bonne année 2012 ^^

    En gros, j'ai deux entités nommées : Product et Category avec une relation ManyToMany donc une table intermédiaire à bien été créé.

    J'ai généré le CRUD via ligne de commande.
    Au final, j'ai donc deux formulaires, un pour les produits, un autre pour les catégories.

    Donc dans le dossier Form, j'ai : CategoryType et ProductType.

    Au niveau du code ça donne ceci :

    Relation dans l'entité Category.php :

    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
     
    namespace Shop\CoreBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Shop\CoreBundle\Entity\Category
     *
     * @ORM\Table(name="category")
     * @ORM\Entity(repositoryClass="Shop\CoreBundle\Repository\CategoryRepository")
     */
    class Category
    {
    	/**
    	* @ORM\ManyToMany(targetEntity="Shop\CoreBundle\Entity\Product", inversedBy="categories")
    	*/
    	private $products;
     
    ...
    Le code de l'entité Product.php :
    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
     
    <?php
     
    namespace Shop\CoreBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Shop\CoreBundle\Entity\Product
     *
     * @ORM\Table(name="product")
     * @ORM\Entity(repositoryClass="Shop\CoreBundle\Repository\ProductRepository")
     */
    class Product
    {
    	/**
    	* @ORM\ManyToMany(targetEntity="Shop\CoreBundle\Entity\Category", inversedBy="products")
    	*/
    	private $categories;
    Voici le code du fichier ProductType.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public function buildForm(FormBuilder $builder, array $options)
        {
     
            $builder
                ->add('title')
                ->add('description')
                ->add('price')
                ->add('categories', 'entity', array(
    	            		'class' => 'ShopCoreBundle:Category', 
    	            		'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('u')->orderBy('u.id', 'ASC');},
    	            		'property' => 'name'));
     
        }
    Est-ce correct ?

    Merci.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Citation Envoyé par gazelle Voir le message
    Seulement, ça m'embête car on est pas censé toucher aux entités.
    Perso je modifie mes entités, il y a certaines fonctions qui sont beaucoup plus logiques de placer dedans, toutes celles liées à une instance d'entité principalement.

  8. #8
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2006
    Messages : 120
    Par défaut
    Ok pour la modification des entités.
    Mais j'aimerais comprendre l'erreur quand même.

    J'ai essayé de faire de même pour une relation entre une marque et un produit.
    Et ça ne fonctionne toujours pas. J'aimerais au moins comprendre pourquoi.

    Voici l'erreur en question :


    Catchable Fatal Error: Argument 1 passed to Shop\CoreBundle\Form\{closure}() must be an instance of Shop\CoreBundle\Form\EntityRepository, instance of Shop\CoreBundle\Repository\BrandRepository given, called in D:\www\symphony\vendor\symfony\src\Symfony\Bridge\Doctrine\Form\ChoiceList\EntityChoiceList.php on line 93 and defined in D:\www\symphony\src\Shop\CoreBundle\Form\ProductType.php line 18
    500 Internal Server Error - ErrorException


    Merci d'avance.



    [EDIT] J'ai compris mon erreur. J'ai retiré query_builder et ça fonctionne. Par contre, si vous pouviez me dire à quoi sert le query_builder, je serais curieuse ! [/EDIT]

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    La propriété query_builder sert à modifier la requête par défaut qui va chercher le(s) élément(s).
    http://symfony.com/doc/2.0/reference...#query-builder

    Ton erreur est peut-être lié au fait de lui indiquer "EntityRepository" à la variable de ta fonction. Si tu le retires ca devrait fonctionner je pense

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Par défaut
    Citation Envoyé par Guybrush113 Voir le message
    La propriété query_builder sert à modifier la requête par défaut qui va chercher le(s) élément(s).
    http://symfony.com/doc/2.0/reference...#query-builder

    Ton erreur est peut-être lié au fait de lui indiquer "EntityRepository" à la variable de ta fonction. Si tu le retires ca devrait fonctionner je pense
    ou je trouve query_builder j le meme probleme

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Par défaut
    Citation Envoyé par Guybrush113 Voir le message
    Il te faut rajouter une méthode __toString() dans ton entité.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function __toString() {
        return $this->label;
    }

    Dans l'exemple de pingolitipus c'est quoi la valeur de l'objet label ???

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2012
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 394
    Par défaut
    dans cet l'exemple l'objet label prendera quelle valeur, j'ai le meme probleme je n'arrive pas a comprendre

    public function __toString() {
    return $this->toto;
    }

    dans tous les cas toto est quoi en fait ??

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Par défaut
    Citation Envoyé par aitiahcene Voir le message
    dans cet l'exemple l'objet label prendera quelle valeur, j'ai le meme probleme je n'arrive pas a comprendre

    public function __toString() {
    return $this->toto;
    }

    dans tous les cas toto est quoi en fait ??
    Tu peux mettre la valeur que tu veux à la place de label. Ici label correspond a une property de l'entite. Tu peux même mettre return "bidule"; si ça te chante.

    En php objet, la méthode __toString() est une méthode qui est executée automatiquement lorsque l'objet est traité comme une chaine de caractère. C'est ce qui s'affichera quand tu feras echo $objet.

    Ici, il est pertinent de retourner une valeur qui représente l'entité en question, c'est ce qui va s'afficher dans le select il me semble. Du coup tu mets return $this->label ou autre, quelque soit le nom du champs qui permet de distinguer l'objet en question.

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

Discussions similaires

  1. [2.x] Erreur : Entities passed to the choice field must be managed
    Par ptitdav80 dans le forum Symfony
    Réponses: 3
    Dernier message: 11/12/2011, 22h11
  2. Réponses: 4
    Dernier message: 25/04/2011, 14h58
  3. Réponses: 36
    Dernier message: 26/08/2008, 15h24
  4. Query, sum over fields that have the same ID as the active field
    Par piers dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/04/2007, 11h33
  5. field must have value
    Par Mihalis dans le forum Bases de données
    Réponses: 22
    Dernier message: 14/11/2006, 17h41

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