edo1z blog

プログラミングなどに関するブログです

cakePHP 2.3 Paginator (GET)

まずコントローラで、$paginatorの設定を行う。

public $paginate = array(
    'limit' => 25,
    'order' => array(
            'User.id' => 'asc'
    )
);

次に検索条件の設定が必要であれば行う。

$conditions = array('User.name' => 'taro');

findの代わりにpaginatorを使う。

$result = $this->paginate('User',$conditions);
$this->set(compact('result'));

次にビューの設定をする。

< ?php echo $this->paginator->counter(array('format' => '%page%ページ /  %pages%ページ '));?><br />
< ?php echo $this->paginator->prev('« 前 ', null, null, array('class' => 'disabled'));?>
< ?php echo $this->paginator->next(' 次 »', null, null, array('class' => 'disabled'));?>

ここまでは簡単だが、次のページや、前のページを、上記のようなリンクにすると、情報を引き継がない。 あとPOSTでやろうとしても、上記リンクだとできない。とはいえ、GETだったら自動で情報を引き継ぐかというとそういうわけでもない。 単に現在のページに、page:2というパラメータが降られるだけで、その他のパラメタは削除される。

< ?php $this->paginator->options(array('url' => $this->request->query));?>

上記をビュー内に記載すると、次へページとかのURLに、自動でパラメタが付加される。しかし、パラメタの付加の仕方が半端ない。 Paginatorは通常ではNamed parametersを使うらしい。FormからNamed parametersを作成するのはめんどくさそうだが簡単な方法があるのかもしれない。今時点では、GET送信を前提に調べる。

Using GET parameters for paginationというタイトルで英語で説明されているページを発見した。さらに、ここ(Pagination with GET parameters)に明確な回答があった。

コントローラーで、下記を設定する。

public $paginate = array(
    'paramType' => 'querystring'
);

下記でもいいらしい。

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

これでいいらしい。

さらに和訳を発見した。

GETパラメータを用いたページネーション CakePHPの以前のバージョンでは、ページネーションのリンクは名前付きパラメータを使ってのみ生成が可能でした。それでも、もしGETパラメーターでページがリクエストされたらページネーションは動作していました。2.0では、ページネーションのパラメーターを生成する方法を、操作性を上げ、矛盾のないようにすることを決意しました。クエリ文字列を使うか、名前付パラメーターを使うかをコンポーネントで選ぶことができます。やってくるリクエストは選らんだ種類だけが受け入れられます。また、PaginatorHelperは選んだ種類のパラメーターを用いてリンクを生成するでしょう。 var $paginate = array( 'paramType' => 'querystring' ); 上記はクエリ文字列パラメーターを解析し生成することを有効にします。また、PaginatorComponentの$settingsプロパティを修正することもできます。 $this->Paginator->settings['paramType'] = 'querystring'; デフォルトでは、クエリ文字列が使われているときは全ての種類のページングパラメーターはクエリ文字列に変換されます。もし他のルーティングパラメーターを強制的にクエリ文字列として扱いたいなら、$this->Paginator->options(array('convertKeys' => array('your', 'keys', 'here)));とできます。

ということで、ビューで下記のようにやると、すべてのパラメタがクエリ文字列に変換された。

< ?php
$this->paginator->options(array(
    'url' => $this->request->query,
    'convertKeys' => array_keys($this->request->query)
));?>

(参考) http://cakephp20sysnsa.blogspot.jp/2012/06/blog-post.html http://book.cakephp.org/1.3/ja/The-Manual/Core-Helpers/Paginator.html http://book.cakephp.org/1.3/ja/The-Manual/Common-Tasks-With-CakePHP/Pagination.html