pagenate

前回CakePHP1.2でbake(続き) - Do you CakePHP はてなでは、controllerにindexメソッドを追加しただけで意図するctpファイルの呼び出しを確認しました。しかし、画面にはエラーメッセージばかりが目立ってしまうため、これを直します。

class CustomersController extends AppController {
    var $scaffold;
    var $name = 'Customers';
    var $uses = array('Customer');
    function index(){
        // この一行を追加
        $this->set('customers',$this->paginate());
    }
}

これだけでエラーがなくなります。
しかも、各カラムによるソートやページ制御も含まれています。

ただ、URLが長くなってしまいまうのが気になります。
例えば、Name昇順2ページ目の表示なら
http://localhost/customers/index/page:2/sort:name/direction:asc

そこで、適当にパラメータを変更してみる

ページ番号を文字列に変更

http://localhost/customers/index/page:aaa/sort:name/direction:asc

1ページ目が表示された

ソートするカラム名を存在しないカラム名に変更

http://localhost/customers/index/page:2/sort:xxx/direction:desc

SQLエラー[Warning (512): SQL Error: 1054: Unknown column 'xxx' in 'order clause']

ソート順を関係ない文字列に変更

http://localhost/customers/index/page:2/sort:name/direction:xxx

SQLエラー[Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.`name` a ASC LIMIT 20' at line 1]


…というわけで、公開サイトに使用する場合は注意が必要かと思います。



余談ですがviewではpaginatorを呼び出していたので、Cake1.1と同じようにcontrollerへの追加が必要?

    var $helpers = array('Paginator');

と思ったのですが、controllerクラスで記述されているため不要でした。




paginateへの細かい検索条件の指定方法等はこちらで詳しく載っていました。
zmx.jp