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;
}
}
As tu bien précisé dans ton model, le changement que tu as opéré sur ta table?
public $primaryKey = 'ID_USER';
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)
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';
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...
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>
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
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;
}
}
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'))
));
}
}
Merci beaucoup pour votre aide, mais ça ne fonctionne pas toujours
je suis encore entrain de chercher une solution
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;
}
}
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.