Cake PHP Paginate sort について
CakePHP 1.2.3.8166
CakePHPのPagination機能とは、たとえば100件あるようなデータを1ページに100件見せるのではなく、20件ごとぐらいに分割してページにしてくれる便利機能です。
また、項目をソートしてくれる機能もあります。
ここでは、このソート機能 $paginator->sort について書いておきます。
1.そもそもpagination機能を使うために、コントローラーで準備をしておきます。
pagination機能は、取得するデータを指定してそのまま使えます。
モデルのfindと同じように、使えるんですね。
(ついfindしてからpaginationを使うのかと思ってしまいますが、違います。)
//コントローラー function test_view(){ $this->paginate=array( 'モデル名' => array('conditions'=>array( 'project_id'=>$project_id ), 'order'=>array( 'PaperFormat.type_number'=>'desc' ) ) ); $project_datas=$this->paginate(); $this->set('ProjectDatas', $project_datas); }
上記はコントローラー内のアクション test_viewで使用する際の書き方です。
$this->paginateはfind(‘all’)と同じ役割をしてくれるので、わざわざ’all’はつける必要はありません。
2.次にビューファイルです。
ビューファイルでpaginagion のソート機能をつけるための編集方法です。
$paginator->sortの引数の設定は次の通りです。
$paginator->sort( '表示したい名称','ソートするキー名称','ページングでも利用する引数' )
例は次の通りです。
<?php echo $paginator->sort('プロジェクト番号','id',array( 'url'=> $this->passedArgs ) );?>
第三の引数
array( 'url'=> $this->passedArgs )
は、今まで保持していた引数を保持するための便利な関数です。
たとえば、URLの
myapp/projects/test_view/3/62/
の3や62、という値を保持したまま、ソートを行ってくれます。
この例ではキーが’id’になっていますが、他のモデルを利用したい場合、
'Teacher.id'
みたいに.でつなげて書けばできるようです。
テーブル構造でデータを表示し、テーブルの見出しをソートのキーにしたい時、次のようにします。
<table> <tr> <th><?php echo $paginator->sort('プロジェクト番号','id',array( 'url'=>$this->passedArgs ) );?> </th> <th>名称</th> </tr>
//データ表示のループ foreach($Projects as $Project){ ?> <tr> <td<?php if ($i % 2 == 0) echo $class;?>> <?php echo $Project['name']; ?> </td> </table>
参考:本家マニュアルサイト(英語)Custom Query Pagination
http://book.cakephp.org/view/249/Custom-Query-Pagination
- コントローラーのpaginateに渡すパラメータめちゃ助かりました。本に載ってたコントローラ側のpaginateのソートを示すパラメータで”sort”にフィールド渡してもソートされずハマりました。コントローラ側は”order”だったんや!とこのサイト見て解決しました。m(_ _)m — まけどん {2010-09-23 (木) 16:15:30}