情弱エンジニアのなかのblog

一人前のエンジニアになる為のブログです

CakePHP Paginatorでページ分けと表示順を指定

記事の表示件数と表示する順番を指定する

CakePHPで記事を投稿するアプリを作っていて、表示するページを分けたいと思いPaginatorでページ分けをしたので手順等を記載します。

1.ページを分ける

まずはページごとに分けていきます。 Cntrollerを編集していきます。

表示件数を5件、表示順は記事の降順で表示する

class ArticlesController extends AppController {

public $paginate = array(
    //表示件数を5件に指定する
    'limit' => 5,
    //表示順番をArticleのidの降順
    'order' => array('Article.id' => 'desc')
);

これでページを分けて表示できます。

2.ページ遷移をさせる

続いてビュー側でページ遷移の選択肢を作ります。

・前のページ ・次のページ ・ページ数を選ぶ ・最初のページ ・最後のページ

これらを実装します

<?php
    //最初のページへ
    echo $this->Paginator->first('最初のページへ' , array());
    //一つ前のページへ
    echo $this->Paginator->prev('戻る', array(), null, array('class' => 'prev disabled'));
    //ページ数を選択する
    echo $this->Paginator->numbers(array('separator' => ''));
    //一つ次のページへ
    echo $this->Paginator->next('進む', array(), null, array('class' => 'next disabled'));
    //最後のページへ
    echo $this->Paginator->last('最後のページへ', array());
?>

f:id:nonaka-katuma-hal:20170615185025j:plain

これでページ遷移が出来るのですが、一つ注意点があります。

3.デフォルトを参照していないか

私が引っかかったところなのですが、Controllerで使うPaginatorがlib/Cake/Controller/Component にある「PaginatorComponent.php」を参照していていくらlimitを指定しても結果が反映されないという状況に陥りました。

まず原因としてはControllerで$componentsでPaginatorを指定していることになります。

public $components = array(
    'Paginator',
    'Session', 
    'Flash'
    );

解決策としては簡単で'Paginator'を削除すればオーケーです。

それでは