1

ツリーの動作で 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 つのテーブルを使用しています。1 つはルート用、もう 1 つはスレッド化されたコメント用です。解決策が見つかりませんでした。

4

5 に答える 5

1

ページネーションによってコントローラーで手動で行う必要があります。

キーは、最初にparent_id、次にid(列は単なる例です)によってIDではなくコメントを見つけるようにmysqlクエリを適切に注文することです-これは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'));
于 2011-08-05T18:51:52.663 に答える
0

できません。私がしたことは、完全なスレッド化されたコメント ビューとフラットなページ付けされたリストを切り替えるリンクです。

于 2011-04-30T16:17:19.860 に答える
0

IMHO: ページ付けされたコメントは良い考えだと思いますか? コメントがページに占めるスペースを最小限に抑え、それらを 1 つのフロートに入れるだけです。ユーザーにあまりにも多くのリンクをクリックさせないでください...

于 2011-04-30T16:28:23.750 に答える
0

これを次のように達成できます

あなたのモーダルコード:

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();
于 2015-05-10T10:58:39.163 に答える
0

ツリーの動作と lft による順序を使用する必要があります。

于 2017-12-22T15:46:15.243 に答える