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)

25 réponses


Tu a mis recursive à 1 ?

Laurent.
Auteur

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
));
Laurent.
Auteur

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 .

Laurent.
Auteur

Oui, mais comment faire pour le mettre "avec" paginate?

il suivi d'ajouter ça dans ton PostController :

public $paginate = array('recursive' => 1);
Laurent.
Auteur
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
    )
);
Laurent.
Auteur

Ouais c'est vrai, c'est logique x)

Bref, même en mettant recursive à 1 ou à 2, les catégories ne s'affichent pas --"

Bon :D alors fait mon voir ton PostsController et ton model Post !

Laurent.
Auteur

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);
}
Laurent.
Auteur

Putain! Pas moyen de récupérer le nom de la catégorie =S

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 !

Laurent.
Auteur

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

Et fait voir tes tables posts et catégories

Laurent.
Auteur

;)

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.

Laurent.
Auteur

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 !

Alors ça marche ?

Laurent.
Auteur

J'ai repris mon PC, faut que je reteste dès que j'ai le temps, et je te dis tout ;)

Pas de nouvelle bonne nouvelle ?

Laurent.
Auteur

Non j'ai toujours pas testé, j'ai fais d'autre truc :)
Tkt pas que je te dirais quand je testerais ;)