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属性に指定して、検索を行います。

なお、上記の部分を含むテンプレートの例は、以下のリンクからダウンロードすることができます。

チェックボックスグループのカスタムフィールドをAND検索する場合の検索結果表示テンプレートの例

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください