cakephpでHABTMなアソシエーションが思うように動作しないので単純化テストする その5

お手本に習ってページング

仕様
  • ページングを使う
    • ページ遷移後も絞り込みを引き継ぐ
      • 検索パラメータを保持する
  • 絞り込み
    • カテゴリで(HABTM)
    • 表示フラグで
    • 名前で
    • 解除
  • ソート
  • 1ページに表示する件数を変化させたい
ポイント
  • type=get
    • 安全を考えて何が何でもPOSTってのは思考の硬直だった
      • POSTでもらってGETに引継ぎとか面倒なこと考えなくてよい
      • $form->create('Cooking', array('url'=>'/cookings/index', 'type'=>'get'))
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でつなげる