【CakePHP2.2】Paginatorヘルパーとコンポーネントでページ送りを実装する

今までCakePHPを使用してきて、ページ送りを実装したことがなかったのですが、今回実装する機会がありましたのでそれをまとめようと思います。 ページ送りというのは以下のようなやつです。

検索結果とかによく実装されているやつですね。

ただこれを自分で実装しようとすると、自分で全て計算し、例えば10件表示させようと思ってるけど、少し足りない場合はどうするか、とか色々面倒なことになってしまいます。 そこでCakePHPに準備されている、PaginatorヘルパーとPaginatorコンポーネントでさくっとページ送りを実装していこうと思います。

今回作成するページ送りは主に検索結果を表示することを想定して作っています。

まずは検索ボックスとなるビューを作成しましょう。

View/Posts/search.ctp

<?php
echo $this->Form->create('Post', array(
    'url'=>array('controller'=>'posts','action'=>'search','type'=>'get')); 
echo $this->Form->input('title');
echo $this->Form->end('Search');

次にGETで送信された値を検索してみましょう。 例えば以下のようにControllerを書きます。

Controller/PostsController.php

<?php
class PostsController extends AppController {
    public $helpers = array('Html', 'Form', 'Paginator');
    public $components = array('Paginator');

    public function search() {
        // 前回検索した値を常に保存しておく
        $this->request->data['Post'] = $this->request->query['Post'];

        // Viewに値を渡す
        $this->set('results', $this->paginate('Post', array(
                'post_name LIKE' => "%{$this->request->data['Post']}%")));

あとはビューで結果を表示するだけです。 以下のようにしましょう。

View/Posts/search.ctp

<?php
echo $this->Paginator->prev('前へ');
echo $this->Paginator->numbers();
echo $this->Paginator->next('次へ');

foreach($results as $result) {
    // 処理を書く
}

これで以下のようなページ送りを実装することが出来ました。

この状態では次のようなURLになっていると思います。

/posts/search/page:3?title=hogehoge

それを以下のようなURLにしましょう。

/posts/search?title=hogehoge&page=3

次のコードをControllerに書きましょう。

$this->Paginator->settings['paramType'] = 'querystring';

これでURLがGET風になりました!

以下が参考にした記事です。

参考

Pagination – CakePHP公式ドキュメント(英語)