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]select hiérarchique ou avec optgroup


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut [form]select hiérarchique ou avec optgroup
    Bonjour,

    Est-il possible de faire un champ entity hiérarchique ou avec optgroup ?

    Exemple : J'ai une Entité Catégorie.
    Une Catégorie peut être une sous-catégorie d'une catégorie.

    J'aimerai donc dans un formulaire, avoir un champ catégorie de type select présenté de façon hiérarchique ou avec groupe, de telle manière que la catégorie mère soit suivie de ses sous-catégories.

    Catégorie 1
    • catégorie 1.1
    • catégorie 1.2
    • ...

    Catégorie 2
    • ...


    Merci d'avance.

  2. #2
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Bonjour,

    Il t'est possible de faire une relation OneToMany sur ton entité Categorie avec comme entité cible : Categorie.

    En spécifiant multiple -> true et expanded -> false tu obtiens un champ type select. Au besoin tu peux rajouter une requête DQL pour Filtrer les instances de Categorie à afficher.

    Je ne sais pas si j'ai répondu à ta question...
    bonne soirée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            $builder->add('categorie', 'entity', array(
                    'class'     => '...\\Entity\\Categorie',
                    'multiple'  => true, 
                    'expanded'  => false,
                    'property'  => 'titre',
                    'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
                        return $er->createQueryBuilder('categorie')
                                ->where('categorie.profondeur = 1');
                    }
            ));

  3. #3
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse.

    Mais au niveau de la relation, c'est ce que j'ai.
    En fait, mon souci est l'affichage du select.

    Je voudrais l'afficher de la manière suivante ou de manière similaire à ce qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <select>
    <optgroup label=catégorie mère 1>
    <option>catégorie fille 1</option>
    <option>...</option>
    </optgroup> 
    <optgroup label=...>
    </optgroup>
    ...
    </select>
    En fait, il aurait été pratique de faire une requête pour obtenir les catégories mères et de pouvoir faire une boucle afin d'afficher les catégories filles.

    Mais est-ce possible ?

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Mois aussi je cherche une réponse, et je pense que la seule solution, jusqu'à maintenant est de passer par un tableau à deux dimensions.

    Tu peux voir ça aussi :
    https://github.com/symfony/symfony/issues/1735

  5. #5
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    En effet, le tableau à 2 dimensions donne le résultat souhaité.
    Mais ma nouvelle question est comment passer ce tableau à mon formulaire?

    Je sais générer mon tableau du côté controller mais je ne sais pas le passer à mon formulaire.

    ou alors, Y a-t-il moyen de récupérer l'entitymanager dans mon formulaire ?

    Pour l'instant mon idée est de placer une variable dans la classe de mon formulaire et de créer une fonction setVariable afin de lui placer mon tableau.
    Mais y a-t-il plus simple ?

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Mais y a-t-il plus simple ?
    http://symfony.com/doc/current/book/...g-form-classes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
        $task = // ...
        $form = $this->createForm(new TaskType(), $task, array('tab' => $tab));
    ..
    et dans le TaskType :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    print_r($options['tab']);
    ...
        public function getDefaultOptions(array $options)
        {
            return array(
                'tab' => array(),
            );
        }
    ou alors, Y a-t-il moyen de récupérer l'entitymanager dans mon formulaire ?
    Oui, je pense qu'il y a une possibilité de la récupérer dans le fom.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Un grand merci lidaa.

    En fait, j'avais déjà essayé mais j'avais une erreur disant que l'option n'existait pas.
    J'avais juste oublié la fonction getDefaultOptions().

    Par contre, je rencontre un autre problème.
    Etant donné que j'utilise un champ de type choice au lieu d'entity, je reçois le message d'erreur:
    Catchable Fatal Error: Argument 1 passed to Ouvrage::setCategorie() must be an instance of Categorie, string given
    lors de la soumission du formulaire.

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Une solution (provisoire) mais ça marche :

    Récupérer ID de la catégorie choisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $id = $this->getRequest()->request->get('categorie');
    Récupérer l'Entity Catégorie de cet ID :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $selected_category = $em->getRepository('....')->find($id)
    Assigner la catégorie selectionée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ouvrage->setCategorie($selected_category)

  9. #9
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Ton idée est bonne mais ne fonctionne pas chez moi avec le $form->bindrequest($request).

    Ma solution provisoire ou à améliorer est la suivante:
    au niveau du controller, il faut d'abord créer son tableau à 2 dimensions.

    Dans le cas où l'on crée le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $form = $this->createForm(new TaskType(), $task, array('tab' => $tab));
    Dans le cas de la soumission du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $form = $this->createForm(new TaskType(), $task);
    Au niveau de la classe du formulaire :
    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 buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('...');
            ....
            ;
            if($options['tab'])
            {
                $builder->add('categorie','choice',array(
                        'choices' => $options['tab']
                        ));
            }
            else
            {
                    $builder->add('categorie');
            }
       }
    public function getDefaultOptions(array $options)
        {
            return array(
                'tab' => array(),
            );
        }
    Pour résumer, lors de l'affichage du formulaire, on force symfony à afficher le select avec un champ choice et lors de la soumission, on lui fait utiliser le champ entity.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 96
    Points : 111
    Points
    111
    Par défaut
    Bonne idée , mais reste à améliorer.
    Problème :
    Dans le cas où on a plusieurs champs avec des types différents entre l'Entity et le Form.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Travaillant sur d'autres projets, je n'ai pas su venir répondre plus tôt.

    Mais si j'ai bien compris ta question, je pense que la manière de faire serait celle-ci :

    Au niveau formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getDefaultOptions(array $options)
        {
            return array(
                'tabEntity1' => array(),
                'tabEntity2' => array(),
                ...
            );
        }
    En résumé, autant de paramètres que tu en as besoin pour dresser ton formulaire.

    côté controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $form = $this->createForm(new TaskType(), $task, array(
    'tabEntity1' => $tab1,
    'tabEntity2' => $tab2
    ...
    ));
    Bien sur, c'est à essayer car je n'ai pas encore eu le temps.

Discussions similaires

  1. jqTransform et les balises select avec optgroup
    Par betadev dans le forum jQuery
    Réponses: 0
    Dernier message: 23/05/2012, 17h18
  2. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  3. Réponses: 3
    Dernier message: 30/06/2005, 12h50
  4. [xhtml][css] bouton du form ne marche pas avec IE6
    Par chinouk dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 14/06/2005, 14h00
  5. [FORMS] Utilisation de DLL avec ORA_FFI
    Par Nounoursonne dans le forum Forms
    Réponses: 2
    Dernier message: 07/12/2004, 09h19

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