Bonjour à tous,

Je précise que je refais complètement mon dernier post auquel personne ne comprenait rien je suppose...

J'ai :

  • Une table indivs avec les données classiques sur des individus (nom, prenom, date_naissance etc...)
  • Une table countries avec le nom de tous les pays
  • une table de liaison countries-indivs puisque j'ai une relation HABTM.

Cette table de liaison a d'autres attributs texte et checkbox.

La donnée de base est que je dois créer un formulaire qui permettent d'enregistrer les infos sur les individus et celles concernant les pays visités. Une personne doit donc pouvoir insérer une ligne (ou plusieurs) de la table de liaison en fonction du nombre de pays visités.

J'ai donc une vue indivs comme cela

// avant 'y a le début de la vue
<?php echo $this->Form->input('nom', array('label'=>'Votre nom : ', 'placeHolder'=>'Votre Nom', 'size'=>100)); ?>
<?php echo $this->Form->input('prenom', array('label'=>'Votre prénom : ')); ?>
<?php echo $this->Form->input('date_naiss', array('type'=>'text','dateFormat'=>'D/M/Y','label'=>'Date de Naissance : ')); ?>
<?php echo $this->Form->input('nationalite', array('label'=>'Votre nationalité : ','options'=>$countries)); ?>

.../...
<div id="tabs-3">
    <table id='TabPays'>
        <thead>
            <tr>
          <th>Pays</th>
          <th>Nombre d'années</th>
          <th>Ville</th>
          <th>Avis</th>
          <th>Raisons du départ</th>
          <th>Ajouter</th>
            </tr>
    </thead>
        <tbody id='tabBody' class="body">
        <tr id="line1" class="line">
            <td><?php echo $this->Form->input('CountryR.pays', array('label'=>false,'options'=>$countries)); ?></td>
            <td><?php echo $this->Form->input('CountryR.nb_annees', array('label'=>false, 'type'=>'text')); ?></td>
            <td><?php echo $this->Form->input('CountryR.ville', array('label'=>false, 'type'=>'text')); ?></td>
            <td><?php echo $this->Form->input('CountryR.avisPositif', array('label'=>false, 'type'=>'checkbox')) ;?></td>
            <td><?php echo $this->Form->input('CountryR.raison_depart', array('label'=>false, 'type'=>'text')) ;?></td>
            <td><?php echo $this->Form->button('supprimer', array('class'=>'suppr','type'=>'button',
                                            onclick'=>"$(this).closest('tr').remove();")); ?></td>
       </tr>
        </tbody>
    </table>
    <input type="button" id="addPays" value ="Ajouter un pays"/>
</div>

Pour rajouter une ligne pays j'ai une fonction javascript :

$('#addPays').click(function(){
    var nb = $('.line').length;
    $('#line1').clone().appendTo('#tabBody');
    nb +=1;
    $ligne = $('.body tr:last-child');
    $ligne.attr('id', 'line'+nb);
});

L'insertion de nouvelles lignes se passe sans problème. Là où cela se corse c'est que les champs d'une ligne ont le même nom que les champs de la ligne précédente. Donc l'insertion en base ne prend que la dernière ligne.

En fait j'ai par exemple pour le champ 'Ville' : name = data[CountryR][ville].
et je devrais avoir
pour la ligne 1 : name = data[CountryR][0][ville]
pour la ligne 2 : name = data[CountryR][2][ville]
pour la ligne 3 : name = data[CountryR][3][ville]
etc...

D'où la question : Comment faire pour changer automatiquement le nom d'un champ ?

Si vous avez des réponses, je suis super preneur

Bonne suite de journée

4 réponses


Grafikart
Réponse acceptée

Faut que tu créer ta génération de champs en Javascript en renommant les name à la volée (à toi d'écrire le code en revanche)

netchaiev
Auteur
Réponse acceptée

Bon çà y est j'ai trouvé la solution : j'avais une erreur sur la construction de mon script AJAX et un problème de boucle dans l'action "ajout" de mon controller.
J'aimerai bien que vous me donniez vos avis sur la procédure que j'ai suivi, histoire que j'améliore ma technique de Cake

voici les modifs

LE Controller

public function ajout(){
      $transf = new utils; // C'est une classe que j'ai construit qui contient des méthodes utiles genre changement de format de dates etc...
            // Si la requete est en POST et non vide
      if($this->request->is('POST')&& !empty($this->request->data)){

                  / *******************************************
                  * SAUVEGARDE DES INFOS DANS LA TABLE INDIVS*
                  ********************************************* /

         $date = $this->request->data'Indiv']'date_naiss'] ; 
            // On sauvegarde les informations dans la table Indiv
         $this->request->data'Indiv']'date_naiss'] = $transf->dateFrSql($this->request->data'Indiv']'date_naiss']);
         // Les infos de la requete sont mises dans la variable donnees
         $donnees = $this->request->data;
         $donneesPays = $this->request->data'CountryR'];

         $indivo = $this->Indiv->save($donnees);

                  / ******************************************************
                  * SAUVEGARDE DES INFOS DANS LA TABLE COUNTRIES_INDIVS *
                  ****************************************************** /

         foreach ($donneesPays as $value) {
            $this->Indiv->CountryR->create();
            $value'indiv_id'] = $this->Indiv->id;
            if(!$value'legalite'] ){ $value'legalite']=0;}
            $this->Indiv->CountryR->save($value);
         }
            $this->Indiv->CountryR->save(array(
         // Ici l'id généré par la sauvegade dans Indiv est récupéré puis injecté dans la table de liaison
                  'indiv_id' =>$this->Indiv->id,
                   'country_id'=>$value'country_id']
                                          ));
                  / *********************************************
                  * SAUVEGARDE DES INFOS DANS LA TABLE MEDICALS*
                  ********************************************* /

         if(!empty($indivo)){
            $this->request->data'Medical']'indiv_id'] = $this->Indiv->id;

            $this->Indiv->Medical->save($this->request->data);
            $trtr = $this->Indiv->findById($this->Indiv->id);
            $trtr'Indiv']'medical_id'] = $trtr'Medical']'id'];
            $this->Indiv->save($trtr);
         }

L'action "ajout_pays" du même controller qui traite la requete AJAX

Public function ajout_pays(){

      if ($this->request->is('ajax')){
         $paysList = $this->Indiv->Country->find('list');
         $nb = $this->request->data'nb'];

      $list = '<tr><td><select id="pays" name="data[CountryR]'.$nb.'][country_id]" class="pays">';
         foreach ($paysList as $key => $val) {
            $list .= '<option value = '.$key.'>'.$val.'</option>';
         }
      $list .= '</select></td>';
      echo ($list);
      }
   }

La fonction AJAX :

$(document).ready(function(){                                   

    $('#addPays').click(function(){
        var nb = $('.pays').length; // Recupere le nombre de lignes "pays visites"

         var donnees = 'nb='+nb;

         $.ajax({
            url: 'ajout_pays',
            type:'post',
            data: donnees,
            success: function(data){
                var item1 = '<td><input type="text" name ="data[CountryR]'+nb+'][nb_annees] "></td>';
                var item2 = '<td><input type="checkbox" value= 1 name ="data[CountryR]'+nb+'][legalite]"></td>';
                var item3 = '<td><input type="text" name ="data[CountryR]'+nb+'][ville]"></td>';
                var item4 = '<td><input type="text" name ="data[CountryR]'+nb+'][raison_Depart]"></td>';
                var item5 = '<td><input type="button" onclick="$(this).closest(\'tr\').remove();" value="supprimer" 
                                                    class="suppr" id="'+nb+'suppr"></td></tr>'

                $( data + item1 + item3 + item2 + item4 +item5).appendTo('#tabBody');

            }
         });

Heu... Personne n'a d'idée ?

Salut,

C'est que j'avais fait auparavant avec tout un bouzin en Ajax. Malheureusement, le bouton de suppression de ligne ne fonctionne pas puisque n'étant pas présent à l'origine dans le DOM.

Si tu veux je peux te montrer ce que j'avais fait et cela fonctionnait mais pas au niveau de la suppression des lignes.