CakePHP : Relation HABTM avec champs supplémentaires
Bonjour à tous,
A titre d’exemple une petite application permettant la saisie de recettes de cuisine. Pour chaque recette créée, il faut indiquer les ingrédients qui entrent en compte. Pour sauvegarder toutes les informations, j’ai créé les 3 tables suivantes :
recipes (id, name, date_created); ingredients (id, name); ingredients_recipes(id, recipe_id,ingredient_id, quantity);
Le but de l’exercice est donc de trouver un moyen de créer une recette et d’insérer directement les ingrédients ainsi que leur quantité dans la table associative ingredients_recipes. La création s’effectue très simplement, il suffit juste d’envoyer les bonnes données au contrôleur. Pour se faire, voici un extrait de la vue que j’utilise :
echo $form->input('name');
echo $form->input('date_created');
echo $form->select("IngredientsRecipe.0.ingredient_id",$ingredients);
echo $form->input('IngredientsRecipe.0.quantity');
echo "<br />" ;
echo $form->select("IngredientsRecipe.1.ingredient_id", $ingredients);
echo $form->input('IngredientsRecipe.1.quantity');
echo "<br />" ;
echo $form->select("IngredientsRecipe.2.ingredient_id", $ingredients);
echo $form->input('IngredientsRecipe.2.quantity');
Pour sauvegarder le tableau qui sera transmis par le formulaire, il faut utiliser une petite astuce. Il faut en effet relier le modèle Recipe au modèle IngredientsRecipe à l’aide d’une relation $hasMany. Une fois les modèles liés, on peut faire appel à la fonction saveAll :
if (!empty($this->data)) {
//Astuce bind nécessaire pour sauvegarder correctement chaque valeur
$this->Recipe->bindModel(array(‘hasMany’=>array(‘IngredientsRecipe’)));
if ($this->Recipe->saveAll($this->data)) {
$this->Session->setFlash(‘Votre recette a été correctement créée’);
$this->redirect(array(‘action’ => ‘index’));
}
}
Toutes les données sont sauvegardées correctement. Pour la modification d’une recette, c’est la même technique de sauvegarde qui est utilisée. On bind et on saveAll.
Le grand changement intervient dans la vue permettant de modifier la recette :
//Chaque champs ingrédients doit être géré comme ceci.
echo $form->select("Ingredient.0.IngredientsRecipe.ingredient_id", $ingredients,$recipe['Ingredient'][0]['id']) ;
echo $form->input("Ingredient.0.IngredientsRecipe.quantity") ;
Références :
Astuce pour sauvegarder la relation HABTM
Gestion correcte de la vue en mode édition
salut lolo19 !
J’ai essayé ta technique mais ça ne marche pas pour moi, pourtant j’ai bien respecté ce que tu m’as dit.
http://forum.cakephp-fr.org/viewtopic.php?id=1604
je te fais un lien sur le post que j’ai posé sur cakephp si tu veux bien regarder … merci
Salut, je cherche effectivement une solution de ce genre pour mon problème qui est identique à celui ci …
A la différence près que je souhaites afficher l’ensemble des données (ingrédients) avec une text box a côté. Le principe : selectionner les ingrédients nécéssaires (ou checker) parmi la liste complète et y ajouter les quantité au besoin …
Ajourd’hui, j’arrive a afficher la liste des ingredients sous forme de Checkbox mais je ne vois pas comment appliquer cette méthode pour y ajouter à chacun une textbox …
Si vous avez une idée, je suis preneur …