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 :

Récupérer l'user courant dans un formulaire imbriqué


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 2
    Par défaut Récupérer l'user courant dans un formulaire imbriqué
    Bonjour,

    Je débute avec Symfony 2.8... L'idée globale de mon projet est de mettre en ligne un site qui permet aux utilisateurs d'entrer les antécédents médicaux de leur famille. Pour cela, j'ai créé une base de données contenant différentes tables :
    • Compte : id, user, email, password...
    • Individu : id, nom, prenom, genre, dateNaissance, dateDeces, commentaire, compte (FK de Compte)
    • Relation : typeRelation, individuConnu (FK de Individu), individuALier (FK de Individu)
    • Pathologie : id, dateDebut, dateFin, causeDeces, commentairePatho, gravite (FK de Gravite), banque_patho (FK de Banque_Patho), individu (FK de Individu)
    • Gravite : gravitePatho
    • Banque_Patho : nom_pathologie


    Ma question :
    Je veux créer un formulaire d'ajout d'un nouvel individu. Il me faut donc demander à l'utilisateur les informations de l'entité Individu (prenom, nom, genre, dateNaissance, dateDeces, commentaire), mais aussi les informations de l'entité Relation (individuConnu et typeRelation).
    Pour cela, j'ai créé un formulaire IndividuEType imbriqué dans un formulaire RelationEType. Le problème c'est que j'ai besoin de récupérer la valeur de l'id du compte courant dans le formulaire imbriqué IndividuEType pour que mon nouvel individu soit affecté à un compte utilisateur. J'arrive à récupérer l'user courant depuis le contrôleur, et à le transmettre au formulaire RelationEType grâce à une variable de session mais je n'arrive pas à le retransmettre au formulaire imbriqué IndividuEType pour l'y enregistrer.

    Si ma méthode est la bonne, pourriez vous m'indiquer comment la corriger ?
    Sinon pourriez vous m'indiquer une meilleure méthode ?

    Mon contrôleur :
    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 ajouter_procheAction(Request $request)
    	{
    		$relation = new Relation();
    		$individu = new Individu();
    		$user = $this->get('security.context')->getToken()->getUser();
    		$_SESSION['iduser']=$user;
    		$individu->setCompte($user);
    		$form = $this->createForm('AdminBundle\Form\RelationEType', $relation, array('compte' => $user));
    		if ($form->handleRequest($request)->isValid()){
    			$individu->setCompte($user);
    			$em = $this->getDoctrine()->getManager();
    			$em->persist($relation);
    			$em->flush();
    			$request->getsession()->getFlashBag()->add('notice','Données bien enregistrées');
    			return $this->redirect($this->generateUrl('user_connected_index'));
    		}		
    		return $this->render('UserBundle:User:ajouter_proche.html.twig', array('form' => $form->createView(),));
    	}
    Mon formulaire RelationEType :
    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
     
    <?php
     
    namespace AdminBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Doctrine\ORM\EntityRepository;
     
    use AdminBundle\Entity\Individu;
    use AdminBundle\Form\IndividuEType;
     
     
    class RelationEType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
    		$idcompte=$options['compte'];
            $builder
    			->add(
    				'individuConnu',
    				EntityType::class,
    				array(
    					'class' => 'AdminBundle:Individu', 
    					'query_builder' => function (EntityRepository $er) use ($idcompte) {
    						return $er->createQueryBuilder('i')
    							->where('i.compte = :idcompte')
    							->setParameter('idcompte', $idcompte)
    							->orderBy('i.nom', 'ASC')
    							->orderBy('i.prenom','ASC');
    					},
    					'choice_label' => 'getNomComplet', 
    					'multiple' => false,
    					'expanded' => false
    				)
    			)	
    			->add(
    				'typeRelation', 
    				ChoiceType::class, 
    				array('choices'  => array(
    					true => 'ascendant',
    					false => 'descendant',
    					null => 'Moi - Premier individu'))
    			)
    			->add(
    				'individuALier',
    				new IndividuEType($idcompte)
    			)
    			->add(
    				'Enregistrer',
    				'submit'
    			)
    			->add(
    				'commentaire_relation', 
    				TextType::class,
    				array('data' => $idcompte, 'mapped' => false)
    			)
    			;
     
    	}
     
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AdminBundle\Entity\Relation',
                'compte' => null
            ));
        }
     
        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'adminbundle_relation';
        }
    }
    Mon formulaire imbriqué IndividuEType :
    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
     
    <?php
     
    namespace AdminBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
     
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
     
    use AdminBundle\Entity\Individu;
     
     
    class IndividuEType extends AbstractType
    {
     
     
     
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
    		$idcompte=$options['compte'];
            $builder
    			->add(
    				'nom', 
    				'text', 
    				array('required' => false)
    			)
    			->add(
    				'prenom', 
    				'text'
    			)
    			->add(
    				'genre', 
    				ChoiceType::class, 
    				array(
    					'choices'  => array(
    						null => '...',
    						'Masculin' => 'Masculin',
    						'Feminin' => 'Féminin',
    						'Autre' => 'Autre'),
    					'required' => false)
    			)
    			->add(
    				'dateNaissance',
    				BirthdayType::class,
    				array(
    					'placeholder' => array('day' => 'Jour', 'month' => 'Mois', 'year' => 'Année'),
    					'format' => 'ddMMyyyy',
    					'required' => false)
    				)
    			->add(
    				'dateDeces', 
    				BirthdayType::class, 
    				array(
    					'placeholder' => array('day' => 'Jour', 'month' => 'Mois', 'year' => 'Année'),
    					'format' => 'ddMMyyyy',
    					'required' => false)
    			)
    			->add(
    				'compte',
    				'hidden',
    				array('data' => $_SESSION['iduser'])
    			)
    			->add(
    				'commentaire', 
    				'textarea', 
    				array('required' => false)
    			)
    			->add(
    				'commentaire_num_compte', 
    				TextType::class,
    				array('data' => $_SESSION['iduser'], 'mapped' => false)
    			)
    			;
        }
     
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AdminBundle\Entity\Individu',
                'compte' => null
            ));
        }
     
        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'adminbundle_individu';
        }
    }
    Merci d'avance pour vos réponses,
    S'il vous plaît soyez indulgents, ceci est mon premier projet Symfony

  2. #2
    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
    Bonjour,

    Ce n'est pas le rôle du formulaire de récupérer l'utilisateur courant, et tu peux oublier la session c'est encore plus douteux

    Tu avais bien commencé en le récupérant au niveau du contrôleur et en le passant en option au premier formulaire.
    Il suffit de faire la même chose en le passant en option au deuxième formulaire.
    Tu peux retirer le user du constructeur de ton deuxième formulaire aussi : ce n'est plus nécessaire.

    Ça donnera ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ->add('individualizer', new IndividuEType(), [
        'compte' => $options['compte'],
    ])
    et tu pourras remplacer les $_SESSION['iduser'] qui se trouvent dans ton deuxième form par des $options['compte'].

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 2
    Par défaut
    Merci pour votre réponse complète,
    J'ai suivi vos conseils et cela a l'air de marcher !
    J'ai encore un petit souci car lors de la validation du formulaire, j'obtiens le message :
    Expected value of type "AdminBundle\Entity\Compte" for association field "AdminBundle\Entity\Individu#$compte", got "string" instead.
    Je vais continuer à travailler là dessus !

    Merci encore !

Discussions similaires

  1. récupérer le user name dans une requete
    Par amchap dans le forum C#
    Réponses: 17
    Dernier message: 19/09/2007, 17h50
  2. [MySQL] récupérer les données mysql dans un formulaire
    Par cali62100 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/04/2007, 14h17
  3. Récupérer un champ file dans un formulaire
    Par dedel53 dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2007, 11h05
  4. Réponses: 2
    Dernier message: 08/01/2007, 09h01
  5. Réponses: 2
    Dernier message: 11/12/2004, 21h20

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