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


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

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

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

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

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

View/Posts/search.ctp

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

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

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公式ドキュメント(英語)

更新情報はFacebookページで!

ブログの更新、読んで役立つ他ブログの記事などを更新しています。




関連のある記事