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.

26 réponses


philieric
Réponse acceptée

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)){
SwithFr
Auteur

Merci pour cette réponse mais non ça ne marche pas mieux :'(

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 ?

SwithFr
Auteur

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 :).

SwithFr
Auteur

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 ?

SwithFr
Auteur

Petit up :)

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 ?

SwithFr
Auteur

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.

SwithFr
Auteur

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à ?

Ces lignes là ne sont pas utiles en effet, tu peux les enlever.

SwithFr
Auteur

Ok. Mais bon c'est étrange comme problème n'empêche ^^

Il essaye d'enregistrer passwordconfirm mais y a pas le champs dans ta base ?

SwithFr
Auteur

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 :(

montre nous la structure de ta table =)

SwithFr
Auteur

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;
        }

    }
SwithFr
Auteur

Merci pour vos pistes et votre aide mais aucune différences. Malédiction ?

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.

SwithFr
Auteur

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

EDIT : @email supprimée par l'auteur

SwithFr
Auteur

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!

merci cela ma aider a corriger l erreur (j avais le meme souci ^^)