
CakePHPの1.2ではBakeで作成したindexページに標準でページャーがついています。
ページャーの仕組みは、URLを「/controller_name/action_name/page:1/sort:field_name/direction:asc」(例:/mails/index/page:1/sort:date/direction:desc)などのようにして、URLをクリックするたびにdirectionがasc(昇順)かdesc(降順)かが切り替わります。
CakePHPなどどのフレームワークを使ってもそうなんですが、フレームワークは自動化が進むにつれてちょっとの変更が大変になりますorz....
当然CakePHPのページャーもしかりで、上の例のURLを/mails/index/2(「2」は例えばアカウントIDやカテゴリーIDなど、where句の絞込み条件とするための値と思ってください)のようなページに対してページャーを利用しようとするととても大変です。
これで表示されるページャーの絞り込み条件(category_id = n)を指定できました。上のソースはまぁ直感的にも言いたい事はわかるのではないでしょうか。
しかし問題は絞込み条件を指定した後で、絞り込み条件を指定した際に/views/index.ctpよりページを表示した際、ソート条件を切り替えるためのURLが未だに「/mails/index/page:1/sort:date/direction:desc」のままであることに気がつくかと思います。
mails_controller.phpに「$this->set('category_id',$category_id);」と指定して色々すればなんとかなるのかと試行錯誤したのですが、結局のところ
で対応できるかと思います(この手法が一般的で最適かどうかはわかりませんが、現状ではこうするしかなさそうです)。
何をしているかと言うと、mails_controller.phpにて$idに$this->passedArgs['category_id']を代入していますがここがミソです。passedArgsは、上のURLでいえばdirection:descの部分からarray('direction'=>'desc')を作成し、代入されたクラス変数なので、そこにcategory_idを「category_id:$id」となるようにURLを書き換えさせています。
それでindex.ctp側にて$paginator->sortの第三引数に$optionsとしてarray('url'=>array('category_id'=>$id));を用いることによってページャーの切り替え用URLに「category_id:$id」が追加されます。
・・・とまぁ手法としてはこれでいいとは思いますが、スマートではないですね。
現在CakePHPの1.2系列はまだα版ですが、stable版になる頃にはそのまま$paginator->sort('field_name')でURLがそのまま指定できたらと思います。
-----------------------------
最後のサンプルコードで
をindex.ctpに書くとありましたが、全てのページャークラスに$optionsの引数を渡すよりスマートな方法がありました。
$paginator->optionsで、全てのリンクにオプションを追加することができます。
「Sets default options for all pagination links」とコメントにもあります。