J'ai appris here comment on peut sauvegarder les données dans les champs de la table de jointure CoursesMemberships
en ajoutant ou éditant un student
dans CakePHP 3.x. Pour ajouter grades
pour beaucoup courses
Je peux le faire dans mes add
et edit
formes:Enregistrement des données dans la table de jointure à l'aide des options de contrôle dans CakePHP 3.x
echo $this->Form->control('courses.0.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.0._joinData.grade');
echo $this->Form->control('courses.1.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.1._joinData.grade');
echo $this->Form->control('courses.2.id', ['type' => 'select', 'options' => $courses]);
echo $this->Form->control('courses.2._joinData.grade');
...
mais cette forme:
- a un nombre fixe de
courses
pour chaquestudent
; - nécessite de sélectionner le
course id
dans la liste ('type' => 'select'
); - ajoute tous les cours au dossier de l'étudiant même s'il n'est pas assisté (bien, le champ
grade
correspondant peut être gardé vide, mais quand même).
Est-il possible d'avoir une forme plus simple, où tous courses
sont répertoriés et on ne peut la case à cocher course
assisté et entrez le grade
correspondant? Je l'ai trouvé très difficile en utilisant control
...
EDIT: Après @ndm
suggéré une méthode très bien ci-dessous, j'ai mis dans le add.ctp
:
foreach ($courses as $key => $course) {
echo $this->Form->control('courses.'.$key.'.id', ['type' => 'checkbox', 'hiddenField' => false, 'value' => $key,
'label' => $key]);
echo $this->Form->control('courses.'.$key.'._joinData.grades');
}
et corrigeais StudentsTable.php
en conséquence. Et cela fonctionne sans problèmes.
Cependant, si je fais la même chose dans edit.ctp
, les enregistrements précédemment enregistrés (par exemple, pour 1, 3, 5 et 7 courses
sont maintenant répertoriés comme 1, 2 et 3 montrant la grades
pour l'ancien 3 5 et 7 courses
et la Je comprends que le premier enregistrement a disparu parce que mon courses
commence par id=1
(tout comme la clé $ dans la boucle) et «courses.0.id» est manquant, mais le problème général est que les champs vides supprimés par la fonction beforeMarshal
ne sont plus reconnus sous la forme edit.ctp
et que je ne trouve pas un moyen raisonnable d'éditer l'enregistrement student's
Je suis très reconnaissant pour les solutions élégantes et une explication détaillée! J'ai commencé à implémenter le premier et j'ai reçu ce message d'erreur: Impossible d'utiliser l'objet de type Cake \ ORM \ Query en tant que tableau (ligne 'value' => $ courses [0] -> id,) –
Vous devriez le convertir à un tableau utilisant d'abord '$ courses-> toArray()', et '$ courses' aurait besoin d'être une requête régulière (pas une liste). J'ai supposé que vous voulez générer un nombre spécifique de cours en fonction de votre extrait d'exemple. Alternativement, vous pouvez itérer sur '$ courses' et utiliser key/value au lieu d'accéder aux propriétés dans le cas où' $ courses' est une requête de recherche de liste. – ndm
Incroyable! Tout fonctionne comme vous l'avez expliqué. Comme toujours. Merci beaucoup! –