メンテナンス作業をしているcakephp2のシステムについて、「検索のメールバリデーションを外してほしい」という依頼があり、その対応を進めていた。
で、どうやら検索は、cakeにて利用できるSearch Pluginというものがあり、それを使っているということが分かったので、その周りの設定値を修正することでできそうな気がした。
調べてみたら、以下の設定値っぽいものがあった。
- $filterArgs → 検索を行うテーブルのModelに記載されていた。
- $presetVars → 検索処理を行うControllerに記載されていた。
それぞれで、どういう設定を行っているのか調べる。
ただ、正直完璧にわかったわけではなく、現状の仕事にて状況が分かるレベルまで調査した。
ページコンテンツ
そもそもSearch Pluginとは?
Cake Development Corporationなる組織(多分cakeを作った人たちかな?)にて検索機能のために作られたcake用のプラグインなのだと思われる。名前から想像できるけど。
Cake Development Corporationについて調べてみたけど、CakePHPを作ったLarry Masters氏によって作られた会社で、ソフトウェア開発やコンサルティングをやっているとのこと。
Cake Development CorporationのLinkedInのページ
$filterArgsについて
検索条件を設定している。ざっと以下のような感じとのこと。
- 検索を行うModel(検索したいテーブル)にて定義する。
- 検索対象のフィールドについて、配列にて定義する。nameごとにfield,type,method,emptyを設定する。
- name: $dataに格納されている名前(フォームのnameかな?)。後述のfieldと同じなら省略できる。
- field: 検索条件を適用するテーブルのfield。配列で複数指定すれば、受け取った値をそれぞれのfiledにて検索する。
- type: 検索時のマッチング方法。like(部分一致)、value(完全一致)、expression(範囲などの条件式)、subquery(値のリスト)、query(複数条件を組み合わせたりいろいろできる)を指定する。
- method: 戻り値を検索条件として利用する関数名を指定できる。
- empty(allowempty): 空を許可するかどうか指定。true or false。
ex)
public $filterArgs = array(
'id'=>array(
'type'=>'value',
'field'=>'User.id'
),
'email'=>array(
'type'=>'like',
'field'=>'User.email'
),
'username'=>array(
'type'=>'like',
'field'=>'User.nickname'
),
'gender'=>array(
'type'=>'value',
'field'=>'User.gender'
)
'status'=>array(
'type'=>'value',
'field'=>'User.status'
)
);
$presetVarsについて
このプラグインは、最終的にgetのパラメータを参照して検索処理を行うが、検索フォームに入力した値を受け取って、それをgetのパラメータに変換するための設定がこれらしい。
「true」だけを指定しててもいいみたいだが、凝った検索条件にすると、値をそのままパラメータ化してもうまく動かないため、この変数でいろいろ設定してやるみたい。
設定項目は$filterArgsと同じような感じだが、以下の設定値を指定できるみたい。
- name: 上と同じ
- field: 上と同じ
- type: 意味合いは上と同じだが、設定値は下の3つ。
- value: 普通、これを記載すればいいみたい。
- checkbox: フォーム項目がcheckboxの場合に指定する。複数項目チェックとかに対応しているらしい。
- lookup: フォーム項目にオートコンプリートルックアップを使った場合、指定してやる必要があるらしい。
- model: このフィールドで使われているモデルを指定する。モデルをまたぐ場合は使うのかも?
- formField: よくわからない。説明文には「フォーム内のフィールドで、model.filedを設定する」とある。modelFieldとの違いは?
- modelField: よくわからない。説明文には「ビューにて設定するフィールド名として設定する」とある。
- encode: %など、URLのパスとして使ったらまずい値が与えられるときに設定しておく。
- empty: 上と同じ。
ex)
public $presetVars = array(
array('field' => 'id', 'type' => 'value','empty' => true),
array('field' => 'email', 'type' => 'value','empty' => true),
array('field' => 'username', 'type' => 'value','empty' => true),
array('field' => 'gender', 'type' => 'value','empty' => true)
array('field' => 'status', 'type' => 'value','empty' => false)
);
最後に
検索を便利にするのは非常に有用で、上の設定値を使うことで検索にバリエーションを持たせることができるのだと思った。
もっといろんな検索をやりたくなったら、再度調査して、ここに追記する予定。