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 :

Personnaliser la requête d'une collection avec Symfony2


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut Personnaliser la requête d'une collection avec Symfony2
    Bonjour,

    J'ai une question débutante sur laquelle je bloque. En fait, j'ai un formulaire tout simple qui appelle une collection :

    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
     
    class ModuleType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('controles', 'collection', array(
                    'label' => false,
                    'type' => new ModuleControleType(),
                    'allow_add' => true,
                    'allow_delete' => true,
                    'by_reference' => false
                ))
            ;
        }
    ...
    Et voici la ModuleControleType() :

    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
    class ModuleControleType extends AbstractType
    {
    
        use Description;
    
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $this->description($builder, 2);
        }
    
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AdministrationBundle\Entity\ModuleControle',
                'intention' => $this->getName() . '_token'
            ));
        }
    
        /**
         * @return string
         */
        public function getName()
        {
            return 'administration_module_controle_form';
        }
    }
    Jusque la, pas de soucis, c'est un code vraiment de base sur Symfony et tout fonctionne bien : il va chercher tous mes points. Cependant, je souhaiterais personnaliser la requête (le query_builder donc) qui va chercher mes "points" dans ModuleControle() afin de lui rajouter un WHERE.

    J'ai essayé de rajouter "query_builder" à setDefaultOptions(), comme c'est le cas pour les champs de type "entity" mais ça ne fonctionne pas.

    Merci d'avance

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    yooooooooooooooooooo maaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan,


    comment ça ? ça ne marche pas le query_builder, c'est que tu n'as pas assez cherché



    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
     
    ...
    public function __construct($id)
    ****{
    ****$this->id=$id;
    ****}
    *
    ****public function buildForm(FormBuilder $builder, array $options)
    ****{
    ****$id =$this->id;
    *
    ->add('candidatecampaign', 'entity',
    ********array (
    ****************'label' => 'NomDuLabel',
    ****************'class' => 'Adl\\HiringBundle\\Entity\\CandidateCampaign',
    ****************'property' => 'name',
    ****************'query_builder' => function(CandidateCampaignRepository $er) use ($id)
    ****************{
    ************************return $er->createQueryBuilder('a')
    ****************************************->where('a.candidate = :id')
    ****************************************->setParameter('id', $id);
    ****************},
    ************************))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      $interview_form = $this->createForm(new InterviewType($id), $interview);
    qu'est ce t'en penses ?

  3. #3
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Salut et merci de ta réponse

    Si j'ai cherché mais comme dit dans le message a la fin ce n'est pas un champ de type entity mais collection.

    Encore merci

  4. #4
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    Cependant, je souhaiterais personnaliser la requête (le query_builder donc) qui va chercher mes "points" dans ModuleControle() afin de lui rajouter un WHERE.
    j'ai compris que tu voulais rajouter un WHERE ce que je t'ai montré. après si ta question porte sur autre chose je trouve ta demande un peu floue (ou alors c'est moi qui ne comprends pas bien).... peux tu reformuler ta question

  5. #5
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Salut et merci de ta réponse

    En fait avec Symfony et si j'ai bien compris, tu peux ajouter des entités de cette façons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                ->add('controles', 'entity' ...
    Jusque la, pas de soucis. Cependant, dans mon cas, j'ai ajouté une collection (qui, certes, ensuite, s'ajoute dans une entité) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                ->add('controles', 'collecion' ...
    Du coup tout s’insère bien et tout se modifie bien, je vois bien les données précédemment enregistrées. Mais lorsqu'il les récupère, je souhaiterais personnaliser la requête.

    Merci d'avance

  6. #6
    Membre expérimenté
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Par défaut
    Salut,

    Si je comprend bien ton code, tu as d'un côté un formulaire ModuleType qui comporte un champ de type collection dont le nom est "controles" qui est une collection de types "ModuleControleType".

    Ma première question : ton formulaire ModuleControleType, c'est quoi ? Est-ce un champ entity ?

    Dans la doc de Symfony, il n'y a pas d'option "query_builder" rattaché au champ collection : http://symfony.com/doc/current/refer...ollection.html

    Par contre, il y a bien une option "query_builder" pour les champs de type entity : http://symfony.com/doc/current/refer...es/entity.html

    Si ton formulaire ModuleControleType est de type entity, est-ce que tu as ajouté ceci dans ta classe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function getParent()
    {
        return 'entity';
    }

  7. #7
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Salut et merci de ta réponse

    C'est tout à fait ça, cependant ModuleControleType n'est pas une entité, c'est une simple description qui est dans un textarea (le code fait appel à un trait, mais derrière c'est bien un textatea tout ce qu'il y a de plus simple) :

    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
    <?php
     
    namespace AdministrationBundle\Form;
     
    use AdministrationBundle\Repository\ModuleControleRepository;
    use LogicielBundle\Form\Traits\Description;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class ModuleControleType extends AbstractType
    {
     
        use Description;
     
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $this->description($builder, 2);
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AdministrationBundle\Entity\ModuleControle',
                'intention' => $this->getName() . '_token'
            ));
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'administration_module_controle_form';
        }
    }

  8. #8
    Membre expérimenté
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Par défaut
    Je vais essayé d'être plus clair, voilà comment je vois la chose :

    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
     
    // Acme/DemoBundle/Form/Type/ModuleType.php
    class ModuleType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('controles', 'collection', array(
                    'label' => false,
                    'type' => new ModuleControleType(),
                    'allow_add' => true,
                    'allow_delete' => true,
                    'by_reference' => false
                ))
            ;
        }
    Donc là, tu affiches un formulaire comportant une collection de "ModuleControleType".

    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
    45
    46
    47
    48
    49
     
    // Acme/DemoBundle/Form/Type/ModuleControleType.php
    class ModuleControleType extends AbstractType
    {
        use Description;
     
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $this->description($builder, 2);
            // Ici tu mets les champs que tu veux, généralement liés à l'entité, ici : AdministrationBundle\Entity\ModuleControle
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AdministrationBundle\Entity\ModuleControle',
                'intention' => $this->getName() . '_token',
                'query_builder' => function(EntityRepository $er) {
                    return $er->createQueryBuilder('mc')
                        ->orderby('mc.name', 'ASC')
                        ->where('PatatiPatata');
                }
            ));
        }
     
        /**
         *   Ici il faut que tu précises que le champ de formulaire que tu viens de créés hérite du champs de formulaire de type <a href="http://symfony.com/doc/current/reference/forms/types/entity.html" target="_blank">entity</a> pour que le query_builder fonctionne.
         *   Sinon par défaut, ton champ de formulaire hérite directement de <a href="http://symfony.com/doc/current/reference/forms/types/form.html" target="_blank">Form</a> qui n'a pas de notions de query_builder.
         */
        public function getParent()
        {
             return 'entity';
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'administration_module_controle_form';
        }
    }
    Avec le code ci-dessus, tu as un formulaire pour éditer une entité AdministrationBundle\Entity\ModuleControle (avec un textarea si tu veux).

  9. #9
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juillet 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Juillet 2011
    Messages : 34
    Par défaut
    Salut et encore merci de ta réponse, je sens que j'avance un peu.

    Je me heurte quand même encore a un problème, je ne parviens pas à faire disparaître cette erreur :

    Expected argument of type "object, array or empty", "string" given
    Stack Trace
    in vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php at line 49 -

    J'ai bien compris que getParent() permettait de dire que le Type est en fait une entité, et personnaliser les options relatives :

    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
    45
    46
    47
    48
    49
    50
     
    <?php
     
    namespace AdministrationBundle\Form;
     
    use LogicielBundle\Form\Traits\Description;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class ModuleControleType extends AbstractType
    {
     
        use Description;
     
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $this->description($builder, 2);
        }
     
        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
    // Le query builder n'est pas encore fait pour le moment
            $resolver->setDefaults(array(
                'class' => 'AdministrationBundle\Entity\ModuleControle',
                'compound' => true,
                'intention' => $this->getName() . '_token'
            ));
        }
     
        public function getParent()
        {
             return 'entity';
        }
     
        /**
         * @return string
         */
        public function getName()
        {
            return 'administration_module_controle_form';
        }
    }
    ... mais l'erreur cité ci-dessus, malgré Google, je ne parviens pas à la faire disparaître ; tu aurais une idée ?

    Merci d'avance

  10. #10
    Membre expérimenté
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Par défaut
    Salut,

    Bon, là c'est super vague. Comme ça je ne peux pas vraiment te dire.

    L'erreur veut dire que quand il fait la correspondance entre les champs de formulaire et une propriété de ton objet, le type "string" est incorrect.

    Est-ce que par hasard, quelque part dans tes formulaires, y'a une propriété qui demande à avoir un objet ou un tableau et que lorsqu'il veut faire la correspondance (map) bah y'a erreur.

    Si c'est ça, il faut que tu regardes du côté des DataTrasformer de champ de formulaire => http://symfony.com/doc/current/cookb...nsformers.html

    Par exemple tu as un objet comme suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Acme\DemoBundle\Entity\Car
    class Car {
        /**
         * Acme\DemoBundle\Entity\Brand
         */
        protected $brand;
     
        [...]
    }
    Lorsque tu veux éditer dans un formulaire l'entité Car, pour lui assigner une marque (Brand, qui est une autre entité) en saisissant le nom de la marque (donc un string), il te faut appliquer un DataTransformer qui va transformer pour le champ de formulaire un string en entity Brand et inversement lors du mapping des propriété.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class CarFormType extends AbstractType
    {
        protected function buildForm(FormBuilderInterface $builder, array $options)
        {
            $brand_transformer = new StringToBrandTransformer();
            $builder->create($builder->add('brand', 'entity', array(
                [...]
            ))->addModelTransformer($brand_transformer));
     
            [...]
        }
    }
    Ou sinon c'est autre chose

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/08/2007, 21h38
  2. passer une collection avec un lien
    Par CPI_en_mousse dans le forum Struts 1
    Réponses: 31
    Dernier message: 25/05/2007, 17h45
  3. Problème de requête dans une boucle avec ADOQuery
    Par Ekik dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/05/2007, 17h07
  4. [Sql Server 8.0]Requête dans une chaîne avec Cursor à executer
    Par Nicodemus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/11/2006, 18h34
  5. Affichage d'une Collection avec logic:iterate
    Par koukoya dans le forum Struts 1
    Réponses: 5
    Dernier message: 04/10/2006, 12h52

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