最近CakePHPプラグインづいている小山です。
今回はCakeDC謹製のSearch Pluginを紹介します。
(CakePHPのバージョンは1.3.0を想定しています。)
Search Plugin
みなさんはCakePHPで検索機能を作るとき、どのように実装していますか?
たとえば一般的な一覧画面(index)で検索機能を実装しようと思ったら、まずはformを作成して検索条件をPOSTで飛ばして利用すればいいですが、
さらに最近デフォルトで実装されているページネーション機能と連携して、検索結果でページングを実現しようとするとちょっと面倒です。
さらに細かい検索条件を実装しようと思ったら、もう考えたくありません。
自分は新規案件のたびに毎回1からつくっていたような気がします。
CakePHPのコアデベロッパーの75%を抱える(CakeDCのサイト情報)CakeDCでも、やはり面倒だと思っていたのか、Search Pluginという検索プラグインを作成して使っていたようです。
最近いくつかのプラグインのソースが公開されたので自分も使ってみました。
実際に触ってみると面白いくらいに簡単に検索機能が実装できます。
CakePHPの初期設定
どれくらい楽かがわかるように、CakePHPをダウンロードしてくるところから実施してみます。
$ wget http://github.com/cakephp/cakephp1x/tarball/1.3.0 $ tar zxvf cakephp-cakephp1x-1.3.0-0-g1c06478.tar.gz $ mv cakephp-cakephp1x-3bb7793/ cakesearch $ cd cakesearch |
次にデータベースを作成します。
今回はcakesearchというデータベースにpostsというテーブルを作成します。
次にCakePHPいつもの設定をします。
appフォルダをそのまま使うつもりですが、app/config/*.phpをいじったりtmpフォルダのパーミッションの設定をするのが面倒なので、今回はbakeコマンドを利用してちょっと楽をします。
$ php cake/console/cake.php bake |
bakeコマンドメニューの”[D]atabase Configuration”を使ってデータベースの設定をしたあと、”[P]roject”を使ってプロジェクトの設定をします。
そこで、「What is the full path for this app including the app directory name?」と聞かれるので、ここであえてappフォルダのパスを指定します。
[/var/www/cakesearch/app/myapp] > /var/www/cakesearch/app |
このあとは導かれるままにEnterを押していくと、app/config/core.phpのSecurity.saltやCakePHP1.3から新たに導入されたSecurity.cipherSeedの設定をしてくれます。app/tmpのパーミッション設定までしてくれています。
つぎにbakeコマンドを使ってpostsテーブルのMVCのファイルを作成します。
このとき、「Would you like to create some basic class methods」と聞かれたときにyを選択してindexアクションを作成しておいてください。
Search Pluginの設定
さて、ここまででCakePHP自体の設定は終わりです。
ここからSearch Pluginを導入してみます。
CakeDCのgithubリポジトリからSearchプラグインをダウンロードして設置します。
$ cd app/plugins $ wget http://github.com/CakeDC/Search/tarball/master $ tar zxvf CakeDC-Search-xxxxxx.tar.gz $ mv CakeDC-Search-xxxxxx search |
これでSearch Pluginの設置は完了です。
次にpostsの一覧画面(posts/index)にtitleで検索する機能を実装してみます。
bakeコマンドで作成されたapp/models/post.phpを以下のように書き換えます。
$filterArgsは大体想像できると思うのですが、「titleフィールドをLIKEで検索する」ための設定です。typeには他にも完全一致や、サブクエリなどをつかった条件指定などもできます。
次にapp/controllers/posts_controller.phpを書き換えます。
(簡単のためindexアクションまでを表示しています)
$presetVarsは、検索フォーム内のデータを管理するための設定値です。
$this->Prg->commonProcess()は検索条件のデータのハンドリングを行っています。例えば検索条件自体のバリデーションなどもすることが可能です。
$this->Post->parseCriteria()は$this->passedArgsと$this->Post->filterArgsを利用して$this->paginateに渡す条件を作成します。
次にapp/views/posts/index.ctpを書き換えます。
(簡単のため書き加えた部分周辺のみを表示しています)
これでbakeコマンドで生成したファイルの修正はすべて終了です。
なんとこれだけです。
たったこれだけの修正で、ページネーションと連携したり、検索した条件が保持されたりする検索機能を実装できました。
まとめ
今回は、CakeDC謹製 Search Pluginの簡単な導入方法を紹介しました。
もう少し込み入った使い方などはREADMEなどに詳細に書かれていますので、是非参考にしてみてください。