cakephpでHABTMなアソシエーションが思うように動作しないので単純化テストする その5
お手本に習ってページング
仕様
- ページングを使う
- ページ遷移後も絞り込みを引き継ぐ
- 検索パラメータを保持する
- ページ遷移後も絞り込みを引き継ぐ
- 絞り込み
- カテゴリで(HABTM)
- 表示フラグで
- 名前で
- 解除
- ソート
- 1ページに表示する件数を変化させたい
ポイント
- type=get
- 安全を考えて何が何でもPOSTってのは思考の硬直だった
- POSTでもらってGETに引継ぎとか面倒なこと考えなくてよい
- $form->create('Cooking', array('url'=>'/cookings/index', 'type'=>'get'))
- 安全を考えて何が何でもPOSTってのは思考の硬直だった
APP/controllers/products_controller.php
<?php ... var $paginate = array( 'Product' => array( 'limit'=> 5, 'order'=> array( 'id'=> 'asc'))); function index() { $params = am($this->params['url'], $this->passedArgs); $conditions = array(); if(isset($params['category_id']) && $params['category_id']){ $dataList = $this->Product->CategoriesProduct->find('list', array( 'fields' => array('CategoriesProduct.product_id'), 'conditions' => array('CategoriesProduct.category_id' => $params['category_id']))); if(!empty($dataList)){ $conditions['Product.id'] = $dataList; } } if(isset($params['hidden']) && $params['hidden'] != ''){ $conditions['Product.hidden'] = $params['hidden']; } //pr($params); //pr($conditions); $result = $this->paginate($this->Product, $conditions); $this->set('params', $params); $this->set('products', $result); $this->set('category_list',$this->Category->find('list')); $this->set('category_selected', $params['category_id']); $this->set('hidden_list',array('0' => '表示', '1' => '仮登録', '2' => '在庫切れ', '3' => '廃盤')); $this->set('hidden_selected', $params['hidden']); } ... ?>
APP/views/products/index.tpl
{$form->create("Product", $view->aa('action','index','type','get'))} {$form->select('category_id', $category_list, $category_selected)} {$form->select('hidden', $hidden_list, $hidden_selected)} {$form->end('検索')} <br /> {$paginator->options($paginator_options)} {$paginator->counter($view->aa('format',"全%count%件中%current%件を表示してます"))}<br /> {$paginator->prev('<<')} {$paginator->numbers()} {$paginator->next('>>')} <table cellpadding="0" cellspacing="0"> <tr> <th>{$paginator->sort('名前','name')}</th> <th>表示</th> <th>操作</th> </tr> {foreach from=$products item='product'} <tr> <td> {assign var='id' value= $product.Product.id} {$html->link($product.Product.name, "view/$id")} </td> <td> {$product.Product.hidden} </td> <td> {$html->link('編集', "/products/edit/$id")} {$html->link('削除', "/products/delete/$id")} </td> </tr> {/foreach} </table>
ソートできるようにする
- ビューの$paginator->options()にベースURLをセット
- カラム名表示を$paginator->sort('名前','name')でリンク生成する
- TODO現在のソート条件を見てわかるように表示したい
- DONEまずは、sortとdirectionを取得して▲か▼を表示しよう
- カラム名クリックでソートのトグルじゃなくて、▲▼(赤アクティブ)のリンクがよい そういえばフォーラムで見たなあ すぐ前の投稿だった
APP/controllers/products_controller.php
<?php ... if(isset($params['category_id']) && $params['category_id']){ $dataList = $this->Product->CategoriesProduct->find('list', array( 'fields' => array('CategoriesProduct.product_id'), 'conditions' => array('CategoriesProduct.category_id' => $params['category_id']))); if(!empty($dataList)){ $conditions['Product.id'] = $dataList; } }else{ $params['category_id'] = ''; } if(isset($params['hidden']) && $params['hidden'] != ''){ $conditions['Product.hidden'] = $params['hidden']; }else{ $params['hidden'] = ''; } $result = $this->paginate($this->Product, $conditions); $paginator_options = array( 'url' => array( 'category_id' => $params['category_id'], 'hidden' => $params['hidden'])); $this->set('paginator_options', $paginator_options); ... ?>
APP/views/products/index.tpl
... {$paginator->options($paginator_options)} ... <th>{$paginator->sort('名前','name')} {if $params.sort == 'name' && $params.direction == 'asc'}▲{/if} {if $params.sort == 'name' && $params.direction == 'desc'}▼{/if}</th> <th>{$paginator->sort('隠し属性','hidden')} {if $params.sort == 'hidden' && $params.direction == 'asc'}▲{/if} {if $params.sort == 'hidden' && $params.direction == 'desc'}▼{/if}</th> ...
nameフィールドに対してlike検索
APP/controllers/products_controller.php
<?php ... if(isset($params['search']) && $params['search'] != ''){ $conditions['name LIKE'] = '%' . $params['search'] . '%'; }else{ $params['search'] = ''; } ... $paginator_options = array( 'url' => array( 'category_id' => $params['category_id'], 'hidden' => $params['hidden'], 'search' => urlencode( $params['search'] ))); ... ?>
APP/views/products/index.tpl
... {$form->text('search',$view->aa('value',$params.search))} ...
対象フィールドを増やす
- LIKE検索をorでつなげる