CakePHP の Search Plugin で複数のモデルを使用する
2010/10/25 追記: CakePHP の Search Plugin で HABTM なモデルを検索する方法について書きました。 /blog/2010/10/25/cakephp-search-plugin-habtm/
ここで使用している CakePHP のバージョンは 1.3.3 です。
Search Plugin すげー!と興奮しながら使用していたのですが、
- post モデルの title フィールドと、
- user モデルの username フィールド
を同時に検索するにはどうすればいいんだろう?というところでハマりました。
Search Plugin とは、検索機能を簡単に実装できる、(CakePHP 開発元である)CakeDC 製の CakePHP Plugin です。
CakeDC's search at master - GitHub http://github.com/CakeDC/search
一応解決できたのでメモ。 ここ違うよ!というところがあればツッコミをお願いします...
以下のコードは関係のある部分のみを載せてあります。
<?php
// models/post.php
class Post extends AppModel {
var $belongsTo = array('User');
var $actsAs = array(
'Search.Searchable'
);
var $filterArgs = array(
array('name' => 'title', 'type' => 'like'),
);
<?php
// models/user.php
class User extends AppModel {
var $actsAs = array(
'Search.Searchable'
);
var $filterArgs = array(
array('name' => 'username', 'type' => 'like'),
);
<?php
// controllers/posts_controller.php
class PostsController extends AppController {
var $components = array('Search.Prg');
var $presetVars = array(
array('field' => 'title', 'type' => 'value'),
array('field' => 'username', 'type' => 'value')
);
function search() {
$this->Prg->commonProcess();
$this->paginate['conditions'] = $this->Post->parseCriteria($this->passedArgs);
$this->paginate['conditions'] += $this->Post->User->parseCriteria($this->passedArgs);
$this->set('posts', $this->paginate());
}
2010/9/29 追記:
var $presetVars = array(
array('field' => 'title', 'type' => 'value'),
array('field' => 'username', 'type' => 'value', 'formField' => 'username', 'modelField' => 'User.username', 'model' => 'User')
);
と掲載していましたが、不要な部分があった為、削除しました。
formField, modelField, model については、'type' => 'lookup'
の時のみ指定する必要があるみたいです。
value
や checkbox
を指定している場合は必要ありません。
<?php
// views/posts/search.ctp
echo $form->create('Post', array(
'url' => array_merge(array('action' => 'search'), $this->params['pass'])
));
echo $form->input('title', array('div' => false));
echo $form->input('username', array('div' => false));
echo $form->submit(__('Search', true), array('div' => false));
echo $form->end();
?>
controllers/posts_controller.php で
$this->paginate['conditions'] = $this->Post->parseCriteria($this->passedArgs);
$this->paginate['conditions'] += $this->Post->User->parseCriteria($this->passedArgs);
としているところが肝かな... ちょっと気持ち悪い感じもしますが...
Search Plugin の使い方については、以下の記事や Search Plugin の README が参考になりました。 ありがとうございます!
Search Plugin for CakePHP で簡単検索機能実装 | Fusic Developers' Weblog http://blog.fusic.co.jp/archives/156
CakeDC's search at master - GitHub http://github.com/CakeDC/search
新しい投稿
サイコリング古い投稿
サイコリングとラジコンヨット