CakePHP 2.3.10 を利用して、bake を使って簡単なWebアプリを作りました。そのWebアプリに検索機能を付けたいので、CakePHP の Search Plugin を導入して、検索機能を使えるようにしました。
その対応を記録しておきます。
1.CakePHP バージョン、bakeで作成してあるWebアプリ
CakePHP は、2.3.10 を導入してあります。
データベースは、MySQLを導入してあり、使える状態になっていることを前提とします。
bake で作成したWebアプリは簡略化する為、以下とします。
- Model/Sale.php
- View/Sales/index.ctp
- Controller/SalesController.php
ブラウザで表示した状態は以下の画面です。
後ほど検索結果を確認しやすくするために、データを4件登録してあります。
検索フォームは、この画面のリストの上に表示させる事にします。
2.Search Plugin の初期導入
Search Plugin は「Search Plugin for CakePHP」で、ダウンロード先は https://github.com/CakeDC/search です。
ファイルをダウンロードして、CakePHP の Plugin ディレクトリに配置します。
# cd /usr/local/src # wget https://github.com/CakeDC/search/archive/master.zip # mv master master.zip # unzip master.zip # mv search-master/ Search # mv Search/ (CakePHP導入先)/app/Plugin/
次に、app/Config/bootstrap.php で、Search Plugin をロードする設定を入れます。設定する内容は以下です。
CakePlugin::load('Search');
以上で、Search Plugin の初期導入は終わりです。
次は、Webアプリでの設定になります。
3.WebアプリへのSearch機能の実装
「1.CakePHP バージョン、bakeで作成してあるWebアプリ」で記載のとおりですが、以下のMVCアプリがあります。
- Model/Sale.php
- View/Sales/index.ctp
- Controller/SalesController.php
これらに対して、Search対応を施します。
まず今回は、Webアプリ内で Search機能を使うための基礎設定を先に入れてしまいます。
Model/Sale.php の「class Sale extends AppModel」配下に以下の設定を入れます。
public $actsAs = array('Search.Searchable');
次に、Controller/SalesController.php の「class SalesController Extends AppController」配下に以下の設定を入れます。
public $components = array('Paginator','Search.Prg');
次からが実際のSearch実装です。
まず、検索フォームから作ります。検索フォームはパーツ化する為、Element化します。
View/Elements/searchForm.ctp を以下の内容で作成します。
<?php echo $this->Form->create('Sale', array('url' => '/sales/index'))?> <fieldset> <legend>Search</legend> <dl> <dt><label>Catalog</label></dt> <dd><?php echo $this->Form->input('catalog_id', array( 'type'=>'numeric', 'div'=>false, 'label'=>false))?></dd> </dl> <?php echo $this->Form->submit('検索', array('div' => false, 'escape' => false))?> </fieldset> <?php echo $this->Form->end()?>
次に、作成した View/Elements/searchForm.ctp を、View/Sales/index.ctp で読み込みます。
以下の行を View/Sales/index.ctp の適当な箇所に入れてください。
<?php echo $this->element('searchForm'); ?>
次は Model/Sale.php に以下の行を入れます。先ほどこのファイルに設定した行の下に入れます。
public $actsAs = array('Search.Searchable'); ←これは先ほど設定した内容 public $filterArgs = array('catalog_id'=> array('type' => 'value'),);
最後に、Controller/SalesController.php の index() に以下の設定を入れます。
public function index() { $this->Prg->commonProcess(); $this->paginate = array( 'Sale' => array( 'conditions' => array( $this->Sale->parseCriteria($this->passedArgs) ) )); $this->Sale->recursive = 0; $this->set('sales', $this->Paginator->paginate()); }
以上で、設定は完了です。
4.ブラウザ確認
検索フォームがちゃんと表示されるか、ブラウザで確認します。
検索フォームが表示されています。
次に、検索条件を入れてみます。「1 = CakePHP」、「2 = JMeter」となっています。「1」を入力して「検索」ボタンをクリックします。
「1 = CakePHP」としていますので、しっかり検索結果のみが表示されています。
念のため、「2」を入力して「検索」ボタンをクリックします。
「2 = JMeter」としていますので、しっかり検索結果が表示されています。
以上が、bake で作成したWebアプリに検索機能を追加する時の手順になります。