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 :

Formulaire imbriqué à relation multiple [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut Formulaire imbriqué à relation multiple
    Bonsoir,

    J'essaye de mettre en place un formulaire imbriqué à relations multiples, voici la configuration du modèle;

    Une table User et une table Role liées en ManyToMany ()donc une table de transition user_role généré par Symfony2).

    Le but est d'afficher un formulaire ajoutant un User avec un Role associé (si possible de pouvoir lister ceux en base et proposer un choix via une checkbox mais je verrai ca par la suite).

    J'ai donc modifier mon UserType.php comme suit (le champ commenté a été généré automatiquement par crud):
    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
     
    use Doctrine\Common\Collections\ArrayCollection;
    use Perso\UserBundle\Form\RoleType;
     
    class UserType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                ->add('login')
                ->add('password')
                ->add('salt')
                ->add('prenom')
                ->add('nom')
                ->add('email')
                ->add('tel')
                //->add('userRoles')
                ->add('usersRoles', 'collection', array('type' => new RoleType));
            ;
        }
     
        public function getName()
        {
            return 'perso_userbundle_usertype';
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'Perso\UserBundle\Entity\User',
            );
        }
    }
    Et voici mon controller simplifié au niveau du traitement du formulaire:
    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
     
    class AuthController extends Controller
    {
        public function registerAction()
        {
            $request = $this->getRequest();
            $form = $this->createForm(new UserType());
            if ($request->getMethod() == "POST")
            {
                $form->bindRequest($request);
                if ($form->isValid())
                {
                    $user = $form->getData();
                    $em = $this->getDoctrine()->getEntityManager();
     
                    $em->persist($user);
                    foreach ($user->getRoles() as $role)
                        $em->persist($role);
     
                    $em->flush();
     
                    return $this->redirect($this->generateUrl('home'));
                }
            }
            return $this->render('PersoMainBundle:Admin:register.html.twig', array('form' => $form->createView()));
        }
    }
    Avec ces deux persist, la table user_role va t-elle se mettre à jour automatiquement ?

    Sinon le problème que je rencontre, c'est que d'après le tuto que je suis, je suis censé trouvé une div généré par Symfony 2 dans le code source de ma page, ayant pour id quelque chose comme "<div id="perso_userbundle_usertype_roles">" et un "data-prototype=", je retrouve bien cette div vide pour cet id mais le problème est que je n'ai pas ce fameux "data-prototype=", voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <div>
    <label class=" required">Usersroles</label>
    <div id="perso_userbundle_usertype_usersRoles"></div>
    </div>
    Pourtant sur mon template, j'ai bien les champs de mon User qui s'affichent dans le formulaire, et un 'UsersRoles' à la fin.

    Quelle étape ais-je pu louper pour ne pas trouvé cette div dans ma page ? Merci !

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    Essaie de rajouter 'prototype'=>true, dans le array de ton formulaire
    comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     ->add('usersRoles', 'collection', array('type' => new RoleType,'prototype'=>true,'allow_add'=>true,
    		    	    	'allow_delete'=>true));

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Merci beaucoup j'ai maintenant tout ce qu'il faut dans ma div !

    Aurais-tu par hasard une explication ou un lien vers la documentation concernant ces propriétés que tu m'as proposé d'ajouter, avant que je ne clôture le topic ?

    Merci encore pour ton aide !

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 135
    Points : 153
    Points
    153
    Par défaut
    http://sf.khepin.com/2011/08/inconsi...orm-framework/

    En clair pour faire simple, c'est utile si tu as des formulaires imbriqués et que tu dois ajouter en Javascript un formulaire c'est-à-dire :

    Par exemple
    si tu fais une page qui propose à l'utilisateur d'ajouter une ou plusieurs adresses (sachant que le champ adresse est une collection), tu pourras générer plusieurs champs adresses grace au javascript et quand tu valideras ton formulaire il te retournera pas l'erreur : 'le formulaire contient des champs supplémentaires'

    Voilà j'espère que c'est assez clair...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    Impeccable merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Formulaire imbriqué, relation à travers une table
    Par MrVin100 dans le forum Symfony
    Réponses: 7
    Dernier message: 14/04/2015, 21h50
  2. [1.x] Formulaire imbriqué Relation many to many
    Par Ontolingua dans le forum Symfony
    Réponses: 13
    Dernier message: 03/08/2012, 21h34
  3. Réponses: 5
    Dernier message: 12/08/2011, 08h59
  4. [1.x] Problème d'enregistrement de relation d'un formulaire imbriqué
    Par LesLemmings dans le forum Symfony
    Réponses: 3
    Dernier message: 06/07/2010, 13h17
  5. [1.x] formulaire imbriqué relation n:n table de jointure
    Par symfony30000 dans le forum Symfony
    Réponses: 15
    Dernier message: 27/04/2010, 14h12

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