CakePHP обработал комментарии с нумерацией страниц
Есть ли способ разбить на комментарии комментарии в cakePHP с поведением дерева? Должен ли я в любом случае использовать поведение дерева или создать собственный код для просмотра комментариев?
Извините, об этом уже спрашивали. Я нашел статью: Управление иерархическими данными в MySQL... и я опубликую свое решение.
Нет, я не нашел хорошего решения. Я не хочу изобретать велосипед, я хочу сделать его так, как надо.
Я написал помощник для рекурсивной печати комментариев:
# view/helpers/comments
class CommentsHelper extends AppHelper{
public function printComments($comments = array(), $params = array()){
if (empty($comments) || !is_array($comments)) return false;
echo '<ul id="comments-'.$comments[0]['Forum']['id'].'">';
if (is_array($comments)){
foreach($comments as $comment):
?>
<li id="<?php echo $comment['Forum']['id']; ?>">
<div class="inner">
<h4><?php echo $comment['Forum']['title']; ?></h4>
<div class="meta">
<?php echo $comment['User']['first_name']; ?>
</div>
<div class="content">
<?php echo $comment['Forum']['content']; ?>
</div>
</div>
<?php
if (isset ($comment['children']))
if (is_array($comment['children'])){
if (!empty($comment['children'])) $this->printComments($comment['children']);
}
echo '</li>';
endforeach;
}
else{
echo '<li>'.$comment['Forum']['title'].'</li>';
}
echo '</ul>';
}
Вот как я получаю данные из базы данных:
# controllers/forums.php
$this->set('tree', $this->Forum->find('threaded'););
Проблема в том, как разбить комментарии на страницы?
В настоящее время я использую 2 таблицы, одну для корня и 2 для многопоточных комментариев. Я не нашел решения.
5 ответов
Вы должны сделать это вручную в контроллере по страницам.
Ключ - правильно упорядочить запрос MySQL, чтобы найти комментарий не по идентификатору, а по идентификатору parent_id, а затем по идентификатору (столбцы - только пример) - это будет работать для комментариев на двух уровнях:
$this->paginate = array(
'recursive' => -1,
'conditions' => array(
'Comment.blog_id' => 0,
),
'order' => array('parent_id', 'id'),
'limit' => 10
);
$this->set('comments', $this->paginate('Comment'));
Вы можете достичь этого как
Ваш модальный код:
var $hasMany = array(
'Pages' => array(
'className' => 'Page',
'foreignKey' => 'parent_id',
)
);
Ваш код контроллера:
$this->paginate = array(
'Page' => array(
'contain' => array(
'Pages'
),
'conditions' => array(
'Page.parent_id' => null
)
)
);
$pages = $this->paginate();
Ты не можешь То, что я сделал, - это ссылка, которая переключалась между полным просмотром комментариев и плоским постраничным списком.
ИМХО: ты считаешь, что постраничные комментарии - это хорошая идея? просто сведите к минимуму пространство комментариев на странице и поместите их в одну строку. не заставляйте своего пользователя нажимать слишком много ссылок...