DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人 > 
  3. タイトル

Paginator で見かけの URL を使用する方法

2013/01/26

Paginator で見かけの URL を使用する方法

 

CakePHP の Paginator はとても便利なのだが、ページング URL の生成にはちょっと癖がある。

例えば、いくつかのカテゴリに分類された一覧を共通アクション article_index() で行っているとしよう。各一覧は routes.php のルーティング指定でカテゴリをパラメータとして

	Router::connect('/news_index/*', array('controller' => 'display', 'action' => 'article_index', 'category' => 1));
	Router::connect('/blog_index/*', array('controller' => 'display', 'action' => 'article_index', 'category' => 2));

のように設定しているものとする。これを display コントローラの共通アクション article_index() で処理すると、ビュー内の Paginator ヘルパーが生成するページング URL は /display/article_index/... となってしまい、見かけ上の URL /news_index /blog_index にはなってくれない。

仕方がないので各ページネータ要素生成メソッド ($this->Paginator->prev() とか $this->Paginator->numbers() など) の戻り値を preg_replace で処理することも考えたが、今一つ可読性が悪い。そもそも置換用に関数をビュー内で定義するのはとても気持ちが悪い。

で、いろいろ調べてみたところ

  • Paginator ヘルパーで $this->Paginator->options(array('url' => ...)) でページネータの出力する URL を変更できる

ということが判明した。この url パラメータに文字列ではなくルーティング形式で array('controller' => ..., 'action' => ..., ...) を与えることで見かけ上の URL を逆ルーティングして生成してくれる。例えば、news_index の一覧表示時にはそのページのテンプレートの最初の方で

	$this->Paginator->options(array('controller' => 'display', 'action' => 'article_index', 'category' => 1));

としておくことで Paginator の prev() や numbers()、next() 等が生成する URL が逆ルーティングされ  /news_index/page:.../blog_index/page:... のようにすることができる。

※ Paginator の url オプションにルーティング形式の配列ではなく文字列を与えた場合、単に既定値の URL の後に追加されるのみであり、コントローラ部やアクション部は変更できない点に注意。

例えば、$this->Paginator->options(array('url' => '/news_index')); とした場合、生成される URL は /news_index/page:... ではなく /display/article_index//news_index/page:... となってしまう。

この記事は加藤 正人さんが書いています!

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

関連エントリー