拙著「FXはチャートで勝つ!」が発売されました。
FX(外国為替証拠金取引)でのチャートの読み方を解説しています。
自由国民社刊で、定価1,728円(消費税込み)です。
SearchEntries プラグインでMore Custom FieldsプラグインのCheckbox Groupを検索する(動的編)
昨日の記事の続きで、More Custom Fieldsプラグインで作ったチェックボックスグループと、SearchEntriesプラグインを組み合わせて、検索を行う方法を紹介します。
今日は、検索フォームを使って、動的に検索できるようにする手順を解説します。
1.検索フォームの作成
まず、検索フォームを作ります。
チェックボックスグループの個々のチェックボックスを検索フォームに出力する方法は、ドロップダウンのカスタムフィールドを検索フォームに出力する方法とほぼ同じです。
拙作のSupplementalCFTagsプラグインを使って、カスタムフィールドのオプションの値を読み込みます。
また、個々のチェックボックスのname属性には、同じ値を指定するようにします。
例えば、昨日の記事のように、ベースネームが「chkgrp」のカスタムフィールドを作って、色を選択できるようにしたとします。
そして、この色で検索できるように、フォームを作りたいとします。
チェックボックスのname属性を「chkgrp」にするとすれば、検索フォームは以下のように作ることができます。
<form method="get" action="<$mt:RealtimeRebuildCGIPath$>">
<input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
<input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="チェックボックスグループ検索結果"$>" />
<p>
<label for="chkgrp">色</label><br />
<mt:LoadCustomFieldInfo basename="chkgrp">
<mt:CustomFieldOptions>
<input type="checkbox" name="chkgrp" value="<$mt:CustomFieldOptionValue$>" /> <$mt:CustomFieldOptionValue$>
</mt:CustomFieldOptions>
</mt:LoadCustomFieldInfo>
</p>
<p>
<input type="submit" value="送信" />
</p>
</form>
6~10行目の部分で、ベースネームが「chkgrp」のチェックボックスグループからオプションの値を1つずつ読み込み、8行目でチェックボックスを順次出力しています。
なお、このフォームを含むテンプレートの例は、以下のリンクからダウンロードすることができます。
ドロップダウンのカスタムフィールドを検索する場合の検索フォームテンプレートの例
2.OR検索を行う
次に、検索結果テンプレートを作ります。
検索フォーム側で複数のチェックボックスをオンにされたときの動作として、以下の2つが考えられます。
- それらのどれか1つの条件を満たす記事を検索する(OR検索)
- すべての条件を満たす記事を検索する(AND検索)
例えば、検索フォームで「赤」と「青」のチェックボックスをオンにされた場合、赤か青がオンになっている記事を検索するのがOR検索で、赤と青の両方がオンになっている記事を検索するのがAND検索です。
まず、OR検索から解説します。
OR検索を行う場合、選択されたチェックボックスの値をコンマで区切って並べ、MTSearchConditionCFLikeタグのvaluesモディファイアに指定します(昨日の記事を参照)。
また、検索フォームで入力された値をMTGetQueryParamsToVarsタグで変数に代入すると、検索フォームのチェックボックスで選択された値がコンマで区切られて、「qp_フィールド名」の変数に代入されます。
したがって、この変数を、MTSearchConditionCFLikeタグのvaluesモディファイアに指定すれば良いです。
ここまでの話に基づいて、以下の仕様で検索結果を出力する部分を作るとします。
- カスタムフィールドのベースネームは「chkgrp」
- 検索フォーム側で、チェックボックスのname属性を「chkgrp」にした
実際に検索結果を出力する部分を作ると、以下のようになります。
5行目のMTSearchConditionCFLikeタグで、values属性に、変数qp_chkgrpの値(検索フォームでチェックされた値をコンマで区切ったもの)を指定しています。
<$mt:GetQueryParamsToVars$>
<mt:SearchConditions>
<mt:If name="qp_chkgrp">
<mt:SearchConditionCFSection field="chkgrp">
<$mt:SearchConditionCFLike values="$qp_chkgrp"$>
</mt:SearchConditionCFSection>
</mt:If>
</mt:SearchConditions>
<mt:IfNonZero tag="SearchLoadedEntryCount">
<p><$mt:SearchLoadedEntryCount$>件</p>
<mt:Entries>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
<mt:Else>
<p>条件に合う記事がありませんでした。</p>
</mt:IfNonZero>
なお、上記の部分を含むテンプレートの例は、以下のリンクからダウンロードすることができます。
チェックボックスグループのカスタムフィールドをOR検索する場合の検索結果表示テンプレートの例
3.AND検索を行う
AND検索を行う場合、MTSearchConditionCFLikeタグを複数回書きます(昨日の記事を参照)。
また、検索フォーム側に同じname属性のフィールドが複数ある場合、MTGetQueryParamsToVarsタグで値を変数に代入すると、「qp_フィールド名_a」という名前の配列が作られて、その配列の個々の要素に、個々のフィールドの値が代入されます。
そこで、MTLoopタグで配列から1つずつ要素を取り出し、その値をMTSearchConditionCFLikeタグのvalues属性に指定すれば、検索フォームの条件に沿ってAND検索を行うことができます。
ここまでの話に基づいて、以下の仕様で検索結果を出力する部分を作るとします。
- カスタムフィールドのベースネームは「chkgrp」
- 検索フォーム側で、チェックボックスのname属性を「chkgrp」にした
実際に検索結果を出力する部分を作ると、以下のようになります。
<$mt:GetQueryParamsToVars$>
<mt:SearchConditions>
<mt:If name="qp_chkgrp_a">
<mt:SearchConditionCFSection field="chkgrp">
<mt:Loop name="qp_chkgrp_a">
<$mt:SearchConditionCFLike values="$__value__"$>
</mt:Loop>
</mt:SearchConditionCFSection>
</mt:If>
</mt:SearchConditions>
<mt:IfNonZero tag="SearchLoadedEntryCount">
<p><$mt:SearchLoadedEntryCount$>件</p>
<mt:Entries>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
<mt:Else>
<p>条件に合う記事がありませんでした。</p>
</mt:IfNonZero>
1行目のMTGetQueryParamsToVarsタグによって、検索フォームでチェックされた値は、配列変数qp_chkgrp_aに代入されます。
そこで、5~7行目のMTLoopタグの繰り返しを使って、配列変数qp_chkgrp_aから値を1つずつ取り出し、その値をMTSearchConditionCFLikeタグのvalues属性に指定して、検索を行います。
なお、上記の部分を含むテンプレートの例は、以下のリンクからダウンロードすることができます。
