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:
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:
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:
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:
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.