読者です 読者をやめる 読者になる 読者になる

ウェブサービスを作っています。

paginator パラメータのコロン区切りをやめる

cakephp

CakePHP のページネーション機能を使うと、/hoge/fuga/page:2 のようなコロン区切りパラメータのリンクになってしまいます。
これは気持ち悪いので、何とか /hoge/fuga?page=2 にする方法を考えました。


やはり気になっている方はいるようです。
ページが見つかりませんでした | 15Pub


まず、フレームワークの PaginatorHelper を app/views/helpers 以下にコピーします。

$ cp cake/libs/view/helpers/paginator.php app/views/helpers/


次に、コピーした paginator.php の url メソッドを編集します。

<?php
/**
 * Merges passed URL options with current pagination state to generate a pagination URL.
 *
 * @param  array $options Pagination/URL options array
 * @param  boolean $asArray
 * @param  string $model Which model to paginate on
 * @return mixed By default, returns a full pagination URL string for use in non-standard contexts (i.e. JavaScript)
 */
	function url($options = array(), $asArray = false, $model = null) {
		(.. snip ..)
		
		if (isset($url['order'])) {
			$sort = $direction = null;
			if (is_array($url['order'])) {
				list($sort, $direction) = array($this->sortKey($model, $url), current($url['order']));
			}
			unset($url['order']);
			$url = array_merge($url, compact('sort', 'direction'));
		}

                $url = array('?' => $url); // この行を追加する

		if ($asArray) {
			return $url;
		}
		return parent::url($url);
	}


最後に、app/config/bootstrap.php に以下を追加し、この編集済み Paginator が読み込まれるようにします。

<?php
App::import('Helper', 'Paginator', array('file' => '../app/views/helpers/paginator.php'));


たぶんこれで大丈夫なはずですが、もっと良い方法・問題などありましたら是非教えてください。
フレームワーク書き換えのテクニックは、以下の記事が参考になりました。ありがとうございます。
CakePHP フレームワークのソースをapp/で置き換える - Shin x blog