Bonjour à chacun,
J'ai 3 entités suivantes : Inscriptions, Participants et Options
Une Inscription hasMany Participants
Un Participant belongsToMany Options
Une Option belongsToMany Participants
Comme vous l'imaginez très bien, j'ai une table participants_options (pour savoir quelles options le participant a choisies).
Dans le formulaire INSCRIPTION, mes inputs pour entrer un participants se présentent de la manière suivante :
echo $this->Form->input('participants.' . $i . '.id');
echo $this->Form->input('participants.' . $i . '.civilite', ['type' => 'select', 'data-update' => 'civiliteUpdate', 'label' => 'Civilité*', 'empty' => '(choisissez)', 'options' => $_civilite, 'value' => $_participant->civilite]);
echo $this->Form->input('participants.' . $i . '.nom', ['class' => 'edit-nom', 'data-update' => 'nomUpdate', 'field' => 'nom', 'label' => 'Nom*', 'value' => $_participant->nom]);
// Je construis le formulaire (participant) avec une boucle. J'ai toutes les données en session.
Comment dans ce formulaire, préciser les options choisies par le participant afin que ces dernière (options) soient prises en compte comme "associées" au participant lors de la soumission du formulaire ?
Si ma question n'est pas claire, je peux préciser ...
Pour info, le débug de ```
$this->request->data
Oui il s'agit de la sauvegarde et j'ai trouvé une solution à ce problème. Ce n'est pas très bien expliqué dans la doc...
Mes données sont structurées de la manière suivante :
Une inscription hasMany participants et un participant belongsToMany options.
Voici comment doit être le formulaire :
<?= $this->Form->create($inscription, ['controller' => 'Publics', 'action' => 'paiement']); ?>
<?php
echo $this->Form->input('montant', ['readonly' => 'readonly', 'value' => $details['amount']]); // Un champ classique de l'entité inscription
echo $this->Form->input('participants.' . $i . '.nom', ['class' => 'edit-nom', 'data-update' => 'nomUpdate', 'field' => 'nom', 'label' => 'Nom', 'value' => $_participant->nom]); // un champ de participant (belongsToMany)
echo $this->Form->input('participants.' . $i . '.options._ids', ['type'=> 'select', 'multiple' => true, 'options' => $options_inscription, 'val'=>$_vals]);
?>
Une fois les données envoyées par le formulaire, Cake PHP 3 reconstitue seul les associations pour un enregistrement en base de données. Attention toutefois au patchEntity qui doit bien préciser le niveau des associations.
$inscription = $this->Inscriptions->patchEntity($inscription, $_datas, ['associated' => ['Participants' => ['associated' => ['Options']]]]);
Voilà en gros. Cette partie est très très légère au niveau de la doc. http://book.cakephp.org/3.0/fr/views/helpers/form.html#creer-des-inputs-pour-les-donnees-associees
La doc ne précise pas le cas où une association intègre une sous association...
Bref j'espère que c'est clair.
Je ne suis pas sûr que le framework puisse aller aussi profondément dans ce cas là. Après je n'ai pas assez expérimenté mais j'aurais tendance à sauvegarder les options une par une et les associé après coup pour éviter les surprises