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.
[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
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
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.
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 ?
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.