Salut!
Voilà, je suis actuellement les tutoriels de Grafikart sur CakePHP, j'en suis à celui pour "Créer un blog".
Arrivé, à l'étape pour "relier" les catégories au posts , j'ai un problème...
Dans mon model posts, j'ai :
var $belongsTo = array('Category');
et dans le model categories :
var $hasMany = 'Post';
Donc tout est censé être relié. Maintenant, dans ma view index.ctp :
foreach($articles as $a){
echo '<div class="msg">';
echo $this->Html->image("/theme/theme/home.png", array(
'hspace' => 5,
'height' => 100,
'align' => 'left',
'border' => 0,
'style' => 'border:0'
));
echo '<p><span class="titre">'.$a'Post']'title'].'</span><br/>';
echo '<span class="info">Par '.$a'Post']'author'].' | '.$this->Date->show($a'Post']'date'], true).' :: '.$a'Category']'name'].'</span></p><br />';
echo '</div>';
echo "<p>".$a'Post']'content']."</p>";
debug($a);
}
Et à la ligne "catégorie :", rien ne s'affiche, rien dans le débug non plus.
Tout est bien configuré dans mes tables SQL je peine là :)
Merci d'avance ;)
(J'ai CakePHP 2.0)
A quoi sert récursive en fait, si mes souvenirs sont bons, il est à -1, donc ça pourrait provenir de là; je vais regarder dès que je suis sur mon PC ;)
Essayer de le mettre à un ou deux ! tu à juste à rajouter
'recursive' => 1
ou
'recursive' => 2
dans ton find comme ça :
$post = $this->Post->find('all',array(
'recursive' => 1ou2
));
Dans mon PostsController, j'ai ça :
<?php
class PostsController extends AppController{
var $name = 'Posts';
var $helpers = array('Html', 'Date');
var $paginate = array(
'Post' => array(
'limit' => 1,
'order' => array(
'Post.date' => 'Desc'
)
));
function index(){
$q = $this->paginate('Post');
$this->set('articles', $q);
}
function category($id){
$q = $this->paginate('Post', array("Post.category_id" => $id));
$this->set('articles', $q);
$this->render('index');
}
}
?>
J'ai pas compris où placé ton truc :)
http://book.cakephp.org/fr/view/1063/recursive
Donc apparemment si j'ai bien compris ça doit s'utiliser comme ça :
$this->Post->find('all', array ('recursive'=>1));
Mais je suis un noob en cakephp donc :p .
il suivi d'ajouter ça dans ton PostController :
public $paginate = array('recursive' => 1);
public $paginate = array('recursive' => 1);
var $paginate = array(
'Post' => array(
'limit' => 1,
'order' => array(
'Post.date' => 'Desc'
)
)
);
(l.5 : public $paginate = array('recursive' => 1);)
Et PHP m'affiche
( ! ) Parse error: syntax error, unexpected T_STRING, expecting ')' in C:\wamp\www\cakephp\app\Controller\PostsController.php on line 5
Très louche :O
Bah c normal tu peux pas avoir deux variable paginate !!! remplace les deux par ça :
public $paginate = array(
'Post' => array(
'limit' => 1,
'order' => array(
'Post.date' => 'Desc'
),
'recursive' => 1
)
);
Ouais c'est vrai, c'est logique x)
Bref, même en mettant recursive à 1 ou à 2, les catégories ne s'affichent pas --"
PostController
<?php
class PostsController extends AppController{
var $name = 'Posts';
var $helpers = array('Html', 'Date');
var $uses = array('Post', 'Category');
public $paginate = array(
'Post' => array(
'limit' => 1,
'order' => array(
'Post.date' => 'Desc'
),
'recursive' => 1
)
);
function index(){
$q = $this->paginate('Post');
//$q = $this->Post->find('all', array ('recursive'=>1));
$this->set('articles', $q);
}
function category($id){
$q = $this->paginate('Post', array("Post.category_id" => $id));
$this->set('articles', $q);
$this->render('index');
}
}
?>
Le modèle post
<?php
class Post extends AppModel{
var $name = 'Post';
var $belongsTo = array('Category');
}
?>
Remplace ta fonction index par ça :
function index(){
$d'articles'] = $this->Paginate('Post');
$this->set($d);
}
tu à fait un debug de la variable $d ?
function index(){
$d'articles'] = $this->Paginate('Post');
debug($d);
$this->set($d);
}
envoie mais le contenu de ton debug !
Il me renvoie toujours pas la catégorie --"
Array
(
[articles] => Array
(
[0] => Array
(
[Post] => Array
(
[id] => 5
[date] => 2011-10-23 23:03:02
[author] => lmorel3
[title] => OKOK
[content] => ergQERGREGEQrgqreg
[category_id] => 1
)
)
)
)
Ça devient vraiment bizarre =O
Change :
var $hasMany = 'Post';
En :
public $hasMany = array('Post');
Si le problème ne vient pas de là, vérifie que tes models s'appellent bien "Post" et "Category" au singulier. Beaucoup d'erreurs en débutant viennent du nommage du model.
Si toujours rien ne fonctionne, enlève le public $paginate au début, et change ta method category() de la façon suivante :
public function category($id){
$this->paginate('Post', array(
'conditions => array(
"Post.category_id" => $id
),
);
$q = $this->Paginate('Post');
$this->set('articles', $q);
$this->render('index');
}
Et arrête d'utiliser les "var", c'est pour du php4, on en est plus là depuis pas mal d'années, préfère utiliser public, protected et private. Tu perds tout l'intérêt de PHP 5 sinon.
Mes modèles s'appellent bien Post et Category au singulier oui.
Après, pour les var ... okok, j'ai fais juste comme dans le tutoriel mais je suis conscient que ça a changé depuis x)
En metta public et un tableau, ça ne fonctionne pas non plus.
Et la fonction category, elle me retourne une erreur SQL au niveau de la condition, mais cette fonction marchait en fait, ça me listait mes catégories sur la droite (via mon controller Categories et ça me donne un lien (/posts/category/1) pour la première catégorie par exemple, et ça m'affiche tous les postes correspondant à la catégorie 1.
Mon problème moi, c'est lors de mon affichage des articles, pour afficher leur catégorie (genre "Le 10/12/2012 à 09h12 :: Vidéos > où Vidéos serait la catégorie du post). Je l'affiche comme ça
$a'Category']'name']
(dans mon foreach de ma vue index.ctp)
Donc en gros, ça ne fonctionne toujours pas ;)
C vraiment bizzare --" !!!
Moi j'ai tester ça comme controller :
<?php
class PostsController extends AppController{
public $uses = array('Post','Category');
public $paginate = array('limit' => 5,'recursive' => 0);
public function index(){
$d'posts'] = $this->Paginate('Post');
$this->set($d);
}
}
et comme model :
<?php
class Post extends AppModel{
public $belongsTo = array('Category');
}
j'ai essayer est chez moi ça marche !
Non j'ai toujours pas testé, j'ai fais d'autre truc :)
Tkt pas que je te dirais quand je testerais ;)