cakephp 用の search plugin ですが,これまで CakeDC の search plugin を使っていましが,cakephp3 をいじっているついでに FriendsOfCake の search plugin を使ってみました.
cakephp2 対応版の CakeDC との比較になりますが,FriendsOfCake の search plugin の方が導入は何だか簡単な気がしましたね.
基本的にはマニュアル通りに記載すれば動作しますが,入力された複数キーワードに対しての and 検索がしたかったので custom finder を設定して
public function searchConfiguration()
{
$search = new Manager($this);
$search
->finder('keyword');
return $search;
}
public function findKeyword(Query $query, array $options)
{
$fields = [$this->aliasField('hoge1'), $this->aliasField('hoge2') ];
$keywords = preg_split('/[\s,]+/', $options['keyword']);
foreach ($keywords as $keyword) {
$opt_key = ;
foreach ($fields as $field) {
$opt_key = [
$field.' LIKE' => '%'.$keyword.'%'
];
}
$query->where([
'OR' => $opt_key
]);
}
return $query;
}
な感じの Model 記述にしてみました.ちなみに form は
<?= $this->Form->create($hoge); ?>
<?= $this->Form->input('keyword', ['type' => 'text']); ?>
<?= $this->Form->submit('検索'); ?>
<?= $this->Form->end(); ?>
な感じ.と,keyword という input を使っているので Model 側では $options['keyword'] で入力が取れます.
キーワードの and/or 切り替え付けるなら,さらに form を追加して,$query->where への渡し方を $options で切り替えれば良さそうですね.
上記では $options['keyword'] をそのまま使って split 処理しているだけですが,$options['keyword'] に対するトリミングや各種タグやコマンド類の削除,クオートなどの処理等は適宜追加をしたほうがよいかと思います.cakephp 側や,search plugin などでもやっているかもしれないけど,念には念を入れてね.と一応書いておく.