Bonjour,

Dans le tutoriel PHP : Développer un site : Jour 3, les models (19:07), dans la méthode view($id) Grafikart charge le modèle et il utilise
la syntaxe

$posts = $this->Post->find(array(...))

J'ai un message d'erreur me disant ceci : Undefined property Controller::$Post.
En effet comment peut on utiliser une propriété Post alors que celle ci n'a pas été déclarée, bien que la méthode loadModel ci-dessous a pour but de charger le modèle.

public function loadModel($name) {
        $file = ROOT . DS . 'model' . DS . $name . '.php'; // dans le répertoire model
        require_once($file); // on inclus le fichier contenant le modèle
        if (isset($this->$name)) { // on vérifie toutefois que le fichier n'est pas déjà inclus
            $this->$name = new $name(); // on instancie le modèle
        }
    }

Merci d'avance.
Sophonie.

10 réponses


sophonie
Auteur
Réponse acceptée

[Résolu]
Le problème se situe dans la méthode loadModel($name) de la classe Controller.
En effet il faut vérifier que le nom du modèle ne soit pas déjà chargé pour pouvoir l'instancier. Ainsi il faut faire ceci :

// il faut obligatoirement tester que le nom du modèle ne soit pas déjà chargé
        if (!isset($this->$name)) { // si le nom du modèle n'est pas chargé
            $this->$name = new $name(); // alors on instancie le modèle
        }

Ne pas oublier le ! devant la fonction isset()

hello, tu dois justement charger ton model avant de faire ta req sql

$this->loadModel('Post');
$posts = $this->Post->find(array(...))

a plus

sophonie
Auteur

Justement j'ai fait un

$this->loadModel('Post')

au préalable puisque dans le répertoire Model il y a un fichier Post.php

heu bah ,peu etre un rapport mais,
deja le repertoir dois etre en minuscule
model
pour le fichier (c'est bon)
Post.php

<?php
class Post extends Model{
    var $validate = array(
        'name' => array(
            'rule' => 'notEmpty',
            'message' => 'Vous devez préciser un titre'
        ),
        'slug' => array(
            'rule' => '([a-z0-9\-]+)',
            'message' => "L'url n'est pas valide"
        )
    );

}

sinon donne plus de code de ta function view

sophonie
Auteur

Actuellement, je ne suis pas chez moi. Dès que je rentre je regarde tout cela et je te tiens au courant.
Merci encore.
Sophonie.

sophonie
Auteur
public function view($id) {
        $this->loadModel('Post');
        $posts = $this->Post->find(array(
            "conditions" => "id=1"
        ));
        print_r($posts);
    }

je croix que ta condition n'est pas formuler comme il faut ,
voila un exemple
ici les element envoyer a la vue sont placer dnas une array $d

function view($id, $slug) {
        // Pour l'affichage du post voulu
        $this->loadModel('Post');
        $d'post'] = $this->Post->findFirst(array(
            'fields' => 'Post.id',
            'conditions' => array('Post.online' => 1,'Post.id'=>$id,'Post.type'=>'post'),
        ));
        if(empty($d'post'])){
            $this->e404('Page introuvable'); 
        }
        $this->set($d);
    }

a bientot

Bonjour,
J'ai le même problème que Sophonie. Je suis le tutoriel à la lettre et je ne vois vraiment pas ce qui bloque l'execution de la fonction find()... Serait-ce un problème dans la déclaration de la fonction, dans la classe Model ?

sophonie
Auteur

Merci pour ta réponse nocraft0 ... mais ton code ne peut pas fonctionner ... tout au moins dans le contexte du tutoriel de Grafikart.
En effet, dans un premier temps la méthode view ne prend qu'un seul argument (je n'ai pas été plus loin dans la vidéo afin de savoir si Grafikart passait un second paramètre à la méthode).
Ensuite la méthode findFirst() n'existe pas, il s'agit de la méthode find($req) de la classe Model, et puis pour terminer le message d'erreur reste le même le modèle Post n'est apparemment pas chargé ... ou reconnu comme tel.

Merci Sophonie !!!!!!!! Merci merci merci !