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.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';
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.
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.
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.
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.