Bonjour,
J'ai un petit problème avec l'affichage des commentaires sur une page d'article. L'index "comment" est vide. Je comprend pas pourquoi.

array(
    'Post' => array(
        'Post' => array(
            'id' => '23',
            'name' => 'Prototype',
            'slug' => 'prototype',
            'content' => '<p>Depuis quelque temps je travail sur mon premier album qui s'appelle Protoype.</p>
',
            'type' => 'post',
            'online' => '1',
            'created' => '2013-07-07 15:39:00',
            'media_id' => '52',
            'category_id' => '1',
            'thumb' => '/uploads/users/1/Untitled_1.png',
            'ulink' => array(
                'controller' => 'posts',
                'action' => 'show',
                'id' => '23',
                'slug' => 'prototype'
            )
        ),
        'Category' => array(
            'id' => '1',
            'name' => 'Music',
            'slug' => 'music',
            'post_count' => '3',
            'ulink' => array(
                'controller' => 'posts',
                'action' => 'category',
                'slug' => 'music'
            )
        ),
        'Thumb' => array(
            'id' => '52',
            'ref' => 'Post',
            'ref_id' => '23',
            'file' => '/uploads/users/1/Untitled_1.png',
            'position' => '0',
            'type' => 'pic',
            'icon' => '/uploads/users/1/Untitled_1.png'
        )
    ),
    'Comment' => array()
)

L'index Comment est vide et il est posé d'entre remplie des commentaire qui sont lié à l'id de mon article. :(

Voici la requête que je fait sur l'action show() :

$comments = $this->Post->Comment->find('all', array(
            'conditions' => array('Comment.post_id' => $post'Post']'id']),
            'contain' => array('User'),
            'fields' => array('Comment.id', 'Comment.user_id', 'Comment.content','Comment.created','User.username','User.thumb','User.id','Comment.username','Comment.mail')
        ));
        $d'Post'] = $post;
        $d'Comment'] = $comments;

Merci de votre aide en avance. :P

11 réponses


coloo
Réponse acceptée

Bonjour,

Le debug de $post'Comment'] fonctionne, donc je te propose de partir de là. Reconstruisons ton foreach si tu le veux bien.

<section class="sec-comments">
               <?php foreach ($post'Comment'] as $c): ?></div>
       <div class="row-fluid">
           <section id="comment-<?= $c'id'];?>">
                <div class="span2">
               <?php if ($c'User']'thumb']): ?>
                   <?= $this->Html->image($c'User']'thumb'], array('class' => 'avatar')); ?>
               <?php endif ?>
           </div>
           <div class="span6">
               <p><strong><?= h($c'username']); ?></strong>, <?= $this->Time->timeAgoInWords($c'created']); ?></p>
               <p>
                   <?= nl2br(h($c'content'])); ?>
               </p>
           </div>
           </section>
       </div>
       <hr>
       <?php endforeach ?>
           </section>

je comprends pas : nl2br et $c'User']'thumb'] (je ne le vois pas dans ton debug de $post'comment']

Bonne journée.

Bonjour,
pourquoi n'utilises-tu pas une relation hasMany de Post vers Comment?

lakamark
Auteur

Je utilise dans mon model Post

public $hasMany = array('Comment');

dans mon model Comment je utilise un belogongsTo

public $belongsTo = array('User','Post');

quelle est ta requête dont le résultat est mis dans $post?

lakamark
Auteur

Je les trouve j'ai mis le récursive à 0 je les mis à 1 Je les trouve j'ai mis le récursive à 0 je les mis à 1 Les commentaire ne s'affiche pas sur les pages des articles.
Quand je fait un débug de $comments. c'est ça que je vois : array().

Mais quand je fait un debug sur ma page de vue d'un article avec

<?= debug($post'Comment']); ?>

il m'affiche tout les commentaire de l'article en question :

array(
    (int) 0 => array(
        'id' => '1',
        'user_id' => '0',
        'username' => 'teste',
        'mail' => 'exemple@exemple.com',
        'content' => 'ewew',
        'post_id' => '23',
        'created' => '2013-08-18 17:09:23'
    ),
    (int) 1 => array(
        'id' => '2',
        'user_id' => '0',
        'username' => 'xxz',
        'mail' => 'exemple@e.com',
        'content' => 'sdsd',
        'post_id' => '23',
        'created' => '2013-08-18 17:11:52'
    ),
    (int) 2 => array(
        'id' => '3',
        'user_id' => '0',
        'username' => 'dsds',
        'mail' => 'exemple@e.com',
        'content' => 'dsdssd',
        'post_id' => '23',
        'created' => '2013-08-18 17:13:03'
    ),
    (int) 3 => array(
        'id' => '4',
        'user_id' => '1',
        'username' => null,
        'mail' => null,
        'content' => 'Je fait un teste',
        'post_id' => '23',
        'created' => '2013-08-18 17:13:49'
    ),
    (int) 4 => array(
        'id' => '5',
        'user_id' => '0',
        'username' => 'teste',
        'mail' => 'ec@e.com',
        'content' => 'exx',
        'post_id' => '23',
        'created' => '2013-08-20 14:36:34'
    )
)

*les commentaire de l'article qui as l'id 23

montre nous le code de ta vue.

lakamark
Auteur

Désolé, j'avais oublié de mettre le code source de ma vue. Alors voici :

<section class="sec-comments">
                <?php foreach ($comments as $c): ?></div>
        <div class="row-fluid">
            <section id="comment-<?= $c'Comment']'id'];?>">
                 <div class="span2">
                <?php if ($c'User']'thumb']): ?>
                    <?= $this->Html->image($c'User']'thumb'], array('class' => 'avatar')); ?>
                <?php endif ?>
            </div>
            <div class="span6">
                <p><strong><?= h($c'User']'username']); ?></strong>, <?= $this->Time->timeAgoInWords($c'Comment']'created']); ?></p>
                <p>
                    <?= nl2br(h($c'Comment']'content'])); ?>
                </p>
            </div>
            </section>
        </div>
        <hr>
        <?php endforeach ?>
            </section>

Il y a pas d'erreur qui s'affiche. Il y a juste rien qui s'affiche.

Bonjour montre nous plutôt la requête de la variable $post. Si il y a une liaison $hasmany , le framework est capable de trouver tout seul les commentaires associés à ton article.

lakamark
Auteur

Voici la requête de la variable $post :

$post = $this->Post->find('first',array(
            'conditions' => array('online'=>1,'type'=>'post','Post.id' => $id,'Post.created <= NOW()'),
            'recursive' => 1
        ));

Bonjour, en restant sur une seule requête php (un seul find ) et laissant gérer le Framework, je proposerai personnellement de mettre le comportement containable dans ton modèle Post, puis de lui dire de faire les liaisons sur category et comment à cet endroit.
En utilisant heu $this->Post->contain('Comment','Category'); un truc comme ça, je suis plus sur mais dans la doc tu auras la bonne syntaxe.

L'ennui de la variable $recursive, c'est que certes elle fait plus de relation si on l'augmente mais partout , et des fois sur des modèle dont on a absolument pas besoin à cet endroit .
Donc je sais pas si à un endroit tu veux juste afficher la categorie associé... le framework va aller chercher les 54 000 tags associés alors que sur cette page on s en fou.. ça alourdit pour rien la requête (moi exagéré les situations?? jamais XD).
En utilisant le comportement containable , tu peux gérer de manière bien plus précise les relations. En terme de performance on y gagne.

mais de rien.