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 :

formulaire de type choice avec les roles securité de symfony


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut formulaire de type choice avec les roles securité de symfony
    Salut à tous,

    Je cherche à mettre en place le formulaire de création d'utilisateur. Pour cela j'ai besoin de renseigner le role qu'aura mon nouvel utilisateur.
    J'aimerais donc avoir un champ de type select afin que l'admin puisse choisir un role parmis une liste (ecrit en dur pour le moment) de roles.

    Etant donné que le composant securité de Symfony se base sur un type array pour travailler avec les roles je dois faire avec.
    Ainsi comme l'option choice du formulaire se base sur un tableau de string je dois effectuer des conversions pour travailler avec mon form et l'entity User.

    J'ai donc une classe transformer afin de transformer dans les 2 sens (array -> string ou string -> array) les données du role pour l'entity ou la form.

    Néanmoins j'ai encore une erreur :
    ContextErrorException: Notice: Array to string conversion
    auriez-vous des pistes de recherche afin de mettre en place mon champ role du formulaire de création d'utilisateur ?


    création de mon champ dans la classe de mon form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            $builder->add($builder->create('roles','choice',array(
                'choices' => array('1' => 'ROLE_ADMIN','2' => 'ROLE_CONTRIB')
            ))->addViewTransformer($transformer));
    ma classe transformer :

    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
    use Symfony\Component\Form\DataTransformerInterface;
    use Symfony\Component\Form\Exception\TransformationFailedException;
     
    class StringToArrayTransformer implements DataTransformerInterface
    {
        public function transform($array)
        {
            var_dump($array);
            return $array[0];
        }
     
        public function reverseTransform($string)
        {
            return array($string);
        }
    }

    l'action de mon Controller :

    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
        public function addAction(Request $request)
        {
            $user = new User(); //init entity
            $form = $this->createForm(new UserForm(), $user);
     
            //update de l'objet si form soumis
            $form->handleRequest($request);
     
            //validation de l'objet
            if ($form->isValid())
            {
                $em = $this->getDoctrine()->getManager();
                $em->persist($form);
                $em->flush();
                return $this->redirect($this->generateUrl('task_success'));
            }
     
            return $this->render('MonBundle:Admin:usersAdd.html.twig', array('form' => $form->createView()));
        }
    PS : je sais qu'il existe FOSUserBundle mais je ne souhaite pas l'utiliser


    En vous remerciant de votre précieuse contribution.

  2. #2
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Bonsoir,


    choices

    type: array default: array()

    C'est la façon la plus simple de spécifier les choix qui pourront être choisis dans le champ. L'option choices est un tableau, où les index sont les valeurs des items, et les valeurs du tableau sont les labels des items :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $builder->add('gender', 'choice', array(
        'choices' => array('m' => 'Masculin', 'f' => 'Féminin')
    ));
    http://symfony.com/fr/doc/current/re...e.html#choices

    Le $builder->create et le addViewTransformer sont-ils vraiment nécessaires ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    je te remercie DarckCrystale mais malheureusement cette simple solution est évidemment la première que j'ai testé et comme celle-ci ne marche évidemment pas je me suis renseigner sur les transformer pour combler le problème entre le champ array et le choice. Mais je n'arrive toujours pas à mes fins avec cela. d'ou ma question histoire de savoir ce qui cloche dans mon code.

    Bien entendu si j'enlève mon transformer en fin de construction et si je passe la valeur "multiple" à true cela me donnera un champ valide qui contient mes 2 items. Mais je ne souhaite avoir 1 item visible car je n'accepte pas plusieurs valeur pour ce champs mais uniquement un seul role. Donc je passe la valeur "multiple" à false cela ne marche plus.

  4. #4
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $builder->add(' { nom du champ pour le role dans l'objet utilisateur }', 'choice', array(
        'choices' => array('ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_CONTRIB' => 'ROLE_CONTRIB')
    ));
    ?

    Symfony ne va-t-il pas avec ça hydrater tout seul l'objet User ?

    Peut-être d'ailleurs l'erreur rencontrée vient-elle du setter de l'entité User qui râle ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    en me basant sur les explications de ce lien j'obtiens une erreur :
    ContextErrorException: Notice: Undefined offset: 0

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $builder->add(' { nom du champ pour le role dans l'objet utilisateur }', 'choice', array(
        'choices' => array('ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_CONTRIB' => 'ROLE_CONTRIB')
    ));
    Parce que cela ne change pas grand chose à la problématique.

    Symfony ne va-t-il pas avec ça hydrater tout seul l'objet User ?
    si seulement...

    Peut-être d'ailleurs l'erreur rencontrée vient-elle du setter de l'entité User qui râle ?
    Je ne comprends pas bien pourquoi il rallerait puisque à aucun moment je set encore un objet user puisque mon formulaire n'est jamais soumis.
    De plus dans mes fixtures je set la valeur de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $user1->setRoles(array('ROLE_ADMIN'));
    et je n'ai pas de problème. La récupération semble fonctionner également car mon authentification et mon autorisation marche bien quand il test le profil et son role.

  7. #7
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Bonjour,

    Peut-être essayer de mettre un __toString() dans les entités qui interviennent dans le formulaire : si ça marche, on pourra voir quelle classe pose problème (ou ne pose pas problème, si ça plante toujours ^^' )

  8. #8
    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,

    j'ai besoin de renseigner le role qu'aura mon nouvel utilisateur
    Le problème essentiel est qu'un utilisateur est susceptible d'avoir +sieurs role. tu veux un seul role, alors que l'entité User attend un tableau de roles

    En toute logique, le code devrait être celui-ci (on peut affecter +sieurs roles à l'utilisateur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $builder->add($builder->create('roles','choice',array(
                'multiple'=>true,
               'expanded'=>true,
                'choices' => array( 'ROLE_ADMIN' => 'Administrateur', 'ROLE_CONTRIB'=>'Contributeur)//les index du tableau sont les valeurs qui seront inséré via la méthode setRoles() de l'entité
      ))

  9. #9
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Bien vu !

    Et même si le multiple est à true, est-ce qu'on peut 'forcer' le formulaire à ne donner qu'un seul choix possible ? Parce que c'est ce qui chiffonne miltone.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Merci pour vos interventions.

    Et bien finalement pour avoir poser la question ailleurs j'ai eu encore le droita me conseiller de passer le type de mon champs role en string.
    Pensant à tord que le composant security de Symfony ne fonctionnait que par ce type j'étais très septique à l'idée que cette solution marche. Surtout que j'avais déjà essayé avant mais je n'ai du oublier quelque chose qui m'a a tord confirmer qu'il fallait travailler en array().

    J'ai donc transformer encore une fois mon champs array en string et là tout semble de résoudre avec quelques autres modifications auxiliaires.

    A mon avis il faut éviter de jouer au maximum à des conversions de type dans le code.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par miltone Voir le message
    Merci pour vos interventions.

    Et bien finalement pour avoir poser la question ailleurs j'ai eu encore le droita me conseiller de passer le type de mon champs role en string.
    Peut -tu me montrer un peu de ton code? Ce que ta eu a corriger! Et maintenant est-t-il possible toujours d'attribuer plusieurs roles a un utilisateur? Merci d'avance pour ta reponse!

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    entity User qui marche très bien avec le composant Security de Doctrine :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    <?php
     
    namespace Acme\MySiteBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\User\EquatableInterface;
     
     
    /**
     * Acme\MySiteBundle\Entity\User
     * @ORM\Table(name="user")
     * @ORM\Entity(repositoryClass="Acme\MySiteBundle\Entity\UserRepository")
     */
    class User implements UserInterface, \Serializable, EquatableInterface
    {
        /**
         * @ORM\Id
         * @ORM\Column(name="id", type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\Column(name="prenom", type="string", length=255)
         */
        protected $prenom;
     
        /**
         * @ORM\Column(name="nom", type="string", length=255, unique=true)
         */
        protected $nom;
     
        /**
         * @ORM\Column(name="email", type="string", length=255, unique=true)
         */
        protected $email;
     
        /**
         * @ORM\Column(name="username", type="string", length=255)
         */
        protected $username;
     
        /**
         * @ORM\Column(name="salt", type="string", length=255)
         */
        protected $salt;
     
        /**
         * @ORM\Column(name="password", type="string", length=255)
         */
        protected $password;
     
        /**
         * @ORM\Column(name="role", type="string", length=255)
         */
        protected $role;
     
     
        public function __construct()
        {
            $this->roles = array();
        }
     
        public function eraseCredentials()
        {
     
        }
     
        public function serialize()
        {
            return serialize(array($this->getId(),));
        }
     
        public function unserialize($serialized)
        {
            list($this->id,) = unserialize($serialized);
        }
     
        public function isEqualTo(UserInterface $user)
        {
            return $this->username === $user->getUsername();
        }
     
        public function getId()
        {
            return $this->id;
        }
     
        public function getPrenom()
        {
            return $this->prenom;
        }
     
        public function setPrenom($prenom)
        {
            $this->prenom = $prenom;
            return $this;
        }
     
        public function getNom()
        {
            return $this->nom;
        }
     
        public function setNom($nom)
        {
            $this->nom = $nom;
            return $this;
        }
        public function getEmail()
        {
            return $this->email;
        }
     
        public function setEmail($email)
        {
            $this->email = $email;
            return $this;
        }
     
        public function getUsername()
        {
            return $this->username;
        }
     
        public function setUsername($username)
        {
            $this->username = $username;
            return $this;
        }
     
        public function getSalt()
        {
            return $this->salt;
        }
     
        public function setSalt($salt)
        {
            $this->salt = $salt;
            return $this;
        }
     
        public function getPassword()
        {
            return $this->password;
        }
     
        public function setPassword($password)
        {
            $this->password = $password;
            return $this;
        }
     
        public function getRole()
        {
            return $this->role;
        }
        public function setRole($role)
        {
            $this->role = $role;
            return $this;
        }
     
        public function getRoles()
        {
            return array($this->role);
        }
    }
    Concernant des roles multiples, pour le moment je n'ai pas eu à en utiliser plusieurs donc je ne sais pas. Il semble bien que cela soit bien prévu pour car la récupération des roles ce fait par un retour d'array...

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Avril 2015
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci beaucoup à miltone pour cette réponse, en effet cela fonctionne bien à la fois pour le login et pour le CRUD (version 2.6.6 de SF2) .

Discussions similaires

  1. Formulaire et champs selectionnés avec les sessions
    Par denzel21 dans le forum Langage
    Réponses: 1
    Dernier message: 14/12/2007, 12h19
  2. Réponses: 2
    Dernier message: 30/08/2004, 14h48
  3. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 17h06
  4. Pb avec le formulaire en type List
    Par LoulouFifi dans le forum Struts 1
    Réponses: 5
    Dernier message: 04/02/2004, 11h34
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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