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):
Dans ma vue:
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, ))
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.
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>
Mon code:
Dans mon formulaire (CollaboratorType):
Dans mon sous-formulaire (AffectationType):
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 la vue mon code est la même que ci-dessus.
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', )); }
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.
Partager