Problème de modification

Par Kaoutar, il y a 11 ans


Bonjour,
je veux modifier un enregistrement dans une table nommée 'User'
Mais au lieu que ma ligne soit modifiée, j'ai une nouvelle ligne créée dans ma table!
Merci d'avance pour votre aide
voila ma fonction edit() definit dans mon controller

public function edit(){ $this->User->ID_USER = $this->Session->read('Auth.User.ID_USER'); $user = $this->User->find('all', array( 'fields' => array('User.nom','User.prenom','User.phone_user','User.adress_user','User.mail'), 'conditions' => array('User.ID_USER' => $this->Session->read('Auth.User.ID_USER')))); if($this->request->is('post') || $this->request->is('put')){ if($this->User->save($this->request->data)){ $this->Session->setFlash('Article modifié!'); $this->redirect(array('action'=>'index')); }else{ $this->Session->setFlash('Erreur lors de la modification!'); } } if(!$this->request->data){ foreach($user as $user): $this->request->data['User']['nom'] = $user['User']['nom']; $this->request->data['User']['prenom'] = $user['User']['prenom']; $this->request->data['User']['phone_user'] = $user['User']['phone_user']; $this->request->data['User']['adress_user'] = $user['User']['adress_user']; $this->request->data['User']['mail'] = $user['User']['mail']; endforeach; } }

12 réponses

Mikachu, il y a 11 ans

Salut,

Je penses que cela vient du probleme que te ne renseigne aucun id a modifier.

Tentes juste enter ta requete $user et la condition de mettre un $this->request->data['User']['ID_USER'] = $user['User']['ID_USER'];

A condition que ton champ id dans user est bien nommé ID_USER (car d'apres ta requete cela a l'air ainsi)

Kaoutar, il y a 11 ans

Merci pour votre reponse.
c'est deja fait (voir la premiere ligne de la fonction edit()) :

$this->User->ID_USER = $this->Session->read('Auth.User.ID_USER');

et meme quand je renseigne directement mon ID_USER (voir ci dessous) ça ne marche pas

$this->User->ID_USER = '1';
Romano83, il y a 11 ans

Salut,
tu peux montrer ton formulaire lié à l'édition stp ?
A mon avis, tu ne mets pas d'input avec l'ID au niveau de ton formulaire donc à chaque fois que tu veux modifier des informations, cakePHP croit que tu veux créer une nouvelle entrée...

Kaoutar, il y a 11 ans

Voila mon formulaire :

<div class="row col-lg-6 col-lg-offset-3 well"> <?php echo $this->Form->create('User'); ?> <div class="col-lg-8 col-lg-offset-2"><?php echo $this->Form->input('nom', array('label' => 'Nom','class' => 'form-control')); ?></div> <div class="col-lg-8 col-lg-offset-2"><?php echo $this->Form->input('prenom',array('label' => 'Prenom','class' => 'form-control')); ?></div> <div class="col-lg-8 col-lg-offset-2"><?php echo $this->Form->input('phone_user',array('label' => 'Telephone','class' => 'form-control')); ?></div> <div class="col-lg-8 col-lg-offset-2"><?php echo $this->Form->input('adress_user',array('label' => 'Adresse','class' => 'form-control')); ?></div> <div class="col-lg-8 col-lg-offset-2"><?php echo $this->Form->input('mail',array('label' => 'Email','class' => 'form-control')); ?></div> <div><?php echo $this->Form->input('ID_USER',array('type'=>'hidden')); ?></div> <div class="col-lg-8 col-lg-offset-2"><?php echo $this->Form->end("Modifier"); ?></div> </div>
Mikachu, il y a 11 ans

Si je comprends tu veux que le compte connécté puisse faire la modif de son article apres une authentificaiton, si oui, je penses que mes modifications peuvent t'aider:

public function edit(){ if($this->request->is('post') || $this->request->is('put')){ $this->request->data['User']['ID_USER'] = $this->Auth->user('ID_USER'); // Le true dans save() permet d'activer la validation if($this->User->save($this->request->data, true, array('liste des champs autorisé a etre sauvegardé') )){ $this->Session->setFlash('Article modifié!'); return $this->redirect(array('action'=>'index')); }else{ $this->Session->setFlash('Erreur lors de la modification!'); } } else { $this->request->data = $this->User->findById($this->Auth->user('ID_USER'); } }

Source poru le save: http://book.cakephp.org/2.0/fr/models/saving-your-data.html#model-save-array-data-null-boolean-validate-true-array-fieldlist-array

Kaoutar, il y a 11 ans

Je ne peux pas utiliser le findById() parce que j'ai pas respecté la convention cakephp pour la nomination du id, alors je preserve mon find()
j'ai ajouté : $this->request->data['User']['ID_USER'] = $this->Auth->user('ID_USER'); mais j'ai toujours le meme probleme !!
voila mon code en entier :

public function edit(){ $user = $this->User->find('all', array( 'fields' => array('User.ID_USER','User.nom','User.prenom','User.phone_user','User.adress_user','User.mail'), 'conditions' => array('User.ID_USER' => $this->Session->read('Auth.User.ID_USER')))); if($this->request->is('post') || $this->request->is('put')){ $this->request->data['User']['ID_USER'] = $this->Auth->user('ID_USER'); if($this->User->save($this->request->data,true,array('nom','prenom','phone_user','adress_user','mail'))){ $this->Session->setFlash('Article modifié!'); $this->redirect(array('action'=>'index')); }else{ $this->Session->setFlash('Erreur lors de la modification!'); } } if(!$this->request->data){ foreach($user as $user): $this->request->data['User']['ID_USER'] = $user['User']['ID_USER']; $this->request->data['User']['nom'] = $user['User']['nom']; $this->request->data['User']['prenom'] = $user['User']['prenom']; $this->request->data['User']['phone_user'] = $user['User']['phone_user']; $this->request->data['User']['adress_user'] = $user['User']['adress_user']; $this->request->data['User']['mail'] = $user['User']['mail']; endforeach; } }
Mikachu, il y a 11 ans

Alors remplace le findById par un simple find('first');

public function edit(){ if($this->request->is('post') || $this->request->is('put')){ $this->request->data['User']['ID_USER'] = $this->Auth->user('ID_USER'); // Le true dans save() permet d'activer la validation if($this->User->save($this->request->data, true, array('liste des champs autorisé a etre sauvegardé') )){ $this->Session->setFlash('Article modifié!'); return $this->redirect(array('action'=>'index')); }else{ $this->Session->setFlash('Erreur lors de la modification!'); } } else { //$this->request->data = $this->User->findById($this->Auth->user('ID_USER'); $this->request->data = $this->User->find('first', array( 'conditions' => array('User.ID_USER' => $this->Auth->user('ID_USER')) )); } }
Kaoutar, il y a 11 ans

Merci beaucoup pour votre aide, mais ça ne fonctionne pas toujours
je suis encore entrain de chercher une solution

Mikachu, il y a 11 ans

As tu bien repris la méthode edit que j ai posté, et testé?

JC_Pires, il y a 11 ans

As tu bien précisé dans ton model, le changement que tu as opéré sur ta table?

public $primaryKey = 'ID_USER';
Kaoutar, il y a 11 ans

Merci beaucoup, justement il fallait preciser dans le model que j'ai opéré sur la table. ça fonctionne parfaitement maintenant. voila mon code final :

public function edit() { $user = $this->User->find('first', array( 'conditions' => array('User.ID_USER' => $this->Auth->user('ID_USER')))); if (!$user) { throw new NotFoundException(__('Compte invalide')); } if($this->request->is('post') || $this->request->is('put')){ $this->User->ID_USER = $this->Auth->user('ID_USER'); if($this->User->save($this->request->data, false, array('nom','prenom','phone_user','adress_user','mail'))){ $this->Session->setFlash(__('Informations bien modifiées.')); return $this->redirect(array('action' => 'index')); } $this->Session->setFlash(__('Erreur lors de la modification!')); } if (!$this->request->data) { $this->request->data = $user; } }
JC_Pires, il y a 11 ans

N'oubli pas que si tu ne veut pas respecter les conventions, il faut reconfigurer certains paramètres. Je le fais tout le temps pour les noms de table par exemple.