Комментарии, связанные с Cakephp — отступом

#cakephp-1.3

#cakephp-1.3

Вопрос:

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

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

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

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

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

Пример - комментарий quot;Дочерние элементыquot; добавляется вручную в это время

спасибо всем за вашу помощь.

Ответ №1:

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

Комментарии:

1. У меня есть поле lft, а также поле rght. Однако моя проблема заключалась бы в том, как это сделать. Я провел еще несколько исследований и обнаружил поведение дерева CakePHP, однако я не понял, как это сделать. Я уже использую foreach $comments as $comment для отображения родительских комментариев. Как я могу перейти оттуда и отобразить дочерние комментарии каждого родителя? Я постараюсь опубликовать некоторый код позже. Кроме того, куда мне добавить ActsAs = array('Tree') ? В модели Article или Comment ? Article $this->Article->Comment->id Например, я использую.

Ответ №2:

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

Дочерние элементы элемента.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>
  

Код в my /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']));
     }
?>
  

И результат:
Фактический результат

Ответ №3:

Я нашел решение не использовать requestAction для комментариев с отступом. В принципе, в представлении я отображаю комментарии без ответов, с элементом. Я передаю через этот элемент весь массив комментариев. В этом массиве, если у нас есть комментарий с «родительским идентификатором», соответствующий отображаемому комментарию, есть 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']
  

В элементе/ 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));
  }
}