Construction d'un sous formulaire

Par netchaiev, il y a 12 ans


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

8 réponses

Digikube, il y a 12 ans

Il n'y a pas de formulaire imbriqué dans CakePHP à ma connaissance :(

netchaiev, il y a 12 ans

Salut Flourt,

Donc si je comprends bien, on fonctionne à l'ancienne ?

philieric, il y a 12 ans

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'];
netchaiev, il y a 12 ans

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.

philieric, il y a 12 ans

Oui, c'est vrai, tu soumets soit l'un ou l'autre formulaire

netchaiev, il y a 12 ans

Tu vois une autre solution ?

philieric, il y a 12 ans

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

netchaiev, il y a 12 ans

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