Bonjour à tous,
Je me mets à Cake, pour des raisons professionnelles (mon nouvel employeur l'utilise), et je me heurte au problème de la création d'un sous-formulaire.
POur faire simple disons que j'ai une appli gérant le séjour de personnes à l'étranger:
Avec effectivement une relation n,n entre personnes et countries.
Je voudrais construire un formulaire où on pourrait enregistrer les informations sur une personne, avec en dessous un sous formulaire listant des pays visités.
Avec un lien permettant d'ajouter un pays si une personne a visitée plus d'un pays.
Sous Symfony 2, on peut faire cela avec les formulaires imbriqués.
Par contre, je n'ai pas trouvé de méthode sous cake. Quelque chose existerait-il ? Ou faut-il que je fasse comme je l'avais fait, dans l'ancien temps sous php (tout seul,sans framework), avec une procédure AJAX?
merci de vos réponses.
Si vous avez besoin que je vous mettes le code, dites le moi, mais c'est surtout une question globale.
Bonne journée
Pour pouvoir différencier un formulaire par rapport à un autre :
dans la vue :
echo $this->Form->input('personnes.nom') ;
echo $this->Form->input('countries.nom');
dans le controller
$this->Personne->save($this->request->data'personnes'];
$this->Country->save($this->request->data'countries'];
SAlut philieric,
Mais dans ce cas là, tu as deux formulaires.... Donc en cas de soumission de l'un, les données de l'autre sont perdues non ?
Dans une version en php seul j'avais un truc du genre
Dans la vue principale :
<div id="accueil" >
<form id='form' method="post" action="index.php?modele=FormIndiv&action=recup">
<fieldset>
<legend style="text-align: center;">Etat Civil</legend>
<label for="nom">Nom : </label><input type="text" id='nom' name = 'nom' class='text'>
<label for="pnom">Prénom : </label><input type="text" id='pnom' name = 'pnom' class='text'>
<label for="sexe">Sexe : </label><select id="sexe" name = 'sexe'>
<option value="M">M</option>
<option value="F">F</option></select>
<label for="datNaiss">Date de naissance : </label><input type="text" placeholder="jj/mm/aaaa" class="date" id = 'datNaiss' name = 'datNaiss'><br/>
<label for="natio">Nationalité : </label><select id="Natio" name = "natio">
<option value="" selected="selected"></option>
<?php foreach ($result as $value) {
echo ('<option value = "' . utf8_encode($value->nom_pays) . '">'. $value->nom_pays . '</option>');?>
</select>
/ ********************************************************
**Ici un système à onglet géré par Jquery**
*********************************************************
<div id="tabs">
<ul>
<li><a href="#tabs-3">Pays visités</a></li>
</ul>
<div id="tabs-1">
.../...
<div id="tabs-3">
<?php include 'View/pays.php'; ?>
</div>
<input id="bouton" type="submit" value="Envoyer" >
</form>
La vue Pays.php
<table id="TabPays">
<thead>
<tr>
<th><strong>Pays</strong></th>
<th><strong>Date d'arrivée</strong></th>
<th><strong>Date de départ</strong></th>
<th><strong>Ville</strong></th>
</tr>
</thead>
<tbody id="tabBody"></tbody>
</table>
<br/>
<input type="button" id="ajoutPays" value ="Ajouter un pays"/>
Et la fonction Js qui ajoute une ligne pays si besoin : Dans le fichier AjoutOays.js
$(document).ready(function(){
$('#ajoutPays').click(function(){
var nb = $('.pays').length; // Recupere le nombre de lignes "pays visites"
var donnees = 'nb='+nb;
$.ajax({
url : 'Model/PaysMod.php',
type:'POST',
data : donnees,
success : function(data){
var item1 = '<td><input type="text" name ="pays[dateArrivee]'+nb+'] "></td>';
var item2 = '<td><input type="checkbox" value="1" name ="pays[DateDepart]'+nb+']"></td>';
var item3 = '<td><input type="text" value="toto" name ="pays[ville]'+nb+']"></td>';
$( data + item1 + item2 + item3).appendTo('#tabBody');
}
});
});
});
Data dans la fonction du success est une récupération des pays sous forme de liste.
Bref, cela fonctionne assez bien, mais je trouve cela assez lourd, et puis le traitement est assez compliqué. J'avoue que dans ce cas là symfony a été d'une aide précieuse puisque gérant tout, tout seul.
si je comprend ce que tu souhaites, moi j'utilise les relations entre les tables. Dans ton cas, j'utiliserais une relation HABTM entre les pays et les personnes
Ok, Je crée une relation HABTM dans mon model Personne,
Je continue ma machinerie Ajax pour rajouter des lignes dans le sous formulaire country
en cas de soumission, dans mon PersonnesController j'ai
public function ajout(){
$donnees = $this->request->data;
$this->create($donnees);
$this->save($donnees);
}
J'ai bon ?
Et là la sauvegarde dans la table Personnnes, et dans la table de liaison de fait tout seul ?
Donc, sas besoin de faire des $var1 = new PaysVisite etc....... ?