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]Surcharge du formulaire d'inscription


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut [FOSUserBundle]Surcharge du formulaire d'inscription
    Bonjour,
    j'ai surchargé le formulaire d'inscription du FOSUserBundle afin d'ajouter d'autres champs (certains issus de relation entre Entities). Lors de la validation, j'ai une erreur résultant du fait que le FOSUserBundle ne persiste que mon entity User (avec les champs que j'ai ajoutés dans cette Entity) mais il ne persiste pas les Entities liées.

    Voici les codes des formulaires (3 sont imbriqués) :
    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
    <?php
    namespace projet\UserBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;
     
    class UserType extends BaseType {
        public function buildForm(FormBuilder $builder, array $options)
      {
        parent::buildForm($builder, $options);
        $builder
          ->add('username', null, array('attr' => array('class' => 'inputText')))
          ->add('email', null, array('attr' => array('class' => 'inputText')))
          ->add('user_nom', null, array('attr' => array('class' => 'inputText')))
          ->add('user_prenom', null, array('attr' => array('class' => 'inputText')))
          ->add('user_tel_travail', null, array('attr' => array('class' => 'inputText')))
          ->add('user_fo', new UserFoType)
        ;
      }
     
      public function getDefaultOptions(array $options) {
            return array(
                'data_class' => 'projet\UserBundle\Entity\User',
            );
        }
     
      public function getName()
        {
            return 'projet_user_registration';
        }
     
    }
    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
    <?php
    namespace projet\UserBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class UserFoType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options) {
            $builder->add('ufo_date_naissance', 'birthday', array('widget' => 'single_text',
                                                              'input'      => 'datetime',
                                                              'format'     => 'dd/MM/yyyy',
                                                              'read_only'  => true,
                                                              'attr'       => array('class' => 'inputText')))
                    ->add('ufo_ref_locataire', null, array('attr' => array('class' => 'inputText')))
                    ->add('ufo_tel_portable', null, array('attr' => array('class' => 'inputText')))
                    ->add('ufo_tel_domicil', null, array('attr' => array('class' => 'inputText')))
                    ->add('ufo_tcp_id', 'entity', array('class' => 'projet\FrontOfficeBundle\Entity\Type_contact_privilegie'))
                    ->add('ufo_log_id', 'collection', array('type'         => new LogementType(),
                                                            'allow_add'    => true,
                                                            'prototype'    => true,
                                                            'attr' => array('class' => 'form_added')))
            ;
        }
     
        public function getDefaultOptions(array $options) {
            return array(
                'data_class' => 'projet\UserBundle\Entity\User_fo',
            );
        }
     
        public function getName()
        {
            return 'UserFo';
        }
    }
    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
    <?php
    namespace projet\UserBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    use projet\BackOfficeBundle\Form\Type\BailType;
     
     
    class LogementType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                    ->add('log_bailleur', 'entity', array('class' => 'projet\BackOfficeBundle\Entity\Bailleur'))
                    ->add('log_adresse', null, array('attr' => array('class' => 'inputText')))
                    ->add('log_commune', null, array('empty_value' => 'Choisir une commune', 'empty_data' => '-1'))
                    ->add('log_code_postal', null, array('read_only' => true, 'attr' => array('class' => 'inputText')))
                    ->add('log_etage', null, array('attr' => array('class' => 'inputText')))
                    ->add('log_numero', null, array('attr' => array('class' => 'inputText')))
                    ->add('log_description', 'textarea')
                    ;
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'projet\BackOfficeBundle\Entity\Logement',
            );
        }
     
        public function getName()
        {
            return 'projet_userBundle_logementType';
        }
    }
    Est-ce que le fait qu'il ne persiste pas mes Entities User_fo et Logement est normal ?

    Suis-je obligé de passer par la surcharge du FormHandler pour persister mes 3 Entities lors de la soumission du formulaire par un utilisateur ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Personne ne sait pourquoi mon formulaire ne m'instancie pas mes objets liés ?

    J'ai bien essayé de surcharger le FormHandler du FOSUserBundle mais j'ai ce message d'erreur :
    [code]Catchable Fatal Error: Argument 1 passed to FOS\UserBundle\Form\Handler\RegistrationFormHandler::__construct() must be an instance of Symfony\Component\Form\Form, instance of projet\UserBundle\Form\Type\UserType given[code]

    Voici mon fichier projet\UserBundle\Form\Handler\RegistrationFormHandler :
    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
    <?php
    namespace projet\UserBundle\Form\Handler;
     
    use FOS\UserBundle\Form\Handler\RegistrationFormHandler as BaseHandler;
    use FOS\UserBundle\Model\UserInterface;
    use projet\UserBundle\Entity\User_fo;
    use projet\BackOfficeBundle\Entity\Logement;
     
     
    class RegistrationFormHandler extends BaseHandler {
     
        public function process($confirmation = false) {
     
            die('COUCOU !');
     
            $user = $this->userManager->createUser();
            $this->form->setData($user);
            if ('POST' == $this->request->getMethod()) {
                $this->form->bindRequest($this->request);
                if ($this->form->isValid()) {
     
                    $ufo = new User_fo();
                    $lgt = new Logement();
                    $this->form->setData($lgt);
                    $this->form->setData($ufo);
                    $ufo->setUfoLogId($lgt);
                    $this->em->persist($lgt);
                    $this->em->persist($ufo);
                    $this->em->flush();
     
                    return true;
                }
            }
     
            return false;
        }
    }
    Quelqu'un saurait comment je peux me sortir de cette impasse svp ?

    Merci d'avance

  3. #3
    Membre éprouvé
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Par défaut
    Bonjour,
    Lors de la validation, j'ai une erreur résultant du fait que le FOSUserBundle ne persiste que mon entity User (avec les champs que j'ai ajoutés dans cette Entity) mais il ne persiste pas les Entities liées.
    Fais voir la partie de ta classe user avec les entités liées.

  4. #4
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Salut,
    Merci de ta réponse. Voici mes classes User et Logement (pour une meilleure lisibilité je n'ai mis que les lignes correspondantes aux relations)
    User :
    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
    <?php
     
    namespace projet\UserBundle\Entity;
     
    use FOS\UserBundle\Entity\User as BaseUser;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_user")
     */
    class User extends BaseUser
    {
    [...]
        /**
         * @var user_fo
         * 
         * @ORM\Column(name="user_fo", type="integer", nullable=true)
         */    
        private $user_fo;
     
    [...]
     
        /**
         * Set user_fo
         *
         * @param integer $userUfoId
         */
        public function setUserFo($userUfoId)
        {
            $this->user_fo = $userUfoId;
        }
     
        /**
         * Get user_fo
         *
         * @return integer 
         */
        public function getUserFo()
        {
            return $this->user_fo;
        }
    }
    User_fo :
    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
    <?php
     
    namespace BEL\UserBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * BEL\UserBundle\Entity\User_fo
     *
     * @ORM\Table(name="fos_user_fo")
     * @ORM\Entity(repositoryClass="BEL\UserBundle\Repository\User_foRepository")
     */
    class User_fo
    {
        /**
         * @var integer $ufo_id
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         * @ORM\Column(name="ufo_id", type="integer")
         */
        private $ufo_id;
     
        /**
         * @var integer $ufo_user_id
         * 
         * @ORM\OneToOne(targetEntity="BEL\UserBundle\Entity\User", cascade={"persist", "remove"})
         * @ORM\JoinColumn(name="ufo_user_id", referencedColumnName="user_id")
         */
        private $ufo_user_id;
     
    [...]
     
        /**
         * @var \Doctrine\Common\Collections\ArrayCollection 
         * 
         * @ORM\OneToMany(targetEntity="BEL\BackOfficeBundle\Entity\Logement", mappedBy="log_ufo_id",cascade={"persist", "remove"})
         */
        private $ufo_log_id;
     
        [...]
     
        /**
         * Set ufo_user_id
         *
         * @param integer $ufoUserId
         */
        public function setUfoUserId($ufoUserId)
        {
            $this->ufo_user_id = $ufoUserId;
        }
     
        /**
         * Get ufo_user_id
         *
         * @return integer 
         */
        public function getUfoUserId()
        {
            return $this->ufo_user_id;
        }
    [...]
        /**
         * Set ufo_log_id
         *
         * @param $ufoLogId
         */
        public function setUfoLogId($ufoLogId)
        {
            $this->ufo_log_id = $ufoLogId;
        }
     
        /**
         * Get ufo_log_id
         *
         * @return BEL\BackOfficeBundle\Entity\Logement
         */
        public function getUfoLogId()
        {
            return $this->ufo_log_id;
        }
    [...]
     
        /**
         * Add ufo_log_id
         *
         * @param BEL\BackOfficeBundle\Entity\Logement $ufoLogId
         */
        public function addLogement(\BEL\BackOfficeBundle\Entity\Logement $ufoLogId)
        {
            $this->ufo_log_id[] = $ufoLogId;
        }
    }

  5. #5
    Membre éprouvé
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Par défaut
    C'est donc l'entité User_fo qui est propriétaire des relations, or le traitement s'effectue sur l'entité User.
    Soit tu fais des relations bidirectionnelles avec User en propriétaire des relations et dans ce cas le "cascade persist" fera son office. Soit tu persistes toi-même les entités User_fo et Logement. A mon avis, la seconde solution est plus simple.

    Dans ce cas-là, ce n'est pas le rôle du formHandler de persister tes entités mais celui du UserManager; c'est donc cette classe que tu dois surcharger et en particulier la méthode updateUser (regarde la structure de la classe RegistrationFormHandler de FOSUB, tu comprendras pourquoi).

  6. #6
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Merci beaucoup !
    j'ai effectivement fais une relation bidirectionnelle dont User est propriétaire et il cherche à me persister mon entité User_fo.

    Maintenant j'ai un message de type "Integrity constraint violation" qui me dit que le champ ufo_date_naissance ne peut être vide même si le champ correspondant dans le formulaire est rempli.

    Voici comment il est déclaré :
    User_fo :
    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
    <?php
     
    namespace projet\UserBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
     
    /**
     * projet\UserBundle\Entity\User_fo
     *
     * @ORM\Table(name="fos_user_fo")
     * @ORM\Entity(repositoryClass="BEL\UserBundle\Repository\User_foRepository")
     */
    class User_fo
    {
     
    [...]
     
        /**
         * @var datetime $ufo_date_naissance
         *
         * @ORM\Column(name="ufo_date_naissance", type="datetime", nullable=false)
         * @Assert\Date()
         */
        private $ufo_date_naissance;
     
    [...]
     
        /**
         * Set ufo_date_naissance
         *
         * @param datetime $ufoDateNaissance
         */
        public function setUfoDateNaissance(DateTime $ufoDateNaissance)
        {
            $this->ufo_date_naissance = $ufoDateNaissance;
        }
     
        /**
         * Get ufo_date_naissance
         *
         * @return datetime 
         */
        public function getUfoDateNaissance()
        {
            return $this->ufo_date_naissance;
        }
    UserFoType :
    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
    <?php
    namespace projet\UserBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class UserFoType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options) {
            $builder->add('ufo_date_naissance', null, array('widget' => 'single_text',
                                                              'input'      => 'datetime',
                                                              'read_only'  => true,
                                                              'attr'       => array('class' => 'inputText')))
                    ->add('ufo_ref_locataire', null, array('attr' => array('class' => 'inputText')))
                    ->add('ufo_tel_portable', null, array('attr' => array('class' => 'inputText')))
                    ->add('ufo_tel_domicil', null, array('attr' => array('class' => 'inputText')))
                    ->add('ufo_tcp_id', 'entity', array('class' => 'BEL\FrontOfficeBundle\Entity\Type_contact_privilegie'))
                    ->add('ufo_log_id', 'collection', array('type'         => new LogementType(),
                                                            'allow_add'    => true,
                                                            'prototype'    => true,
                                                            'attr' => array('class' => 'form_added')))
            ;
        }
     
        public function getDefaultOptions(array $options) {
            return array(
                'data_class' => 'projet\UserBundle\Entity\User_fo',
            );
        }
     
        public function getName()
        {
            return 'UserFo';
        }
    }
    En regardant la requête que Symfony essaie d'exécuter grâce à la debug bar j'ai vu que tous mes champs de User_fo sont à null sauf ufo_ref_locataire, ufo_tel_portable et ufo_tel_domicil.

    Pourquoi voit-il mes champs à null et comment faire pour résoudre ce problème ?

    Merci d'avance

  7. #7
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Merci !
    Effectivement j'avais mal fait ma liaison entre User et User_fo (User pointait (mal) sur elle-même au lieu de pointer sur User_fo).

    Maintenant il m'enregistre bien toutes mes infos en base sauf les relations entre mes différentes Entities (par exemple la colonne log_ufo_id dans Logement est à NULL au lieu de contenir la valeur de la colonne ufo_id de la table User_fo).

    Est-ce normal ?

    Merci d'avance

  8. #8
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Bonjour,
    J'ai cette relation :
    User_fo :
    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
    /**
         * @var \Doctrine\Common\Collections\ArrayCollection 
         * 
         * @ORM\OneToMany(targetEntity="projet\BackOfficeBundle\Entity\Logement", mappedBy="log_ufo_id", cascade={"persist", "remove"})
         */
        private $ufo_log_id;
     
        public function __construct() {
            $this->ufo_log_id = new \Doctrine\Common\Collections\ArrayCollection();
            $this->ufo_statut = false;
        }
    [...]
    /**
         * Add ufo_log_id
         *
         * @param projet\BackOfficeBundle\Entity\Logement $ufoLogId
         */
        public function addLogement(\projet\BackOfficeBundle\Entity\Logement $ufoLogId)
        {
            $this->ufo_log_id->add($ufoLogId);
            $ufoLogId->setLogUfoId($this);
        }
    Logement :
    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
    /**
         * @ORM\ManyToOne(targetEntity="projet\UserBundle\Entity\User_fo", inversedBy="ufo_log_id", cascade={"persist", "remove"})
         * @ORM\JoinColumn(name="log_ufo_id", referencedColumnName="ufo_id")
         */
        private $log_ufo_id;
    [...]
    /**
         * Set log_ufo_id
         *
         * @param projet\UserBundle\Entity\User_fo $log_ufo_id
         */
        public function setLogUfoId(\projet\UserBundle\Entity\User_fo $log_ufo_id)
        {
            $log_ufo_id->addLogement($this);
            $this->log_ufo_id = $log_ufo_id;
        }
    Et lorsque je soumets mon formulaire d'inscription, la colonne log_ufo_id de ma table logement est a null. Pourquoi et comment changer ça ?

    Merci d'avance

Discussions similaires

  1. [2.x] [FOSUserBundle] Personnalisation du formulaire d'inscription
    Par EtudiantJ2EE dans le forum Symfony
    Réponses: 2
    Dernier message: 17/04/2013, 16h17
  2. Réponses: 0
    Dernier message: 06/04/2013, 21h51
  3. [2.x] Personnaliser le Formulaire d'inscription FOSUserBundle
    Par Centrallatice dans le forum Symfony
    Réponses: 0
    Dernier message: 25/01/2013, 16h55
  4. [2.x] [FOSUserBundle] Formulaire d'inscription
    Par aitiahcene dans le forum Symfony
    Réponses: 2
    Dernier message: 11/05/2012, 11h23
  5. [2.x] [FOSUserBundle] Inclure le formulaire d'inscription dans layout
    Par petergade57 dans le forum Symfony
    Réponses: 1
    Dernier message: 08/02/2012, 11h08

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