2012年10月03日
カスタムオブジェクトをカスタムフィールドの値で検索する
PowerCMSではブログ記事やウェブページをカテゴリ等を指定してダイナミック検索する機能が含まれていますが、カスタムオブジェクトを動的に検索したいケースがあるかと思います。Enterpriseエディション又はMovable Type Advanced+PowerCMSの場合は、PowerSearchプラグインを使って複雑な複数条件指定をテンプレートと設定のみで実現できます。
このエントリでは、Standard版、Professional版でも動作可能なDynamicMTMLを利用したカスタムサーチの実現方法についてご紹介します。
SearchCustomObjectFieldプラグインのインストール
オプションプラグイン(options)のSearchCustomObjectFieldプラグインをpluginsディレクトリにインストールします。このテンプレート・タグは、下記のように使います。
<mt:SearchCustomObjectField class="book" field="bookauthor"
separator="," multi="1" query="野田,純生" and_or="AND">
マッチしたカスタムオブジェクトのループ
</mt:SearchCustomObjectField>
- モディファイア
class クラス名 multi 複数キーワードを対象とする場合1 separator 複数キーワードを対象とする場合の区切り文字 query 検索キーワード and_or AND又はOR limit 件数 offset 何件目からを検索対象とするか
より具体的な例をご紹介します。例として「グループ会社」というカスタムオブジェクト(GroupCompany)を作成し、ベースネームが「groupcompanyaddress」というカスタムフィールド(テキスト形)を作成します。
続いて、検索フォームを作成します。
<form action="search.html">
第1条件:<input type="text" value="" name="q[]" />
第2条件:<input type="text" value="" name="q[]" />
<input type="radio" name="and_or" value="AND" /> AND
<input type="radio" name="and_or" value="OR" /> OR
<input type="submit" value="検索!" />
</form>
検索を実行すると、下記のようなリクエストURLへ遷移します。
search.html?q[]=東京&q[]=名古屋&and_or=OR
このリクエストを処理するテンプレートは以下のようになります。複数の同一キーのパラメタを受け取るためにMTQueryLoopブロックタグを利用しています。
<MTDynamicMTML>
<mt:QueryLoop key="q" glue="," setvar="query"><mt:var name="q"></mt:QueryLoop>
<mt:Query key="and_or" setvar="and_or">
<mt:SearchCustomObjectField class="groupcompany"
field="groupcompanyaddress" separator=","
multi="1" query="$query" and_or="OR">
<MTCustomObjectName>...
</mt:SearchCustomObjectField>
</MTDynamicMTML>
以下は、複数キーワードをスペースで区切って検索する例です。検索語をスペースで分割するために、MTSplitVarsブロックタグを利用しています。
<MTDynamicMTML>
<mt:Query key="q" setvar="q">
<form action="search.html">
検索ワード(スペース区切り):<input type="text" value="<mt:var name="q" escape="html"" name="q" />
<input type="radio" name="and_or" value="AND" /> AND
<input type="radio" name="and_or" value="OR" /> OR
<input type="submit" value="検索!" />
</form>
<MTSplitVars delimiter=" " text="$q" glue="," name="value" setvar="query"><mt:Var name="value"></MTSplitVars>
<mt:SearchCustomObjectField class="groupcompany"
field="groupcompanyaddress" separator=","
multi="1" query="$query" and_or="OR">
<MTCustomObjectName>...
</mt:SearchCustomObjectField>
</MTDynamicMTML>
コメントを投稿する