Bonjour,
tout d'abord bravo pour les tutoriels, ils sont vraiment géniaux...
je refais les tutos de jour1 à jour4, et pour le moment (jour3), je suis face à un problème (j'utilise la version 2.1.3 de CakePhp) :
après avoir déclaré la variable belongsTo dans le modèle Post, j'ai effectivement changé, dans PostsController :
Dans "function category" :
$this->loadModel('Category');
$cat = $this->Category->find('first', array('conditions' => array('slug' => $category)));
par
$cat = $this-><strong>Post-></strong>Category->find('first', array('conditions' => array('slug' => $category)));
Fonctionne correctement.
Mais dans la méthode admin_edit , les mêmes modifications ne fonctionnent pas :
remplacement de
$this->loadModel('Category');
$d'categories'] = $this->Category->find('list');
par
$d'categories'] = $this->Post->Category->find('list');
J'ai l'erreur suivante quand je veux afficher un article dans la partie admin (admin/posts/edit/1) :
"Fatal error: Call to a member function find() on a non-object in <CHEMIN>\app\Controller\PostsController.php on line 237"
Si quelqu'un a une solution...
Merci
Frédéric
De rien, si cela peut te rassurer, je passe parfois des heures à chercher ce genre d'erreurs, et je porte déjà des lunettes !!!
N'oublie pas de mettre ton sujet en résolu...
A+
As tu bien fait ta liaison belongsTo dans ton modèles ?
Peux tu mettre ta fonction complète admin_edit, ton model et la ligne de ta vue admin_edit concernant la catégorie.
Merci, mais le problème ne viendrait-il pas de la version de cakePhp 2.1.3 alors que le tuto est fait à partir de la 2.0 ?
De plus, pour que ce fonctionne, j'ai été obligé de modifier la vue 'show.ctp' en remplaçant <?php echo $post' Category']'name']?> par <?php echo $post' category']'name']?> (avec un 'c' minuscule !).
Voici ma fonction admin_edit :
public function admin_edit($id = null) {
if($this->request->is('put') || $this->request->is('post')) {
if($this->Post->save($this->request->data)) {
$this->Session->setFlash('Modification effectuée', 'notif');
if(isset($this->request->data'saveonly']) && !empty($this->request->data'saveonly']))
$this->redirect($this->referer());
else
$this->redirect(array('action' => 'index'));
}
elseif($id) {
$this->Post->validates();
// pour utiliser correctement les erreurs dans le formulaire avec le bootstrap Twitter 2
$arr = $this->Post->invalidFields();
$this->Session->setFlash('Modification impossible', 'notif', array('type' => 'error'));
$this->Post->id = $id;
$this->request->data = $this->Post->read();
foreach($arr as $k => $v) {
$v = current($v);
$this->request->data'invalidFields']$k]'message'] = $v;
}
}
} elseif($id) {
$this->Post->id = $id;
$this->request->data = $this->Post->read();
}
else {
$this->request->data = $this->Post->getDraft('post');
}
$this->loadModel('Category');
$d'categories'] = $this->Category->find('list');
// $d'categories'] = $this->Post->Category->find('list');
$this->set($d);
}
Mon modèle :
<?php
class Post extends AppModel {
// Jointures avec les Medias
public $hasMany = array('Media' => array('dependent' => true));
// J3 : utilisation du counter cache
public $belongsTo = array('category' => array(
'counterCache' => true,
'counterScope' => array('Post.online' => 1, 'created <= NOW()')
));
// Profondeur de récursivité
// Pour lister l'ensemble des posts, on n'a pas besoin de connaître les médias rattachés
public $recursive = -1;
// Règles de validation
public $validate = array(
'slug' => array(
'rule' => '/^[a-z0-9\-]+$/',
'allowEmpty' => true,
'message' => "l'URL n'est pas valide"
),
'name' => array(
'rule' => 'notEmpty',
'message' => "Le titre n'est pas valide"
)
);
// J3 : par défaut, trier les articles par date de création
public $order = 'Post.created DESC';
/*
* Création d'une variable LINK
*/
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',
'slug' => $d'Post']'slug'],
'id' => $d'Post']'id']
);
$data$k] = $d;
}
}
return $data;
}
/*
* Construction automatique du SLUG
*/
public function beforeSave() {
if(!empty($this->data'Post']'name']) && empty($this->data'Post']'slug']) && isset($this->data'Post']'slug'])) {
$this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'], '-'));
}
return true;
}
/*
* Permet de récupérer un Brouillon
* Param : Article ou Page
*/
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;
}
}
Enfin, dans la vue admin/posts/edit :
<?php echo $this->Form->input('category_id', array('label' => "Catégorie"));?>
Merci pour ton aide,
Fred
Salut,
Je ne pense pas que cela vienne du changement de la version 2.0 à la version 2.1. J'ai moi même changé de version après avoir fait ce tuto et je n'ai eut aucun soucis d'incompatibilité. Par contre cela n'est pas normal que tu dois mettre un c minuscule à $post'Category']'name']
Es-tu sûr de n'avoir pas fait une faute de frappe sur un nom de fichier ou de fonction ? As tu bien suivi les conventions de cakephp ?
En tout cas je regarde les codes que tu m'as donné et je te tiens au courant...
Remet un C majuscule dans ton show.ctp sur Category.
Je vois une faute dans ton code du model Post.php :
Dans ton belongsTo tu as mis Category avec un c minuscule change
public $belongsTo = array('category' => array(
'counterCache' => true,
'counterScope' => array('Post.online' => 1, 'created <= NOW()')
));
en
public $belongsTo = array('Category' => array(
'counterCache' => true,
'counterScope' => array('Post.online' => 1, 'created <= NOW()')
));
Tiens moi au courant
merci. Comment dire que la prochaine fois je mettrai des lunettes ? Effectivement ça fonctionne normalement maintenant. Merci encore.