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 таблицы, одну для корня и вторую для цепочек комментариев. Я не нашел решения.


person Sophia Gavish    schedule 29.04.2011    source источник


Ответы (5)


Вы должны сделать это вручную в контроллере путем разбиения на страницы.

Ключ правильно заказывает запрос mysql для поиска комментария не по идентификатору, сначала по parent_id, а затем по идентификатору (столбцы - это просто пример) - это будет работать для комментариев 2 уровней:

    $this->paginate = array(
            'recursive' => -1,
            'conditions' => array(
                'Comment.blog_id' => 0,
            ),
            'order' => array('parent_id', 'id'),
            'limit' => 10   
    );
    $this->set('comments', $this->paginate('Comment'));
person Jacek Kaniuk    schedule 05.08.2011

Вы не можете. То, что я сделал, — это ссылка, которая переключалась между просмотром полнопоточных комментариев и плоским списком страниц.

person Sergei    schedule 30.04.2011
comment
А если я буду использовать две таблицы? один для root, а второй для цепочек комментариев? Может быть, тогда я смогу разбить корень на страницы, но проблема будет заключаться в том, чтобы получить данные из базы данных. Не хочу разбивать тему на отдельные страницы. - person Sophia Gavish; 30.04.2011
comment
Разбивка цепочек комментариев на страницы — действительно плохая идея, как и разделение таблицы. Однако вы можете попытаться создать сворачиваемые/расширяемые потоки. - person Sergei; 01.05.2011

ИМХО: как вы думаете, разбивка комментариев на страницы — это хорошая идея? просто уменьшите пространство, занимаемое комментариями на странице, и поместите их в один поплавок. не заставляйте пользователя нажимать слишком много ссылок...

person Aziz    schedule 30.04.2011
comment
У каждого комментария есть заголовок и содержание, пользователь будет нажимать на заголовки, чтобы увидеть содержимое. Это сэкономит место и оставит пользователя на странице. - person Sophia Gavish; 30.04.2011

Вы можете добиться этого как

Ваш модальный код:

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();
person Farhan    schedule 10.05.2015

Вы должны использовать поведение дерева и порядок по lft.

person lenivo    schedule 22.12.2017