2013年2月1日金曜日

[CakePHP]pagination時に存在しないpageの場合は404を出すには

CakePHP1.3でのpaginationでは、urlの最後に"page:2"などのようにpageを指定する。
(2ページ目を表示させたい場合)
実際に存在するpage数より大きな数字を指定した場合、どうなるかというと、最終ページの内容が表示されてしまう。

発行されたSQLを見たところ、select文の最後に"LIMIT 20 10"のように指定し、目的のページのデータを取得する仕様のようだ。"LIMIT 20 10"の場合は、21行目から10件取得する時に付与される場合だ。つまり、1ページにつき10件の表示で3ページ目を表示する場合だ。
最終ページが3ページなのに4ページ目を表示しようとURLに"page:4"と付与しリクエストを行い、発行されたSQLを見たところ、"LIMIT 20 10"のままだった。これが原因のようだ。
なぜこのようになってしまうかはわからない。

最終ページより大きな数字を指定した場合でも、最終ページの内容を表示するのではなく、404などのエラーを出力させたいこともあると思う。そんな時は以下のコードをcontroller側に記述する。

if(!empty($this->params['named']['page'])){
    if($this->params['paging']['Theme']['pageCount']<$this->params['named']['page']){
        $this->cakeError('error404');
    }
}

$this->params['paging']['Theme']['pageCount']はページの総数、$this->params['named']['page']はリクエストがあったページ、が格納されている。後者は、ページ指定無しの場合(1ページ目を表示)は格納されないので、!emptyで確認している。

※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip

【追記2013/2/10】
上記の'Theme'は$this->paginate()で指定したモデル名を指定する。
ちなみに、どうやら上記のコードは$this->paginate()コマンドよりも後にやらないと正常に動かない。おそらく、paramsに入るこれらの値はpaginate()コマンドにより格納されるもののため。たぶん。

0 件のコメント:

コメントを投稿