#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
отношение и сэкономить время процессора?
спасибо всем за вашу помощь.
Ответ №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));
}
}