PHP
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}