cakephp1.2でのpaginationを使った簡単検索

管理画面で、andとLIKEを使った簡単検索。
メモ用ですが、そのまま使えると思います。

どう簡単かというとビューで、WordsLike.hogehogeを指定するとLIKEを使った検索となり、Words.hogehogeだと普通の検索となります。
そしてANDで繋ぎます。

こんな感じです。

<form action="<?php echo $html->url('/admin/hoge/index'); ?>" method="get">
<?php echo $form->input('WordsLike.title', array('size' => '20','label'=>'タイトル'));?>
<?php echo $form->input('WordsLike.body', array('size' => '20','label'=>'本文'));?>
<?php echo $form->input('Words.tel', array('size' => '20','label'=>'電話番号'));?>

↑複数個あってもいい

<?php echo $form->submit('検索');?>
</form>

今まで、検索をする場合は、入力一つ一つを$conditionsなどに設定していたのが必要ありません。

しかもセッションを使っているのでソートや、ページングの部分で検索対象が消えることなく検索項目が引き継げます。




コントローラの検索する所に以下を追加します。
今回はpaginateを使っています。

app/controllers/hoges_controller.php

if(isset($thhis->params['url']['data']['Words'])) $this->data['Words'] = $this->params['url']['data']['Words'];
if(isset($this->params['url']['data']['WordsLike'])) $this->data['WordsLike'] = $this->params['url']['data']['WordsLike'];

//セッションか入力データでの検索設定。
if(isset($this->params['url']['data'])) {
  $conditions = $this->Hoge->search($this->params['url']['data']);
  $this->Session->write('search',$this->params['url']['data']);
  $this->Session->write('conditions',$conditions);
}elseif($this->Session->check('conditions')){
  $conditions = $this->Session->read('conditions');
  $this->data = $this->Session->read('search');
}else{
  $conditions = null;
}

$this->Hoge->recursive = 0;
$this->set('data', $this->paginate($conditions));

モデルに下記内容を追加します。
app/models/hoge.php

function search($paramsdata = null)
  {
    
    $conditions = $condtmp = null;
    if(isset($paramsdata['Words'])){
        $words = $this->_create_select_conditions($paramsdata['Words']);
        if($words) $condtmp = am($condtmp, $words);
    }
    if(isset($paramsdata['WordsLike'])){
        $wordsLike = $this->_create_like_conditions($paramsdata['WordsLike']);
        if($wordsLike) $condtmp = am($condtmp, $wordsLike);
    }
    if($condtmp) $conditions = array('and' => $condtmp);
    return $conditions;
  }

app_model.phpに、下記を追加します。
ない場合は、cake\console\libs\templates\skel\app_model.phpからコピーします。

app/app_model.php

//and検索をLIKEで繋ぐ
function _create_like_conditions($data){
    $like = array();
    foreach($data as $k=>$v){
      if($v){
        $like[$k. ' LIKE'] = '%'.$v.'%';
      }
    }
    return $like;
}
//and検索を指定して繋ぐ
function _create_select_conditions($data){
    $and = array();
    foreach($data as $k=>$v){
      if($v){
        $and[$k] = $v;
      }
    }
    return $and;
}

続いて、ビューの部分ですが、
検索項目が
LIKE検索:
WordsLike.名前
指定検索:
Words.名前
の形であとは、なんでも大丈夫です。


あとは、一覧表示部分で$paginator->sort()なんかもOK。
この辺は、bakeでやりましたが。
app/hoge/admin_index.ctp

<form action="<?php echo $html->url('/admin/hoge/index'); ?>" method="get">
<?php echo $form->input('WordsLike.title', array('size' => '20','label'=>'タイトル'));?>
<?php echo $form->input('WordsLike.body', array('size' => '20','label'=>'本文'));?>
<?php echo $form->input('Words.tel', array('size' => '20','label'=>'電話番号'));?>
<?php echo $form->submit('検索');?
</form>

それ以外の検索もapp_model.phpに追加すればいけるんじゃないかと思います。
他のサイトを参考に作成したのですが、サイトのアドレスがわからなくなってしまいました。