Bonjour,
Voila je rencontre un petit problème avec mon code.
je voudrais a partir d'une Form saisie multiple (nom, présence - checkbox) pouvoir clicker surles checkbox de cette liste pour mettre à jour la es personnes présentes bdd.

Dans le controleur
NomsController.php

public function updatemulti(){

        $this->paginate = array('Nom' => array('limit' => 10)); 
        $d['nomcoches'] = $this->Paginate('Nom'); 
        //var_dump($d);
        if($this->request->is('post') || $this->request->is('put') ){
            $data = $this->request->data;

            if (isset($data['Nom']['present']) && count($data['Nom']['present']) > 0) { 
                foreach($data['Nom'] as $k => $v) { 
                    $this->Nom->updateAll(array('present' => $k));         
                }
            $this->Session->setFlash("Les utilisateurs present sont à jour"); //message OK
            }
            $this->redirect($this->referer()); //redirection
        }
        $this->set($d);     
} 

Dans la vue updatemulti.ctp

<?php echo $this->Form->create('Nom'); ?>
    <table class="table table-striped table-bordered">
        <thead>
            <tr>

                <th>Id</th>
                <th>Nom / prénom</th>
                <th>present</th>

            </tr>
        </thead>
        <tbody>
            <?php 
            foreach($nomcoches as $k => $v) : $v = current($v); 
                //var_dump($v);?>
                <tr>
                     <td><?php echo $v['id']; ?></td>
                     <td><?php echo $v['nom'].' '.$v['prenom'];?></td>

                    <td><input name="data[Nom][present]" value="<?php echo $v['present']; ?>" id="ModelName1" type="checkbox" <?php echo (($v['present'] ==1 ? "checked" : ""));?>></td>

                </tr>
            <?php endforeach; 
            //var_dump($nomcoches);?>
        </tbody>
    </table>

    <?php echo $this->Form->button(' mettre à jour', array('div'=>false, 'name'=>'updatemulti')); ?>
    <?php echo $this->Form->end(); ?>
J'arrive à cocher les présents, le bouton marche, le Flash aussi mais la mise à jour de l'enregistrement ne se fait pas.
Table noms: -- Structure de la table noms

CREATE TABLE noms (
id int(11) NOT NULL,
nom varchar(11) COLLATE utf8_bin NOT NULL,
prenom varchar(11) COLLATE utf8_bin NOT NULL,
present tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='sans';

8 réponses


BerAix
Auteur
Réponse acceptée

Merci pour cette bonne idée.

Je ne comprend pas pourquoi ton updateAll est dans une boucle!
Model::updateAll(array $fields, mixed $conditions)

Les enregistrements à mettre à jour sont identifiés par le tableau $conditions. Si l’argument $conditions n’est pas fourni ou si il n’est pas défini à true, tous les enregistrements seront mis à jour.

BerAix
Auteur

Effectivement, c'est une piste à suivre.
En fait dans mon esprit la boucle est là pour prendre en compte uniquement les lignes qui ont changé au niveau des checkbox.
Mais je vais essayer autrement en réalisant la sauvegarde en seul coup sans la boucle. Je ne sais pas si mon Form transmets correctement des enregistrements assimilables par le updateAll. Où trouve t on le formatage correct.

Tu peu toujours garder ta boucle et faire un saveField à la palce du updateAll.

BerAix
Auteur

Voilà un truc qui marche mais pas très élégant

//
// Noms Controller.php
//

public function updatemulti(){

    $this->paginate = array('Nom' => array('limit' => 10)); 
    $d['nomcoches'] = $this->Paginate('Nom'); 
    //var_dump($d);

    if($this->request->is('post') || $this->request->is('put') ){
        $data = $this->request->data;
        //print_r($data);
        if (isset($data) ) { 
            $i=0;
           foreach($data as $k=>$v) { 
               //print_r($v);
               if ($i>0 ){ 
                   if (isset($v['present'])  ){ 
                       $p=1;
                       }else{
                       $p=0; 
                    } 
               $this->Nom->updateAll(array('present'=>$p),array('id'=>$v['id'])); 
               }
           $i=$i+1;
           }
        $this->Session->setFlash("Les utilisateurs present sont à jour"); //message OK
        }
        $this->redirect($this->referer()); //redirection
    }
    $this->set($d);     

}

//
// updatemulti.ctp
//

<?php echo $this->Form->create('Nom'); ?>
<table class="table table-striped table-bordered">
<thead>
<tr>

            <th>Id</th>
            <th>Nom / prénom</th>
            <th>present</th>

        </tr>
    </thead>
    <tbody>
        <?php 
        $i=0;
        foreach($nomcoches as $k => $v) : $v = current($v); 
            ?>
            <tr>
                 <td><?php echo $v['id']; ?></td>
                 <td><?php echo $v['nom'].' '.$v['prenom'];?></td>
                <td><input name="data[<?php echo $i ?>][id]" value="<?php echo $v['id']; ?>" type="hidden" ></td>
                <td><input name="data[<?php echo $i ?>][present]" value="<?php echo $v['present']; ?>" id="ModelName1" type="checkbox" <?php echo (($v['present'] ==1 ? "checked" : ""));?>></td>

            </tr>
        <?php $i=$i+1;
        endforeach; 
        //saveField?>
    </tbody>
</table>

<?php echo $this->Form->button(' mettre à jour', array('div'=>false, 'name'=>'updatemulti')); ?>
<?php echo $this->Form->end(); ?>

Effectivement,

1) pas besoin de déclarer $i pour un foreach
2) $p = (isset($v['present']))? 1 : 0 ;
3) je comprend pas ton updateAll dans la boucle.

En gros c'est beaucoup de code pour rien, mais si ça fonctionne et que c'est ce qui compte pour toi, c'est le princiaple.

BerAix
Auteur

Merci pour ces infos,
voici la dernière version:
'''''
//
// Noms Controller.php
//

public function updatemulti(){

$this->Nom->recursive = 0;
$this->paginate=array('Nom' =>  array('limit' => 6));
if($this->request->is('post') || $this->request->is('put') ){
        $data = $this->request->data;
        if (isset($data) ) { 
           foreach($data as $k=>$v) {
               isset($v['id']);
               if (isset($v['id']) ){ 
               (isset($v['present']))? $p=1: $p=0; 
               $this->Nom->id =$v['id'];
               $this->Nom->saveField('present', $p);
               }
           }
           $this->Session->setFlash("Les utilisateurs present sont à jour"); //message OK
        }
        $this->redirect($this->referer()); //redirection
    }
    $d['nomcoches'] = $this->Paginate('Nom'); 
    $this->set($d);     
}

'''''

Bonjour.
Je te recommande de modifier la ligne suivante :

(isset($v['present']))? $p=1: $p=0;

Par :

$p = isset($v['present']) ? 1 : 0;

Étant donné que tu ne te sert de la variable qu'une seule fois / qu'à un seul endroit, tu peux même faire :

$this->Nom->saveField('present', isset($v['present']) ? 1 : 0);

Ce qui te fera une ligne de code en moins et une variable de moins à définir.