今まで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風になりました!
以下が参考にした記事です。