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 :

Regrouper des checkbox provenant d'une entité [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut Regrouper des checkbox provenant d'une entité
    Bonjour,

    Après quelques recherches infructueuses je me décide à vous exposer mon problème.

    Je souhaiterais créer un formulaire dans lequel j'afficherai une liste de rôles sous forme de checkbox ceci afin de pouvoir créer des sorte de "template de rôles" que je pourrais ensuite appliquer à un utilisateur.

    Il faut savoir aussi que mes rôles sont regroupé par modules. Un module peut contenir plusieurs rôles mais un rôle n’appartiens qu'a un seul module. Il y a donc une relation manyToOne entre les entités "rôle" et "module".

    Pour l'instant j'arrive a récupérer la liste de mes rôles pour les afficher dans mon formulaire.
    Le soucis c'est que pour permettre une meilleure lisibilité lors de la configuration des "template de rôles", je souhaiterai maintenant regrouper toutes ces checkbox par modules et afficher le nom du module au dessus de chaque groupe.

    Je suppose que je doit faire cela au niveau de twig mais je n'ai pas encore réussi a éclater l’élément "rôles" de mon formulaire pour le gerer au cas pas cas et je ne sais pas non plus comment récupérer le module auquel chaque rôles est rattaché.

    Si quelqu’un à un début de piste a me donner ce serait cool.
    Merci d'avance.

  2. #2
    Membre régulier Avatar de flutz
    Homme Profil pro
    Ingénieur d'études et développement
    Inscrit en
    Juin 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 52
    Points : 70
    Points
    70
    Par défaut
    Je pense qu'il te faudrait un formulaire qui contient un liste de formulaire moduleType, qui contient lui même la liste des roleType.
    Il y a souvent confusion entre les geeks, les nolifes, et les
    nerds.

  3. #3
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Tout d'abord flutz merci de ta réponse. Je garde cette solution sous le coude mais je me suis plutôt orienté vers la création d'un type de champ personnalisé.

    En effet ça me permettra de le réutiliser car je vais en avoir besoin a d'autres endroit.

    Donc voici comment je m'y suis pris, n’hésitez pas à me corriger si vous voyez des choses qui ne vont pas car j'ai beaucoup galéré pour arriver à comprendre comment faire et il y a sans doute quelques trucs pas propre qui traînent dans mon code.

    Tout d'abord voici le Type du formulaire qui appel mon champ perso :
    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
     
    <?php
    namespace SocleCommun\AuthentificationBundle\Form\GestionDroit;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class ModeleDroitType extends AbstractType{
     
        private $modules;
     
        public function __construct(array $modules){
            $this->modules = $modules;
        }
     
        public function buildForm(FormBuilder $builder, array $options) {
            $builder
                ->add('nom','text',array(
                    'label'=>'Nom du modèle'
                ))
                ->add('roles','grouprole',array(
                    'modules'=>$this->modules,
                    'label'=>'Roles du modèle : ',
                    'class'=>'SocleCommunAuthentificationBundle:Role',
                    'property'=>'nom',
                    'expanded'=>true,
                    'multiple'=>true,
                ));
        }
     
        public function getName(){
            return 'ModeleDroit';
        }
    }
    ?>
    Ensuite voici mon champ perso :
    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
     
    <?php
    namespace SocleCommun\AuthentificationBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    use Symfony\Component\Form\FormInterface;
    use Symfony\Component\Form\FormView;
     
    class GroupRoleType extends AbstractType{
     
        public function getDefaultOptions(array $options){
            return array(
                'modules' =>false,
            );
        }
     
        public function buildForm(FormBuilder $builder, array $options){
            $builder
                ->setAttribute('modules',$options['modules'])
            ;
        }
     
        public function buildView(FormView $view, FormInterface $form){
            $view->set('modules', $form->getAttribute('modules'));
        }
     
        public function getParent(array $options){
            return 'entity';
        }
     
        public function getName(){
            return 'grouprole';
        }
    }
    ?>
    Ce champ perso a été déclaré comme un service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        form.type.grouprole:
            class: SocleCommun\AuthentificationBundle\Form\Type\GroupRoleType
            tags:
                - { name: form.type, alias: grouprole }
    Et voici le twig qui gère l'affichage du champ :
    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
     
    {% block grouprole_widget %}
        {% spaceless %}
            {% if modules %}
                {% for module in modules %}
                <fieldset>
                    <legend>{{ module.getNom }}</legend>
                    {% for role in module.getRoles %}
                    <label for="{{ id }}_{{ role.getId }}">{{ role.getnom}}</label>
                    <input type="checkbox" id="{{ id }}_{{ role.getId }}" name="{{ full_name }}[{{ role.getId }}]" value="{{ role.getId }}"/><br />
                    {% endfor %}
                </fieldset>
                {% endfor %}
            {% endif %}
        {% endspaceless %}
    {% endblock %}
    Et voici le résultat obtenu qui est bien celui voulu au départ.


    Donc tout va bien me direz vous. Et bien non car je bloque sur l'initialisation des checkbox (checked ou non) lors du chargement d'un "template de rôles" déjà existant en vue de le modifier.
    En fait je ne sais pas comment récupérer l'objet existant dans le twig pour faire mon test.

    A savoir que l'enregistrement dans la base se passe bien il y a juste le "pré-positionnement" des checkbox qui ne fonctionne pas

  4. #4
    Membre habitué Avatar de anta_res
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 93
    Points : 173
    Points
    173
    Par défaut
    Ça y est j'ai fini par trouvé la solution, je post au cas où ça intéresse quelqu'un.
    Voici donc mon twig pour ce type de champ spécifique :
    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
     
    {% block checkbox_grouprole_widget %}
                    <label for="{{ id }}_{{ role.getId }}">{{ role.getnom}}</label>
                    <input type="checkbox" id="{{ id }}_{{ role.getId }}" name="{{ full_name }}[{{ role.getId }}]" value="{{ role.getId }}" {% if role in modele %}checked="checked"{% endif %}/><br />
    {% endblock checkbox_grouprole_widget %}
     
    {% block module_grouprole_widget %}
                <fieldset>
                    <legend>{{ module.getNom }}</legend>
                    {% for role in module.getRoles %}
                        {{ block('checkbox_grouprole_widget') }}
                    {% endfor %}
                </fieldset>
    {% endblock module_grouprole_widget %}
     
    {% block grouprole_widget %}
        {% spaceless %}
            {% if modules %}
                {% set modele=form.getParent.getVars.value.getRoles %}
                {% for module in modules %}
                {{ block('module_grouprole_widget') }}
                {% endfor %}
            {% endif %}
        {% endspaceless %}
    {% endblock grouprole_widget %}
    Je l'ai découpé en 3 blocks afin de permettre plus de personnalisation

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/10/2008, 11h30
  2. initialiser les label avec des infos provenant d'une table
    Par mouss4rs dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 24/04/2008, 09h54
  3. [JSP] regrouper des checkbox
    Par JohnnyWalk dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 26/07/2007, 14h27
  4. Réponses: 2
    Dernier message: 14/05/2007, 09h40
  5. [Conception] inserer des valeurs provenant d'une liste multiple
    Par digger dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 24/11/2005, 17h35

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