あるシステムで日報の1日の予定を登録して頂いていて、
日付単位とその中の詳細の予定の2段階でのソートをする必要がありました。
第一ソート条件は日付で第二ソート条件が詳細予定の時間というソートを実現させる実装方法です。
まずviewでpaginatorのソートの記述を書きます。
Paginator->sort(‘report_date’, ‘訪問日時’); ?>
次にコントローラーで次のように書きます。
if (empty($this->passedArgs['sort'])) { $order = array('Report.report_date' => 'desc', 'Report.staff_id' => 'asc', 'ReportDetail.report_date' => 'asc'); }elseif ($this->passedArgs['sort'] == 'report_date'){ $order = array('Report.report_date' => $this->passedArgs['direction'], 'Report.staff_id' => 'asc', 'ReportDetail.report_date' => 'asc'); } $this->ReportDetail->setOrder($order);
最後にモデルで次のように書きます。
// デフォルトのソート条件は何もなし var $order = array(); function setOrder($order) { // controllerから渡された$orderを変数に持っておく $this->order = $order; } function beforeFind($queryData) { // 実行中のfindの種別が'count'以外だった場合のみ、 // ソート条件を追加し、$orderを初期化する if ($this->findQueryType != 'count' ) { array_unshift($queryData['order'], $this->order); $this->order = array(); } return $queryData; }
これでCakeのpaginatorのソートを押して複数条件のソートが行えました。
作成するに当たり下記サイトを参考にさせて頂きました。
http://d.hatena.ne.jp/atcorp/20100213/p1