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 :

FOSUserBundle + formulaire imbriqué


Sujet :

Symfony PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut FOSUserBundle + formulaire imbriqué
    Bonjour,

    J'ai un petit soucis (je m'arrache les cheveux) de formulaire imbriqué. J'ai deux entités, Utilisateur, qui hérite de User du UserBundle, et Info_Membre, qui sont toutes les deux en relations one to one, Info_Membre possédant la relation.

    J'ai donc voulu faire un formulaire imbriqué pour l'inscription puisque Info_Membre contient le nom et le prénom de l'utilisateur. J'ai créé une fonction inscriptionAction() dans le controller associé et ait produit mon formulaire.

    Pourtant je sèche au moment de traiter mon formulaire, je ne peux pas utiliser bêtement persist($info_membre->getUtilisateur()) puisqu'il doit y avoir un traitement des données (mot de passe crypté, usernameCanonical, ...) et je ne pense pas non plus pouvoir faire appel à registerAction().

    Quelqu'un saurait résoudre ce problème?



    EDIT :

    Je viens de trouver une solution mais elle n'est pas très belle.

    Dans FOS\UserBundle\Form\Handler\RegistrationFormHandler.php j'ai rajouté un getter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    getUserManager()
    {
        return $this->userManager;
    }
    et du coup dans mon UtilisateurController je peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $formHandler = $this->container->get('fos_user.registration.form.handler');
    $um = $formHandler->getUserManager();
     
    $info_membre = $form->getData();
    $utilisateur = $info_membre->getUtilisateur();
    $um->updateUser($utilisateur);
     
    $em = $this->getDoctrine()->getEntityManager();
    $em->persist($info_membre);
     
    $em->persist($utilisateur);
    $em->flush();

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Points : 378
    Points
    378
    Par défaut
    voila ce que moi j'ai fait
    ça peut t'aider

    Attention j'ai mis persist

    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
     
    <?php
    //Entity
    class Voluntary {
     
    ...
     
       /** 
         * @ORM\OneToOne(targetEntity="Ac\AcSecurityBundle\Entity\User", cascade={"persist"})
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         * @Assert\Type(type="Ac\AcSecurityBundle\Entity\User")
         */        
        private $user;   
     
     /**
         * Set user
         *
         * @param Ac\AcSecurityBundle\Entity\User $user
         */
        public function setUser(\Ac\AcSecurityBundle\Entity\User $user)
        {
            $this->user = $user;
        }
    Mon entité user n' a rien de spéciale


    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
     
     
    use FOS\UserBundle\Entity\User as BaseUser;
     
    /**
     * Ac\AcSecurityBundle\Entity\User
     *
     * @ORM\Table(name="users")
     * @ORM\Entity(repositoryClass="Ac\AcSecurityBundle\Entity\UserRepository")
     */
    class User extends BaseUser
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;    
     
        public function __toString() {
            return $this->getUserName();
        }       
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }   
     
    }
    J'ai mon formType voluntary avec fosuser embedded

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     public function buildForm(FormBuilder $builder, array $options) {
     
            $entity = $options["data"];
            $idVoluntary = $entity->getId();
     
            $builder              
                    ->add('name')
                    ->add('user', new UserType())
     
    ...
    Mon UserType

    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
     
     
    <?php
     
    namespace AC\VolontaireBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class UserType extends AbstractType {
     
        public function buildForm(FormBuilder $builder, array $options) {
            $builder
                    ->add('username')
                    ->add('email', 'email')
                    ->add('plainPassword', 'repeated', array('type' => 'password'))    
     
            ;
        }
     
        public function getDefaultOptions(array $options) {
            return array(
                'data_class' => 'Ac\AcSecurityBundle\Entity\User',
     
            );
        }
     
        public function getName() {
            return 'ac_volontairebundle_usertype';
        }
     
    }
    Template twig voluntary new

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
         {{ form_errors( form.user.plainPassword ) }}
        {{ form_row( form.user.plainPassword ) }}
    Dans mon controller voluntay
    je n'ai rien du changer à l'action create

    mais j'ai quand même apporter une modif car j'ajoute en meme temps un role au user nouvellement créé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       if ($form->isValid()) {
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($entity);
                $em->flush();
     
                /*
                 * add role user
                 */
                $user = $entity->getUser();
                $userManager = $this->get('fos_user.user_manager');
                $userManipulator = new UserManipulator($userManager);
                $userManipulator->addRole($user->getUsername(), 'ROLE_NPO');

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ah merci!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $userManager = $this->get('fos_user.user_manager');
    Me permet de ne pas avoir à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $formHandler = $this->container->get('fos_user.registration.form.handler');
    $um = $formHandler->getUserManager();
    et en plus de ne pas modifier RegistrationFormHandler.

Discussions similaires

  1. [Struts] - Déclenchement d'une action dans un formulaire imbriqué
    Par Dabat dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 19/03/2009, 15h14
  2. Parcour des getElementById dans un formulaire imbriqué ?
    Par DrySs dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/10/2007, 19h03
  3. formulaire imbriquer + popup
    Par luan220 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/10/2007, 12h11
  4. Probleme Formulaire imbriques
    Par gloglo dans le forum Struts 1
    Réponses: 10
    Dernier message: 30/08/2006, 20h30
  5. formulaire imbriqué
    Par jani dans le forum Langage
    Réponses: 9
    Dernier message: 18/01/2006, 15h40

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