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 :

Form, widget entity : Passage de paramètre dans le "query_builder" [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Points : 58
    Points
    58
    Par défaut Form, widget entity : Passage de paramètre dans le "query_builder"
    Bonjour,

    J'ai une table Client sur lequel existe un champ "parent_id", ce qui me permet de construire une hiérarchie simple entre clients, sur une seule table (relation one-to-many, auto-référente).

    J'ai généré un CRUD Client. Sur mon formulaire, il me faut maintenant un select me permettant de sélectionner un client existant qui va devenir le parent du client en cours d'édition. Deux conditions : il faut que la liste du select ne contiennent que des clients dont le parent_id est à NULL (on ne veut une hiérarchie que à 2 niveau max) ET il faut bien sûr que le client en cours d'édition n'apparaisse pas dans cette liste.

    J'ai donc voulu centraliser cette requête dans une méthode de mon ClientRepository. Elle ne me retourne pas les résultats d'une query mais juste un QueryBuilder (nécessaire pour le paramètre 'query_builder' lors de la création de mon form).

    Voici le code de ma classe ClientType :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class ClientType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                ->add('parent', 'entity', array(
                    'class' => 'MonApp\\ClientBundle\\Entity\\Client',
                    'query_builder' => function(EntityRepository $er) { return
                        $er->getParentOnly( 2 ); },
                ))                   
                ->add('nom')
                ->add('prenom');
    et voici la méthode de mon ClientRepository :
    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 getParentOnly($notThisOne = null)
        {
            $queryBuilder = $this->createQueryBuilder('a');
            $queryBuilder->where('a.parent IS NULL');
     
            if($notThisOne != null)
            {
                $queryBuilder->andWhere('a.id != :notThisOne')
                ->setParameter('notThisOne', $notThisOne);
            }
            return $queryBuilder;
        }
    Mon soucis : il faut que je passe l'id du client rattaché au formulaire lors de l'appel à $er->getParentOnly( 2 ); } (j'ai mis ici "2" en dur). Je peux accéder à l'id du client courant avec $builder->getData()->getId() (en supposant qu'il n'y a pas plus simple...) mais je n'arrive pas à passer ce paramètre dans ma closure.

    Ce code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    'query_builder' => function(EntityRepository $er, notThisOne = 2) { return
                        $er->getParentOnly( $notThisOne ); },
    mais pas ceux-là (entre autres) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    'query_builder' => function(EntityRepository $er, notThisOne = $builder->getData()->getId() ) { return
                        $er->getParentOnly( $notThisOne ); },
     
                    'query_builder' => function(EntityRepository $er ) { return
                        $er->getParentOnly( $builder->getData()->getId() ); },
    D'une manière générale, est-ce-que c'est la bonne méthode pour arriver au résultat que je veux ? Quelqu'un peut-il m'aiguiller pour mon passage de paramètre ?

    D'avance, merci beaucoup

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    il est possible de passer des paramètres aux fonctions anonymes par le biais de la directive use

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function buildForm(FormBuilder $builder, array $options)
        {
            $idClient=$builder->getData()->getId();//le parametre à passer à la fonction
            $builder
                ->add('parent', 'entity', array(
                    'class' => 'MonApp\\ClientBundle\\Entity\\Client',
                    'query_builder' => function(EntityRepository $er) use ($idClient)
    					{    //$idClient est désormais accessible à l'intérieur de la fonction
    						return $er->getParentOnly( $idClient ); },
                	));
    }
    Je pense que c'est ce que tu recherches.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par arnooo999 Voir le message
    Bonjour,
    il est possible de passer des paramètres aux fonctions anonymes par le biais de la directive use
    ...
    Je pense que c'est ce que tu recherches.
    Je ne peux pas tester dans l'immédiat mais ça m'a l'air d'être tout à fait ça (c'était plus une question php que symfony au final...). Résolu, merci beaucoup !

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

Discussions similaires

  1. passage de paramètres dans l'invite de commande
    Par mr_neness dans le forum Langage
    Réponses: 10
    Dernier message: 18/11/2005, 15h01
  2. Passage de paramètres dans champ hidden
    Par benassis dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/05/2005, 01h22
  3. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  4. Passage de paramètres dans une requête imbriquée
    Par DrakkoFR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 12h46

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