Cakephp - 缩进相关评论

时间:2011-11-03 17:03:39

标签: cakephp-1.3

我在我的应用中创建了一个评论系统,现已附加到我的articles->view。评论控制器的一个功能是允许用户响应评论(一个级别)并能够为特定评论创建许多子评论。一切都通过parent_id连接。

现在,当我打开文章时,我使用foreach $comments as $comment检索与文章相关的所有评论,并在articles_controller.php中将$comments变量分配给find所有评论与文章有关。

获取$comment儿童评论的最佳方式是什么,并将其显示在我的视图中?

我接近它的方法是使用一个函数返回基于$comments->id的子注释列表,并在下面的$comment下显示...这似乎很耗时每个评论都会调用此函数(即childrenComments($id)),并且肯定会使服务器陷入困境。

有没有人知道使用parent_id关系的更好方法并节省一些CPU时间?

Example - "Children" comment is manually added at this time

谢谢大家的帮助。

3 个答案:

答案 0 :(得分:0)

如果它是“左”字段的嵌套集树顺序。如果你只有parent_id我认为按创建日期排序它们也应该工作并获取与它们所属的外键相关的所有记录。

答案 1 :(得分:0)

我无法弄清楚如何做到这一点,也许是正确的方式,所以我选择使用元素来实现这一目标。基本上,在foreach $comments的每次迭代中,我调用childrenComments元素来检查当前$comment['Comment']['id']是否有子评论。如果有评论,我会使用每个评论在其父评论下方显示每条评论。请参阅下面的一些代码......

articles_controller.php中的代码

function childrenComments($id = null){
    $comments = $this->Article->Comment->find(
        'all',
        array(
            'fields' => array(
                'Comment.id',
                'Comment.comment',
                'User.username',
                'User.image'
            ),
            'conditions' => array(
                'Comment.parent_id =' => $id,
                'Comment.approved =' => 1
            )
        )
    );
    return $comments;
}

Element childrenComments.ctp

<div style="width:100%;">
<div>
    <?php
    $childrenComments = $this->requestAction('/articles/childrenComments/'.$id);
    foreach ($childrenComments as $childrenComment){
    ?>
    <table cellpadding=0 cellspacing=0>
        <tr>
            <td>
                <img style="width:30px;margin-right:5px" src="<?php echo $childrenComment['User']['image'];?>">
            </td>
            <td width=100% style="padding-left:10px;">
                <?php
                    echo $childrenComment['Comment']['comment'];
                ?>
            </td>
        </tr>
    </table>
    <?php
        }
    ?>
</div>

我的/articles/view.ctp中的代码

<?php 
     foreach($comments as $comment){
 ...
 //Code are placed here to display each parent comment
     ...

         //This will iterate and display all children comments
         echo $this->element('childrenComments',array('id' => $comment['Comment']['id']));
     }
?>

结果是: Actual result

答案 2 :(得分:0)

我找到了一个不使用RequestAction进行缩进注释的解决方案。基本上,在视图中我使用Element显示没有回复的注释。我通过这个元素传递整个注释数组。在这个数组中,如果我们有一个评论“父ID”与我们正在显示的评论相匹配,那么有一个foreach会再次循环,依此类推......

在Post / view.ctp中:

foreach ($post['Comment'] as $comment) {
   echo $this->element('comment', array('comments'=> $post['Comment'], 'id'=> $comment['id'], 'comment'=> $comment, 'user'=> $comment['User'], 'postId'=> $post['Post']['id'], 'level'=> '1'));
}

// Notice the whole comments array passed in the element 'comments'=> $post['Comment']

在Element / comment.ctp中:

// After the code that displays comment content

foreach ($comments as $comm) {
  if ( $comm['parent_id'] == $comment['id'] ) {
    echo $this->element('comment', array('comments'=> $comments, 'id'=> $comm['id'], 'comment'=> $comm, 'user'=> $comm['User'], 'postId'=> $postId, 'level'=> $level));
  }
}