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 :

Session dans un FormType


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 42
    Par défaut Session dans un FormType
    Bjr à tous!
    Cela fait des semaines que je suis entrain de tenter vainement de récupérer une variable de session dans un FormType.
    Objectif: j'ai une classe "Classe" qui à une relation ManyToOne avec une classe "Permis". Dans le menu déroulant lors de la création d'une nouvelle classe je voudrais voir uniquement les permis de l'utilisateur connecté et non dérouler tous les permis de la table" Permis" dans ma BDD. Voici comment j'ai démarré mais la méthode "get ()", "getToken ()", getUser ()", " container" ne sont pas interprétés dans le FormType et génèrent des erreurs.

    J'ai dû écrire un service pr le container mais j'ai rien trouvé pour le get.

    Si vous pouvez me trouver une autre alternative pour atteindre cet objectif.

    Voici le code du FormType:
    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
    # public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('nomClasse')
                ->add('descriptionClasse')
                ->add('maxEleveClasse')
                ->add('coutClasse')
                ->add('Formation','entity', array('class'=>'stage\FormationBundle\Entity\Formation','choice_label'=>'libelleFormation'));
     
            //Récupération de l'instance de la table AutoEcole liée à l'utilisateurs connecté
     
            $user = $this->container->get('security.context')->getToken()->getUser();
            $AutoEcole= $user->getAutoEcole();
     
            $builder->add('Permis','entity', array('class' => 'stage\FormationBundle\Entity\Permis','choice_label' => 'nomPermis',
                'query_builder' => function (entityRepository $er) use($AutoEcole) {
                    //return $er->permisParAutoEcole($this->Permis);
                   createQueryBuilder('m')
                    ->where('m.AutoEcole =:nom')
                    ->setParameter('nom', $AutoEcole)
                    ->getQuery();
            return $er->$this->getResult();
        }));
        }#

  2. #2
    Membre expérimenté
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Par défaut
    Salut,

    Il faut que tu donnes dans le constructeur de ta class Form, le security.context pour avoir le user connecté :

    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
     
    // Ta classe form
     
    class TrucForm extends AbstractForm
    {
        public function __construct($security_context)
        {
            $this->security = $security_context;
        }
     
        public function buildForm(...)
        {
            // tu récupères le user
            $user = $this->security->getToken()->getUser();
        }
    }
    Ton service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
     
        <services>
            <service id="__SERVICE__ID" class="__SERVICE_CLASS__">
                <argument type="service" id="security.context" />
                [...]
            </service>
        </services>
     
    </container>

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 42
    Par défaut
    Merci pour votre réponse.
    J'avais déjà opéré le choix de créer toute ma form dans le contrôleur. Ce qui marche mais comme c n'est pas optimal je vais tester votre alternative. Merci encore!

  4. #4
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Le securityContext est obsolète : il a été séparé en authorizationChecker et tokenStorage. Pour récupérer le user c'est le tokenStorage qu'il faut injecter.

    Cependant si je peux me permettre un conseil, ton formulaire ne devrait pas être dépendant de quelque chose comme la session ou le tokenStorage ou quoique ce soit d'autre du genre. Il est plus judicieux de récupérer le user dans le contrôleur et de le passer en option à ton formulaire. C'est beaucoup plus propre et ça évite les mauvaises dépendances.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 42
    Par défaut
    Merci pour le conseil. Mmais ça aurait été pratiqué pr moi de voir un cas concret puisq je ss un débutant sur Symfony et même la poo.
    J'espère que vous avez par ailleurs bien compris ce que je veux à travers mes explications plus haut.

  6. #6
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    http://symfony.com/doc/current/book/...g-form-classes

    Ce lien te montre comment créer un formulaire dans une classe FormType.
    Dans ton contrôleur lorsque tu appelles ceci $form = $this->createForm(new MyCustomFormType(), $myCustomObject, $myOptions); tu appelles en réalité la méthode create du service FormFactory.

    Cette méthode prends trois paramètres maximum. Le premier est le type du formulaire, le deuxième (optionnel) le modèle lié au formulaire pour de l'édition par exemple, et le troisième paramètre (optionnel) est un tableau d'options que tu vas retrouver dans ton formType comme étant le deuxième param de la méthode public function buildForm(FormBuilderInterface $builder, array $options).

    En passant le user en option, il est accessible dans ton formulaire.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2015
    Messages : 42
    Par défaut
    Par contre est ce que vous avez bien remarqué que je voudrais passer le paramètre uniquement à un champ et non à tout le FormType?

  8. #8
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Alors en regardant de plus près ce n'est pas le user que tu utilises dans ton formulaire c'est l'auto-école.
    Donc autant passer directement l'auto-école à ton FormType et pas le user tout entier, car tu n'as pas réellement besoin du user dedans.

    Par contre si tu veux utiliser un paramètre dans ta classe tu dois lui passer soit dans les options, soit lui injecter en paramètre (plus dérangeant en termes de dépendances). Et non ce n'est pas un souci de passer une variable à la classe même si elle n'est utilisée que sur un champs.

    Ça donnera ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $autoEcole = $options['autoecole'];
    $builder->add('permis', 'entity', array(
        'class' => 'stage\FormationBundle\Entity\Permis',
        'choice_label' => 'nomPermis',
        'query_builder' => function (EntityRepository $er) use($autoEcole) {
            return $er
                ->createQueryBuilder('m')
                ->where('m.AutoEcole = :nom')
                ->setParameter('nom', $autoEcole)
                ->getQuery()
                ->getResult();
        }
    ));
    du coup, pas besoin de session ni même de user dans ton form, juste le strict nécessaire.

Discussions similaires

  1. utilisation session dans XMLRAD
    Par billou77 dans le forum XMLRAD
    Réponses: 1
    Dernier message: 18/08/2005, 14h59
  2. Différencier 1 session dans deux fenêtres
    Par Tiaps dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 13/06/2005, 13h19
  3. [VB.NET] Utilisation des sessions dans Session_End ?
    Par San Soussy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/02/2005, 17h40
  4. [VB.NET] Server.MapPath et Session dans une classe
    Par nancy54 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/09/2004, 15h23
  5. [Avancé] Recopie une session dans un autre client
    Par gregoun dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 29/06/2004, 13h11

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