call to a member function save() on a non-object

Par Prescillia Nierichlo, il y a 11 ans


J'essai de créer un nouveau mdp et il me retourne cette erreur : "call to a member function save() on a non-object L.14"

function add(){
        $this->layout = 'admin';
        $data=array();
        $data'User']'username']='blabla';
        $data'User']'password']='blabla';
        $this->User->save($data); <= ligne 14
    }

Je ne vois pas ou est le problème ><

Merci d'avance de votre aide

9 réponses

Archein89, il y a 11 ans

Si je ne me trompe pas il faut faire un create avant le save:

public function add() {
        if ($this->request->is('post')) {
            $this->User->create();

            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The User has been saved.'));
                return $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The license could not be saved. Please, try again.'));
            }
        }
    }
Elsenthil, il y a 11 ans

Salut

Ton modèle est-il bien chargé ? sinon utilise

$this->loadModel('tonmodele');

Sinon ça bloque peut être au niveau de mot de passe... regarde du coté du hash.

Prescillia Nierichlo, il y a 11 ans

Marius89 : le truc c'est qu'avec cette fonction je créer un utilisateur avec les id et mdp blabla en allant sur la page add.
Or dans la fonction que tu ma donné ce n'est pas le cas ?

Elsenthil : j'ai déjà pu crée un utilisateur de cette manière ! Seulement j'ai repris complètement le code j'ai juste refait toute la partie graphique pour un autre site donc j'ai besoin d'avoir un autre mdp... Mais la ça ne fonctionne plus...

Elsenthil, il y a 11 ans

Salut

J'ai testé ton code avec le nom de mes champs bien sûr et ça marche bien, alors le problème vient sans doute de ton modèle ou de ta vue. tu peux poster la partie concernée pour qu'on voit ce qui peut bloquer ton script ? Mais je maintiens que ce genre d'erreur vient sans doute du modèle.

Dans ton exemple tu remplis 2 champs : username et password est ce que t'es sûr de ne pas avoir oublié un champs requis dans ton modèle ? Essaye de désactiver les règles de validation de User dans ton modèle pour voir si ça passe.

Prescillia Nierichlo, il y a 11 ans

voici mon model

<?php
    class User extends AppModel {
        var $name="User";
        function beforeSave($options = array()){
            $this->data$this->name]'password']=Security::hash($this->data$this->name]'password'],null,true);
            return true;
        }
    }
?>

mais je n'ai pas de vue associé ? dans le tuto c'était juste en tappant /add que ça créait le MDP

Lartak, il y a 11 ans

Pour commencer, dans ton controller, il ne faut pas mettre

$data'User']'username']

mais

$this->request->data'User']'username']

(par exemple)
Ensuite, remplaces

$this->name]

par

$this->alias]

dans le beforeSave de ton model.
Pour la fonction add, il te faut forcément la vue associée pour créer le nouvel utilisateur, sauf si le formulaire se trouve dans une autre vue, mais dans ce cas là, je ne vois pas l'intérêt de désigner un layout dans l'action add.
Encore mieux, si tu veux faire ta fonction un minimum correctement, fais comme ceci par exemple :

public function add(){
        $this->layout = 'admin';
        if ($this->request->is('post') && !empty($this->request->data)) {
            $this->User->create($this->request->data);
            if($this->User->save()) {
                $this->Session->setFlash("L'utilisateur a bien été ajouté"); // À adapter à ton système bien sûr
            }
        }
        return $this->redirect(array('action' => 'index')); // par exemple
    }
Prescillia Nierichlo, il y a 11 ans

Donc je créée une vue comme pour le login avec un champ username et password ?

Lartak, il y a 11 ans

Pour ajouter un utilisateur c'est mieux. :)
Tu crées la vue add.ctp, tu y met ton formulaire et puis voilà.
Sinon tu crées ton formulaire dans une autre vue et tu spécifies l'action add dans le create du helper Form.
Ça dépend ce que tu veux, sinon tu peux faire les deux aussi, l'un empêche pas l'autre.
Tu adaptes le code de l'action selon ton choix.

Prescillia Nierichlo, il y a 11 ans

Alors j'ai enlever la redirection parce que ça faisait un gros bines par contre j'ai une FATAL ERROR

Error: Call to a member function create() on a non-object
File: C:\wamp\www\YOANN2\app\Controller\UsersController.php
Line: 21

voila mon controller :

<?php
    class UsersController extends AppController {
        public $uses = array('Post');
        var $name = "Users";

    /*function admin_add(){
        $data=array();
        $this->request->data'User']'username']='***';
        $this->request->data'User']'password']='***';
        $this->User->save($data);

    }*/
    public function add(){
    if ($this->request->is('post') && !empty($this->request->data)) {
        $this->User->create($this->request->data);
        if($this->User->save()) {
            $this->Session->setFlash("L'utilisateur a bien été ajouté"); // À adapter à ton système bien sûr
        }
    }

}

     function login() {

        if($this->request->is('post')){
            if($this->Auth->login()){
                return $this->redirect($this->Auth->redirect()); 

            }else{
                $this->Session->setFlash("Votre login ou votre mot de passe ne correspond pas");
            }
        }

    }
        function admin_logout(){
        $this->Auth->logout();
        $this->Session->setFlash("Vous êtes maintenant déconnecté","notif");
        $this->redirect('/');
        }

    }

    ?>