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 :

FOSUser - édition de profil avec un formulaire différent en fonction du rôle de l'user


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Points : 49
    Points
    49
    Par défaut FOSUser - édition de profil avec un formulaire différent en fonction du rôle de l'user
    Bonjour à tous,

    Pour le projet que je réalise, j'utilise FOSUser.
    En ce qui concerne l'édition de profil de l'utilisateur, je souhaiterais afficher un formulaire différent selon son rôle.
    En gros, je souhaiterais donc faire une condition dans le buildForm du formulaire d'édition de profil, du style
    "si le rôle est A, tu affiches tel formulaire, et si le rôle est B, tu affiches un autre formulaire".

    Problème: je ne sais pas du tout comment m'y prendre.
    Il faut déjà que je puisse récupérer l'utilisateur courant, chose possible dans un controller mais ailleurs?

    Merci pour votre aide

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Hello,

    Plusieurs possibilités :

    - La méthode facile pas trop dégueu mais optimisable :
    Si tu es capable de récupérer le user depuis le contrôleur, tu peux le passer en paramètre au moment de l'instanciation de ton formulaire. Tu devras alors rajouter une méthode __construct() au formType dans lequel tu mets en paramètre le user. Tu le stockes en attribut privé de ta classe formtype et tu l'utilises de manière à faire des forms différents.

    - La méthode plus pénible mais plus propre :
    Tu déclares ton formtype en tant que service et grace au DI, tu lui injectes le service security.context qui te permet de faire exactement la même chose dans le constructeur : à ceci près que tu n'as plus besoin de le passer en paramètre quand tu instance la classe puisque c'est le DI qui s'en charge. Ensuite coté form c'est pareil : tu récupères le user depuis le security context et tu le stockes en attribut privé.

    - La solution alternative pas forcément top :
    Tu vérifies le rôle de ton User dans le contrôleur et instancie un formType adapté : ça te fait faire plusieurs form type.

    ++

  3. #3
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Ok, je pense avoir capté.
    Je ne peux pas me permettre de regarder à cela maintenant, mais ça sera fait ce soir.

    Par contre petit précision, quand tu parles de DI... de quoi parles tu exactement?

    Merci pour l'aide en tout cas ;-)

  4. #4
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    DI = DependencyInjection => le composant d'injection de dépendance.

  5. #5
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Ok!

    Je test tout à l'heure, si c'est bon je mets en résolu!

    merci à toi, et bonne fin de journée

  6. #6
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Bonjour,


    Je reviens avec le même problème, que je n'arrive toujours pas à régler.
    Je vais essayer de le détailler un peu plus afin que vous compreniez exactement de quoi il retourne...

    Bon, pour un projet scolaire, je bosse avec FosUserBundle, et j'ai donc dans mon projet un UserBundle.
    Dans ce bundle, j'ai 3 entités:

    • User: qui étends de l'entité User de Fos.
    • Provider: qui correspond à un type de user.
    • Client: qui correspond au seconde type de user.


    Dans mon entité User, j'ai donc (entre autres) ceci:

    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
     
    /**
         * @var string
         *
         * @ORM\Column(name="type", type="string", length=255)
         */
        protected $type;
     
        /**
         * @ORM\OneToOne(targetEntity="Project\UserBundle\Entity\Provider", cascade={"persist"}, mappedBy="user")
         */
        private $provider;
     
        /**
         * @ORM\OneToOne(targetEntity="Project\UserBundle\Entity\Client", cascade={"persist"}, mappedBy="user")
         */
        private $client;
    Dans mon entité Provider, j'ai notamment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /**
         * @ORM\OneToOne(targetEntity="Projet\UserBundle\Entity\User", cascade={"persist"}, inversedBy="provider")
         */
        private $user;
    Et enfin dans mon entité Client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /**
         * @ORM\OneToOne(targetEntity="Projet\UserBundle\Entity\User", cascade={"persist"}, inversedBy="client")
         */
        private $user;
    J'ai donc mon formulaire RegistrationFormType, où j'arrive parfaitement à ajouter les 2 formulaires qui correspondent aux 2 types de users différents:

    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
     
    class RegistrationFormType extends basetype {
     
        public function buildForm(FormBuilderInterface $builder, array $options) {
            parent::buildForm($builder, $options);
     
            $builder
                    ->add('type', 'choice',
                            array(
                                'translation_domain' => 'FOSUserBundle',
                                'choices' => array(
                                    'ROLE_CLIENT' => 'Client', 
                                    'ROLE_PROVIDER' => 'Provider',
                                ),
                                'label' => 'Type de compte',
                                'required' => true,
                                'expanded' => true
                            )
                    )
                    ->add('client', New ClientType())
                    ->add('provider', New ProviderType())
            ;
        }
     
        public function getName() {
            return 'isl_user_registration';
        }
    }
    Ce que je souhaite réaliser
    J'aimerai qu'au formulaire de base vienne s'ajouter le formulaire ClientType si l'internaute coche la case "client",
    et que le formulaire ProviderType vienne s'ajouter si l'internaute coche la case "provider".
    En gros, faire une condition dans le builder...

    Apparemment, cela pourrait être réalisé avec quelque chose comme ceci (code donné par mon prof sans plus d'explication):

    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
     
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
                $user = $event->getData();
                if($user->getId()){
                    $form = $event->getForm();
                    switch($user->getType()){
                        case 'ROLE_CLIENT' :
                        case 'ROLE_MEMBER' :
                            $formProperty = 'client';
                            $formType = new ClientType();
                            break;
                        case 'ROLE_PROVIDER':
                            $formProperty = 'provider';
                            $formType = new ProviderType();
                            break;
                    }
                    $form->add($formProperty,$formType);
                }
            });
    J'ai lu la doc concernant les événements mais j'ai du mal à comprendre comment réaliser cela...

    Merci de vos lumières et de votre aide

Discussions similaires

  1. Réponses: 14
    Dernier message: 19/11/2009, 10h49
  2. Réponses: 4
    Dernier message: 12/12/2008, 07h28
  3. Réponses: 2
    Dernier message: 30/10/2008, 18h30
  4. Ouverture d'un formulaire avec des requêtes différentes
    Par Jérémy VAUTIER dans le forum Access
    Réponses: 3
    Dernier message: 02/03/2006, 07h31

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