昨日の記事の続きで、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属性に指定して、検索を行います。
なお、上記の部分を含むテンプレートの例は、以下のリンクからダウンロードすることができます。






![Hardcore Will Never Die, But You Will [Bonus Tracks] Hardcore Will Never Die, But You Will [Bonus Tracks]](http://userserve-ak.last.fm/serve/34s/67192634.jpg)



コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
藤本様
解説ありがとうございました。とても参考になりました。
複数のカスタムフィールドを組み合わせた検索についてなのですが、カスタムフィールドの入力はドロップダウンやテキスト、ラジオボタン等で、単独で動的検索を行う場合は問題なく作動します。(例①)ただし例②を行うと希望の検索結果と異なります。私の説明が至らない部分もあるかと思いますがご教授願えますでしょうか?
例①の場合で○○○○と△△△△にチェックを付けた場合、
○○○○と△△△△を含むものが出力される(cf_01に対してOR検索が実行される。)ので望む結果が出力されます。
ただし複雑なORとANDを行う検索をすると結果が違うのですが処理する方法はありますでしょうか?私の記述間違いもあるかと思いますので参考として例②を表記しておきます。
例②の場合で○○○○と△△△△にチェックを付けた場合、
○○○○と△△△△、両方を含むものが出力される。(cf_01に対してAND検索が実行される。)
例②の場合で○○○○と△△△△と■■■■にチェックを付けた場合、○○○○と■■■■を含むものが出力される。(望む結果は○○○○と△△△△に該当し、かつ■■■■を含むもの)
===================================================
例①
※ベースネームがcf_01が存在
(フィールド内は数字or文字)
↓↓↓↓↓検索フォーム部分↓↓↓↓↓
~フォーム部分略~
<input type="checkbox" id="cf_01" name="cf_01" value="○○○○" />○○○○
<input type="checkbox" id="cf_01" name="cf_01" value="△△△△" />△△△△
<input type="checkbox" id="cf_01" name="cf_01" value="××××" />××××
~フォーム部分略~
↓↓↓↓↓検索結果出力部分↓↓↓↓↓
<mt:If name="qp_cf_01">
<mt:SearchConditionCFSection field="cf_01">
<$mt:SearchConditionCFLike values="$qp_cf_01"$>
</mt:SearchConditionCFSection>
</mt:If>
~下部分略~
===================================================
例②
※ベースネームがcf_01が存在
※ベースネームがcf_02が存在
(フィールド内は数字or文字)
↓↓↓↓↓検索フォーム部分↓↓↓↓↓
~フォーム部分略~
<input type="checkbox" id="cf_01" name="cf_01" value="○○○○" />○○○○
<input type="checkbox" id="cf_01" name="cf_01" value="△△△△" />△△△△
<input type="checkbox" id="cf_01" name="cf_01" value="××××" />××××
<input type="checkbox" id="cf_02" name="cf_02" value="■■■■" />■■■■
<input type="checkbox" id="cf_02" name="cf_02" value="□□□□" />□□□□
<input type="checkbox" id="cf_02" name="cf_02" value="◇◇◇◇" />◇◇◇◇
~フォーム部分略~
↓↓↓↓↓検索結果出力部分↓↓↓↓↓
<mt:If name="qp_cf_01">
<mt:SearchConditionCFSection field="cf_01">
<$mt:SearchConditionCFLike values="$qp_cf_01"$>
</mt:SearchConditionCFSection>
</mt:If>
<mt:If name="qp_cf_02">
<mt:SearchConditionCFSection field="cf_02">
<$mt:SearchConditionCFLike values="$qp_cf_02"$>
</mt:SearchConditionCFSection>
</mt:If>
~下部分略~
===================================================
以上よろしくお願い致します。
>SHさん
こんにちは。
例2の書き方だと、cf_01/cf_02のチェックボックスそれぞれはOR検索になります。
そして、cf_01とcf_02の間はAND検索になります。
いただいた例だと、以下のような条件で検索することになります。
・cf_01では、検索フォームの「○○○○」「△△△△」「××××」の3つのチェックボックスの中で、チェックをオンにした条件のどれかを満たしている
・cf_02では、「■■■■」「□□□□」「◇◇◇◇」の3つのチェックボックスの中で、チェックをオンにした条件のどれかを満たしている
・上記2つの条件をともに満たす
したがって、例2で「○○○○と△△△△にチェックを付けた場合」だと、「○○○○と△△△△両方を含むものが出力される」ではなく、「○○○○と△△△△のどちらかを含むものが出力される」になるはずです。
また、例2で「○○○○と△△△△と■■■■にチェックを付けた」という場合、今の検索結果テンプレートの書き方からすれば、「○○○○または△△△△を含み、かつ■■■■を含むものが出力される」という動作になるはずです。
「cf_01で○○○○と△△△△両方を含み、かつcf_20で■■■■と□□□□の両方を含む」というような条件で検索するには、検索結果テンプレートのcf_01/cf_02の部分を、いずれも当記事の「3.AND検索を行う」のように書く必要があります。
>藤本様
いつもお世話になります。ありがとうございました。解決しました。
現在SerchEntriesにてMoreCustomFieldsのチェックボックスグループと数値の範囲を組み合わせた型でテストしているのですが、チェックボックスグループ単独の検索(例えばチェックボックスグループAの項目のみチェック、B、C、数値の範囲は選択なし)をした時にエラーが出てしまいます。
再構築に失敗しました。
: Can't call method "execute" on an undefined value at C:\xampp\htdocs\mt4\extlib/Data/ObjectDriver/Driver/DBI.pm line 153.
数値の範囲に数値を入れ、いずれかのチェックボックスグループを選択した場合はエラーは出ず意図したとおりに検索結果が得られます。
又、チェックボックスグループは選択なし、数値の範囲のみ選択した場合は数値の検索が意図した結果になります。
いずれかのチェックボックスグループ、数値の範囲を単独で検索をかけても、組み合わせても意図した結果になるにはどのようにテンプレートを訂正すればよろしいでしょうか?
長かったためかテンプレート部分が切れてしまいましたので再度投稿させていただきます。申し訳ないです。
結果表示テンプレート
<$mt:GetQueryParamsToVars$>
<mt:SearchConditions>
チェックボックスグループA
<mt:If name="qp_ベースネームA">
<mt:SearchConditionCFSection field="ベースネームA">
<$mt:SearchConditionCFLike values="$qp_ベースネームA"$>
</mt:SearchConditionCFSection>
</mt:if>
チェックボックスグループB
<mt:If name="qp_ベースネームB">
<mt:SearchConditionCFSection field="ベースネームB">
<$mt:SearchConditionCFLike values="$qp_ベースネームB"$>
</mt:SearchConditionCFSection>
</mt:if>
チェックボックスグループC
<mt:If name="qp_ベースネームC">
<mt:SearchConditionCFSection field="ベースネームC">
<$mt:SearchConditionCFLike values="$qp_ベースネームC"$>
</mt:SearchConditionCFSection>
</mt:if>
数値の範囲
<mt:SearchConditionCFSection field="ベースネームD">
<$mt:SearchConditionCFCompare ge="$qp_ベースネームD_min" le="$qp_ベースネームD_max"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
>vinyasaさん
こんにちは。
当方の環境でテストした限りでは、チェックボックスグループと数値の組み合わせで、チェックボックスのみ/数値のみ/チェックボックスと数値の組み合わせのどのパターンでも、エラーになることはありませんでした。
試しに、数値の範囲の条件を指定する部分を、以下のようにしてみてください。数値の範囲が入力されていなければ、数値の範囲の条件指定を行わなくなります。
<mt:If name="qp_ベースネームD_min" ne="">
<mt:If name="qp_ベースネームD_max" ne="">
<mt:SearchConditionCFSection field="ベースネームD">
<$mt:SearchConditionCFCompare ge="$qp_ベースネームD_min" le="$qp_ベースネームD_max"$>
</mt:SearchConditionCFSection>
</mt:If>
</mt:If>
アドバイスどおりにテンプレートを修正したところ解決しました。ありがとうございました。
藤本様
いろいろなプラグインをありがとうございます。
このページを見て、More Custom Fieldsプラグインの存在を知りました。リンクをたどってバージョン1.4.8をダウンロードして、MT5に入れてみました。
ところが、エントリー入力画面のレイアウトが崩れてしまいました。しかも、ジャバスクリプトエラーまで起きて、画像の挿入などのボタンまで使えなくなりました。
そちらではこのような症状はないのでしょうか。
ここで質問するようなことでは無いと思いますが、More Custom Fieldsプラグインのことは検索してもあまり見つかりませんでしたので・・・。
よろしくお願いします。
>zuxさん
こんにちは。
確認してみたところ、ご指摘のような現象が起こりました。
解決できそうな方法を見つけましたので、明日の当ブログの記事で紹介します。
おお、早速の確認ありがとうございます。
明日を楽しみにしております。
いつもすばらしいプラグインを提供していただきありがとうございます。検索とは違うのですが、どこで質問して良いか分からずこの場をお借りします。SupplementalCFTagsプラグインとMore Custom Fieldsのチェックボックスを利用して、投稿画面で複数チェックした項目を
>matsuさん
こんにちは。
ご質問の件ですが、ブログ記事ごとに、More Custom FieldsのCheckboxGroupチェックの状況を出力したいということでしょうか。
SupplementalCFTagsプラグインは、残念ながらそのような用途で使うものではありません。
なお、ChegkboxGroupには、チェックされた値が「, 」(コンマと空白)で区切りって保存されています。
小粋空間様で配布されているSplitプラグインを使って、コンマと空白で値を分解して出力すれば良いかと思います。
http://www.koikikukan.com/archives/2009/01/20-015555.php