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

 PHP Discussion :

Modifier deux entités liées par une relation ManyToMany dans un formulaire


Sujet :

PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Modifier deux entités liées par une relation ManyToMany dans un formulaire
    Bonjour,

    Je suis débutant sur Symfony et j'étudie la programmation objet depuis peu, je cherche la bonne méthode pour répondre à mon besoin. J’utilise Symfony 2.8.

    Le contexte:

    Une entité Collaborateur est en relation ManyToMany avec une entité Affectation : un collaborateur peut avoir plusieurs affectations et une affectation peut avoir plusieurs collaborateurs.

    Dans un formulaire de modification des collaborateurs je cherche à récupérer les différentes affectations d’un utilisateur dans des dropdown, une par affectation, qui prendrait pour valeur les affectations assignées.

    Mon objectif final est de pouvoir ajouter dynamiquement un champ pour ajouter une nouvelle affectation à la base de données et l’assigner à l’utilisateur modifié. Aussi, un dropdown pourra être supprimé à l’aide d’un bouton.

    J’ai essayé de deux manières :

    1) Avec un EntityType, j’arrive à récupérer les affectations dans une liste de checkbox, ceux assignés sont déjà cochés. Ainsi la modification est facile, mais je ne vois pas comment ajouter de nouveaux champs.

    Mon code:

    Mon EntityType (dans CollaboratorType):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    add(‘affectations’, EntityType::class, array(
                  'class' => ‘bundle’:Profile',
                  'required' => false,
                  'expanded' => true,
                  'multiple' => true,
                  ))
    Dans ma vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <ul class="equipments" data-prototype="{{ form_widget(edit_form.affectations.vars.prototype)|e('html_attr') }}">
          {% for affectation in edit_form.affectations %}
               <li>{{ form_widget(affectation) }}</li>
          {% endfor %}
    </ul>
    2) J'ai donc essayé d'utiliser un CollectionType et son prototype. Avec un CollectionType composé d’EntityType j’arrive à générer un dropdown (comprenant toutes les affectation) par affectation, mais ils sélectionnent par défaut la première affectation de la liste et non les affectations du collaborateur.

    Mon code:

    Dans mon formulaire (CollaboratorType):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    add('affectations', CollectionType::class, array(
                  'entry_type' => AffectationType::class,
                  'allow_add' => true,
                  'allow_delete' => true,
                  'required' => false,
                  ))
    Dans mon sous-formulaire (AffectationType):

    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
     
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('label', EntityType::class, array(
                'label' => 'Affectation',
                'class' => 'bundle:Affectation',
                ));
        }
     
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'bundle\Entity\Affectation',
            ));
        }
    Dans la vue mon code est la même que ci-dessus.

    Ma question: est-il possible de faire ce que je cherche à faire à partir d'une des méthodes ci-dessus ou est ce que je suis totalement à côté de la plaque et ne comprend pas le fonctionnement de Symfony ?

    J'ai lu les différentes documentations de Symfony à ce sujet et fait plusieurs mais je reste bloqué. J'espère que vous pourrez m'aider.

    Merci de m'avoir lu,

    Krizenn.

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Bonjour.

    1) Avec un EntityType, j’arrive à récupérer les affectations dans une liste de checkbox, ceux assignés sont déjà cochés. Ainsi la modification est facile, mais je ne vois pas comment ajouter de nouveaux champs.
    Ça dépend. On peut le faire avec Javascript par exemple, un bouton ajoutant un élément supplémentaire dans ta liste...
    Mais peut-être ai-je mal saisi ta demande.
    De retour parmis vous après 10 ans!!

  3. #3
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Avec un collectionType je vois comment ajouter un champ a l'aide du prototype pour que l'enregistrement en base de donnée soit géré automatiquement.

    Comment peut on gérer l'ajout en base de données de la nouvelle valeur d'un entityType?

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'avoue avoir un peu de mal à saisir ta question.
    C'est l'ORM (doctrine) qui est chargé de cette gestion d'après moi.

    En fait, je n'arrive pas trop à comprendre quelle est la difficulté que tu rencontres... désolé.
    Peut-être peux-tu essayer d'être plus précis dans la description de ton problème ?
    De retour parmis vous après 10 ans!!

  5. #5
    Membre à l'essai
    Homme Profil pro
    BTS SIO
    Inscrit en
    mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : mai 2016
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Disons que j'ai une entité Collaborateur et une entité Competence liées par une relation ManyToMany.

    Mon but est d'éditer les compétences d'une personne dans mon formulaire personneType, dans lequel j'ai un formulaire competenceType de type entityType.

    Les compétences sont présentées sous forme de checkbox. Je souhaiterais ajouter un bouton générant un input qui permette d'ajouter une nouvelle valeur.

    Lors du submit, Doctrine récupèrerait cette nouvelle valeur et la créerait en base de données.

    Je n'ai pas fait de test, parce que j'étais persuadé que Doctrine ne pourrait gérer cet ajout. J'imaginais que si le type entityType ne disposait pas d'option pour ajouter une nouvelle entité à la volée (comme on peut le faire avec un collectionType) c'est que ce n'était pas possible.

    Selon vous, si j'ajoute une checkbox et sa valeur, Doctrine la reconnaîtra et l'ajoutera ?

    Je ferais des tests demain, mais je reste sceptique.

    Merci et désolé de ne pas être très clair, j'essaye de faire au mieux.

Discussions similaires

  1. Remplir deux tables liées par une relation en même temps
    Par Arendelle dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 10/11/2015, 18h06
  2. Deux entités reliées par une contrainte
    Par david lefaivre dans le forum Doctrine2
    Réponses: 2
    Dernier message: 02/11/2012, 20h05
  3. Réponses: 6
    Dernier message: 28/12/2011, 13h00
  4. Réponses: 2
    Dernier message: 08/09/2009, 12h57
  5. Réponses: 2
    Dernier message: 22/10/2008, 12h51

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