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

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. Paginator で見かけの URL を使用する方法

加藤 正人のデベロッパーズブログ

加藤 正人

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

加藤 正人

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:... となってしまう。

関連タグ: CakePHP2 

関連エントリー

CakePHP のレンダリング結果を保存したい

CakePHP 2.x の Cookie と js.cookie.js

時刻入力用 jQuery Plugin TimePicki の不具合調整

CakePHP プラグインで HTTPS 判定

作業用モデルビヘイビア

CakePHP のバリデーション時に状況に応じてバリデーションルールを変更する

CsvLoader ビヘイビアを使って CSV を一発でロードする Cake Shell

CakePHP の Security コンポーネント、ベーシック認証、CGI

形態素解析システム MeCab (めかぶ) を CakePHP から利用する

Google APIs Client Library を CakePHP から利用する

分数電卓を作ってみる・その2

分数電卓を作ってみる・その1

CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法・その2

 CsvLoaderBhavior - CSV データを CakePHP で扱うための一手法

CakePHP でストアドファンクション

テキストフィールドを CSV として処理する CakePHP ビヘイビア・補足

テキストフィールドを CSV として処理する CakePHP ビヘイビア・その2

テキストフィールドを CSV として処理する CakePHP ビヘイビア・その1

Google Maps で郵便番号⇒住所変換・その2

テキストを自動整形する簡易 CakePHP ヘルパー

Google Chart へのアクセスをヘルパーで実装してみる【その2】

Google Chart へのアクセスをヘルパーで実装してみる【その1】

Google reCAPTCHA を使いやすくする

駅データ.jp のデータを CakePHP から使う

CakePHP の小ネタ

UploadPack を Exif Orientation 対応にする

作業用テーブル処理を再利用可能なツール化してみる・その1

クリックイベントが2回実行される?!

CakePHP のフォームで required・その2

CakePHP の Paginator の sort() で昇順ソート時に NULL 値を最後にしたい

CakePHP のフォームで required

UploadPack のヘルパーメソッド名称が変わっていた

CakePHP 2.x の PaginatorHelper::sort の不思議

CakePHP で四苦八苦 - あるフィールドにだけ値が書き込まれない

UploadPack で四苦Hack その後

CakePHP の小ネタ

CakePHP v2 のエラー処理

IE10 と CKEditor

2013/03/23
IE10 と CKEditor

UploadPack で四苦Hack・その2

「Notes プラグインが見つかりません」

CakePHP v2 で HTTP エラー画面をカスタマイズする

UploadPack で四苦Hack

PHP 5.4 と CakePHP 2.x