Bonjour,
Ca fait des heures que je m'arrache les cheveux pour ça alors que l'erreur doit être toute bête...
Lorsque je suis dans ma fonction admin_edit pour users, la sauvegarde ne se fait pas. j'ai pourtant la notif qui me dit que L'utilisateur a bien été enregistré mais la sauvegarde ne se fait pas... WHY ?
Voici mon code dans UsersController :
function admin_edit($id=null){
if($this->request->is('post') || $this->request->is('put') ){
$d = $this->request->data'User'];
if($d'password'] != $d'passwordconfirm']){
$this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'errror'));
}else{
if(empty($d'password']))
unset($d'password']);
if($this->User->save($d)){
$this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
}
}
}elseif($id){
$this->User->id = $id;
$this->request->data = $this->User->read('username,role,id');
}
$d = array();
$d'roles'] = array(
'admin' => 'admin',
'user' => 'membre'
);
$this->set($d);
}
Si l'un de vous voit où est le problème, je le remercie d'avance.
J'ai eut le même problème et cela ne concerne que le controller User à priori :
$this->User->save($this->request->data) ce que tu écrit est bon, mais tu dois ajouter la liste des champs à la demande du save ainsi que true en 2eme parametre.
Exemple :
$this->User->save($this->request->data,true,array('firstname','lastname','mail')
Ton problème d'enregistrement sera résolu.
Salut,
dans mon code j'ai mis ceci à la ligne 9 et ça fonctionne.
if($this->User->save($this->request->data)){
ha, pas cool ça. Comment visualises tu l'insertion ? Est ce que tu n'aurais pas une méthode beforeSave() ou afterSave() qui parasiterait le système ? Est ce que tes données sont bien écrites aussi ?
Pour le beforesave et aftersave voila le model
<?php
/ ******************************************************************************************
* MODEL POST fonctions liées au PostsController
***************************************************************************************** /
class Post extends AppModel{
public $actsAs = array('containable');
public $hasMany = array(
'Media' => array(
'dependent' => true
),
'PostTag'
);
public $belongsTo = array(
'Category' => array(
'counterCache' => array('post_count' => array('Post.online'=>1))
)
);
public $hasAndBelongsToMany = array('Tag');
public $recursive = -1;
public $validate = array(
'slug' => array(
'rule' => '/^[a-z0-9\-]+$/',
'allowEmpty' => true,
'message' => "L'url n'est pas valide"
),
'name' => array(
'rule' => 'notEmpty',
'message' => "Vous devez preciser un titre"
)
);
public $order = 'Post.created ASC';
/**
* Permet de générer un brouillon
*/
public function getDraft($type){
$post = $this->find('first',array(
'conditions' => array('online' => -1, 'type' => $type)
));
if(empty($post)){
$this->save(array(
'type' => $type,
'online' => -1
),false);
$post = $this->read();
}
$post'Post']'online'] = 0;
return $post;
}
public function afterFind($data){
foreach ($data as $k => $d) {
if (isset($d'Post']'slug']) && isset($d'Post']'id']) && isset($d'Post']'type'])) {
$d'Post']'link'] = array(
'controller' =>Inflector::pluralize($d'Post']'type']),
'action' =>'show',
'id' =>$d'Post']'id'],
'slug' =>$d'Post']'slug']
);
}
$data$k] = $d;
}
return $data;
}
public function beforeSave(){
if (empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name']))
$this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'],'-'));
return true;
}
public function afterSave(){
if(!empty($this->data'Post']'tags'])){
$tags = explode(',',$this->data'Post']'tags']);
foreach($tags as $tag){
$tag = trim($tag);
if(!empty($tag)){
$d = $this->Tag->findByName($tag);
if(!empty($d)){
$this->Tag->id = $d'Tag']'id'];
}else{
$this->Tag->create();
$this->Tag->save(array(
'name' => $tag
));
}
$this->PostTag->create();
$this->PostTag->save(array(
'post_id' => $this->id,
'tag_id' => $this->Tag->id
));
}
}
}
return true;
}
}
et le sql dump me retourne ça
SELECT COUNT(*) AS count
FROM users
AS User
WHERE User
.username
= 'dzqd'
dzqd etant le nom que j'ai mis au pif pour essayer ^^
Tu nous a donné le Model Post, c'est le Model User qu'il nous faut. Pour le sql dump, tu nous montres bien la requête SQL effectuée mais pas la réponse :).
Quel idiot je fais ^^
Voilà le bon Model :D
<?php
class User extends AppModel{
public $hasMany = array(
'Media' => array(
'dependent' => true
)
);
public $validate = array(
'username' => array(
array(
'rule' => 'alphanumeric',
'required' => true,
'allowEmpty' => false,
'message' => "Ce nom d'utilisateur n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => "Ce nom d'utilisateur est déjà pris"
)
),
'mail' => array(
array(
'rule' => 'email',
'required' => true,
'allowEmpty' => false,
'message' => "Cet email n'est pas valide"
),
array(
'rule' => 'isUnique',
'message' => "Cet email est déjà pris"
)
),
'password' => array(
'rule' => 'notEmpty',
'message' => "Vous devez preciser un mot de passe",
'allowEmpty' => false
)
);
function beforeSave($options = array()){
if(!empty($this->data'User']'password'])){
$this->data'User']'password'] = AuthComponent::password($this->data'User']'password'],null,true);
return true;
}
}
}
Alors j'ai pas compris pour la réponse ^^ Comment on voit la réponse et non la requête ?
Dans ton sql dump, tu as un tableau contenant plusieurs colonnes (Nr, Query, Error affected, Num rows, took). Tu ne nous a donné que Query, du coup on a la requête mais pas le résultat, il nous faudrait les champs suivants.
Peux tu faire un debug($this->request->data) juste avant ta ligne 9 dans ton admin_edit et nous copier ce qu'il en ressort ?
Voilà le debug :
app/Controller/UsersController.php (line 77)
Array
(
[User] => Array
(
[username] => dzqd
[description] => dqzd
[password] => aze
[passwordconfirm] => aze
[role] => admin
[id] =>
)
)
et la réponse
Error
Affected 1
Num row 1
Took(ms) 0
Ok bah visiblement cela à l'air de l'avoir créé. Tu n'as vraiment rien dans ta base de données ? Tu peux regarder avec phpMyAdmin par exemple.
Nop rien de rien :'( Et si j'enlève les lignes 7/8 j'ai ma notif comme quoi l'utilisateur est bien enregistré. Mais si je les laisse j'ai pas de notif du tout. peut-être que le problème viendrait de là ?
En effet il n'y était pas ... fausse manip de ma part s'en doute et j'ai du l'enlever, cependant ça ne marche pas mieux :(
Voilà :)
--
-- Structure de la table users
--
CREATE TABLE users
(
id
int(11) NOT NULL AUTO_INCREMENT,
username
varchar(255) NOT NULL,
mail
varchar(255) NOT NULL,
password
varchar(255) NOT NULL,
passwordconfirm
varchar(255) NOT NULL,
phone
int(11) NOT NULL,
media\_id
int(11) NOT NULL,
active
int(11) NOT NULL DEFAULT '1',
role
varchar(60) NOT NULL,
description
text NOT NULL,
location
varchar(255) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
Ce n'est pas nécessaire de sauvegarder le champ 'passwordconfirm'.
Essaye ça:
UsersController.php
function admin_edit($id=null){
if($this->request->is('post') || $this->request->is('put') ){
$d = $this->request->data'User'];
if($d'password'] != $d'passwordconfirm']){
$this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'errror'));
}else{
if($this->User->save($this->request->data)){
$this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
}
}
}elseif($id){
$this->request->data = $this->User->findById($id);
if($id) {
unset($this->request->data'User']'password']);
}
}
//$d = array();
$d'roles'] = array(
'admin' => 'admin',
'user' => 'membre'
);
$this->set($d);
}
User.php
function beforeSave($options = array()){
if(!empty($this->data'User']'password'])){
$this->data'User']'password'] = AuthComponent::password($this->data'User']'password']); // il n'y a qu'un paramètre à entrer
return true;
}
}
Oulà, ça m'intrigue ça ! Pourrais tu nous envoyer un zip de ton projet simplifié avec juste la partie users stp ?
Je regarderai ça la semaine prochaine.
En espérant que tu aies une réponse avant.
Oulà, ça m'intrigue ça ! Pourrais tu nous envoyer un zip de ton projet simplifié avec juste la partie users stp ?
Je regarderai ça la semaine prochaine.
En espérant que tu aies une réponse avant.
D'accord je te fais ça dans le week end. Merci pour ton aide en tout cas ;) Un mail peut-être pour l'envoi du ZIO :D
Oh YEAH!!!! Merci philieric le problème est résolu. A quoi correspond le true en deuxième paramètre ? Et pourquoi ça ne fait ça que sur User ?
Encore merci!