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 :

FormType : duplicate le champs role [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Avatar de didate
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

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

    Informations forums :
    Inscription : juin 2010
    Messages : 90
    Points : 238
    Points
    238
    Par défaut FormType : duplicate le champs role
    Bonjour

    le champs rôle ci-dessous se duplique au niveau de ma vue (c'est à dire il s'affiche 2 fois). Je ne vois pas trop le pouquoi....

    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
     
     public function buildForm(FormBuilderInterface $builder, array $options)
        {
            parent::buildForm($builder, $options);
     
            $builder
              ->add('id','hidden')
              ->add('username', null, array('label' => 'Pseudonyme', 'translation_domain' => 'FOSUserBundle','attr' => array('class' =>'form-control')))
     
              ->add('email', 'email', array('label' => 'Email', 'translation_domain' => 'FOSUserBundle','attr' => array('class' =>'form-control')))
     
            	->add('agence',null,array('label' => 'Agence :','attr' => array('class' =>'form-control')))
              ->add('roles', 'collection',array(
                                                'type'   => 'choice',
                                                'options'  => array(
                                                  'choices'  => array(
                                                    'ROLE_CASHIER' => 'ROLE_CASHIER',
                                                    'ROLE_IN_CHARGE_OF_AGENCE' => 'ROLE_IN_CHARGE_OF_AGENCE',
                                                    'ROLE_ADMIN' => 'ROLE_ADMIN',
                                                    'ROLE_SUPER_ADMIN' => 'ROLE_SUPER_ADMIN',
                                                    'ROLE_VALIDATOR'=>'ROLE_VALIDATOR'
                                      )
                       )
                   ));
        }
    La vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <form action="{{ path('fos_user_update',{username:'null'}) }}" {{ form_enctype(form) }} method="POST" class="fos_user_update">
        {{ form_widget(form) }}
        <div>
            <p><br/><input class="btn btn-primary btn-xs" type="submit" value="{{ 'registration.submit'|trans }}" /></p>
        </div>
    </form>
    le resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <div id="roles"><div><select id="roles_0" name="roles[0]" class="form-control"><option value="ROLE_CASHIER" selected="selected">ROLE_CASHIER</option><option value="ROLE_IN_CHARGE_OF_AGENCE">ROLE_IN_CHARGE_OF_AGENCE</option><option value="ROLE_ADMIN">ROLE_ADMIN</option><option value="ROLE_SUPER_ADMIN">ROLE_SUPER_ADMIN</option><option value="ROLE_VALIDATOR">ROLE_VALIDATOR</option></select></div>
     
    <div><select id="roles_1" name="roles[1]" class="form-control"><option value="ROLE_CASHIER">ROLE_CASHIER</option><option value="ROLE_IN_CHARGE_OF_AGENCE">ROLE_IN_CHARGE_OF_AGENCE</option><option value="ROLE_ADMIN">ROLE_ADMIN</option><option value="ROLE_SUPER_ADMIN">ROLE_SUPER_ADMIN</option><option value="ROLE_VALIDATOR">ROLE_VALIDATOR</option></select></div></div>
    Merci d'avance ....
    L'effort fait les forts

  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,

    Tu as configuré un type collection pour "roles", je suppose que ton user a deux roles et que cela génére donc 2 champs select, le rendu est normal vu ce que tu as écris.

    Il serait plus cohérent de rendre le champ "roles" sous forme de collection de checkbox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ->add('roles', 'choice',array(
                                                'multiple'   => 'true',
                                                'expanded'  => true,
                                                'choices'  => array(
                                                    'ROLE_CASHIER' => 'ROLE_CASHIER',
                                                    'ROLE_IN_CHARGE_OF_AGENCE' => 'ROLE_IN_CHARGE_OF_AGENCE',
                                                    'ROLE_ADMIN' => 'ROLE_ADMIN',
                                                    'ROLE_SUPER_ADMIN' => 'ROLE_SUPER_ADMIN',
                                                    'ROLE_VALIDATOR'=>'ROLE_VALIDATOR'
                                               )
                   ));

  3. #3
    Membre actif
    Avatar de didate
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

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

    Informations forums :
    Inscription : juin 2010
    Messages : 90
    Points : 238
    Points
    238
    Par défaut
    Bonjour et Merci pour ta réponse ...

    Tu as configuré un type collection pour "roles", je suppose que ton user a deux roles et que cela génére donc 2 champs select, le rendu est normal vu ce que tu as écris.
    oui tu as parfaitement raison, je viens de le constater. Tout mes utilisateurs on 2 rôles. il y a ROLE_USER qui est ajouté par défaut.

    Nom : capture.PNG
Affichages : 409
Taille : 11,2 Ko

    C'est pas le comportement que je souhaite. Dans mon cas un utilisateur ne doit avoir qu'un et un seul rôle.

    Comment fait-il pour ajouté ROLE_USER ? et comment le désactivé ?

    Merci ....
    L'effort fait les forts

  4. #4
    Membre actif
    Avatar de didate
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

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

    Informations forums :
    Inscription : juin 2010
    Messages : 90
    Points : 238
    Points
    238
    Par défaut
    J'ai trouvé.

    j'ai redéfini la méthode getRoles de la classe User

    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
     
     /**
         * Returns the user roles
         *
         * @return array The roles
         */
        public function getRoles()
        {
            $roles = $this->roles;
     
            foreach ($this->getGroups() as $group) {
                $roles = array_merge($roles, $group->getRoles());
            }
     
            // we need to make sure to have at least one role
            //$roles[] = static::ROLE_DEFAULT;
     
            return array_unique($roles);
        }
    le problème c'était cette ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $roles[] = static::ROLE_DEFAULT;

    Il a fallut aussi que je modifie ma collection en ajoutant un allow_add=true, sinon à la validation il me générait l'erreur "This form should not contain extra fields"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ->add('roles', 
                            'collection', 
                            array('type' => 'choice','allow_add' => true,'options' => 
                              array('label' => false, 'choices' => 
                                  array('ROLE_CASHIER' => 'ROLE_CASHIER',
                                        'ROLE_IN_CHARGE_OF_AGENCE' => 'ROLE_IN_CHARGE_OF_AGENCE',
                                        'ROLE_ADMIN' => 'ROLE_ADMIN',
                                        'ROLE_SUPER_ADMIN' => 'ROLE_SUPER_ADMIN',
                                        'ROLE_VALIDATOR'=>'ROLE_VALIDATOR'
                                      ), 'attr' => 
                                array('class' =>'form-control'),
                       )
                   )
               );


    Merci arnooo999...
    L'effort fait les forts

  5. #5
    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
    "ROLE_USER" est un role ajouté par le système dans le jeton de sécurité au moment du login.
    Il n'est pas forcément destiné à être persisté dans la BDD
    dans FOSUserBundle, il y a un test dans la méthode "addRole" pour ne pas le sauvegarder
    https://github.com/FriendsOfSymfony/...User.php#LC135

    Dans mon cas un utilisateur ne doit avoir qu'un et un seul rôle.
    Un User a plusieurs Roles, cela est défini au niveau au coeur du composant sécurité
    https://github.com/symfony/Security/...rface.php#LC52
    Si tu changes cette cardinalité, tu peux t'attendre à plein de problèmes par la suite.

    Potentiellement, un user aura toujours plusieurs roles (un user ayant dans la BDD "ROLE_SUPER_ADMIN" a sans doute virtuellement "ROLE_ADMIN", "ROLE_USER" etc...)

    Bref ça me parait plus une question de présentation du paramétrage: une idée serait d' utiliser un autre attribut que "role" dans ton 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
     
    public function setFunction($function)
    {
       $this->function=$function;
       switch($function){
          case 'SUPER_ADMIN':
             $this->setRoles(['ROLE_SUPER_ADMIN']);
             break;
          case 'cashier':
               $this->setRoles(['ROLE_CASHIER']);
             break;
          //etc...
       }
    }

  6. #6
    Membre actif
    Avatar de didate
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2010
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Guinée

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

    Informations forums :
    Inscription : juin 2010
    Messages : 90
    Points : 238
    Points
    238
    Par défaut
    Oui c'est vrai que cette phrase n'est pas réellement vrai.
    Dans mon cas un utilisateur ne doit avoir qu'un et un seul rôle.
    Je voulais dire que au niveau de ma DB, je ne veux qu'un seul rôle pour un utilisateur, le reste est défini dans le fichier security.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       role_hierarchy:
           ROLE_VALIDATOR: 
           ROLE_CASHIER: 
           ROLE_IN_CHARGE_OF_AGENCE: ROLE_CASHIER
           ROLE_ADMIN:       [ROLE_USER]
           ROLE_SUPER_ADMIN: [ROLE_ADMIN,ROLE_IN_CHARGE_OF_AGENCE,ROLE_VALIDATOR]
    L'effort fait les forts

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

Discussions similaires

  1. duplication de champs dans d'un formulaire à un autre
    Par nours69 dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/06/2009, 14h02
  2. Validation de non-duplication de champs
    Par Janitrix dans le forum Zend_Form
    Réponses: 5
    Dernier message: 15/08/2008, 16h00
  3. Duplication de champ
    Par pierre50 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/01/2008, 13h08
  4. Duplication de champs sans raison.
    Par yozart dans le forum IHM
    Réponses: 2
    Dernier message: 09/01/2008, 08h05

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