Cakephp - Отступы, связанные комментарии - PullRequest
0 голосов
/ 03 ноября 2011

Я создал систему комментариев в своем приложении, которая теперь присоединена к моему articles->view.Одной из особенностей контроллера комментариев является возможность разрешать пользователям отвечать на комментарии (один уровень) и возможность создавать множество дочерних комментариев для конкретного комментария.Все связано через parent_id.

Прямо сейчас, когда я открываю статью, я использую foreach $comments as $comment, чтобы получить все комментарии, относящиеся к статье, и в articles_controller.php я назначаю переменную $comments для find всекомментарии, относящиеся к статье.

Каков наилучший способ получить комментарии детей $comment и отобразить их в моем представлении?

Я подхожу к этому, чтобы иметь функциюкоторый возвращает список дочерних комментариев на основе $comments->id и отображает его под $comment для рисунка ниже ... Кажется, что это занимает много времени, так как будет сделан вызов этой функции (т. е. childrenComments($id)) для каждого комментарияи может определенно погасить сервер.

Кто-нибудь знает лучший способ использовать соотношение parent_id и сэкономить некоторое время процессора?

Example -

благодарювсем вам за помощь.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2011

Я не мог понять, как это сделать, может быть, правильно, поэтому я решил использовать элементы для достижения этой цели.По сути, на каждой итерации 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;
}

Элемент 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

0 голосов
/ 01 января 2014

Я нашел решение не использовать RequestAction для комментариев отступа. По сути, в представлении я отображаю комментарии без ответов, с элементом. Я передаю через этот элемент весь массив комментариев. В этом массиве, если у нас есть комментарий с «родительским идентификатором», совпадающим с отображаемым комментарием, существует цикл foreach, который повторяется снова и так далее ...

В сообщении / 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']

В элементе / 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));
  }
}  
0 голосов
/ 04 ноября 2011

Если это порядок дерева вложенных множеств по «левому» полю. Если у вас есть только parent_id, я думаю, что порядок их по дате создания тоже должен сработать и извлечь все записи, относящиеся к внешнему ключу, к чему бы они ни принадлежали.

...