お知らせ

Movable Type 5.1 Webサイト製作ガイドVolume 22011年7月20日

Movable Type 5.1 Webサイト製作ガイドVolume 2」を発売しました。
前書「Movable Type 5 Webサイト製作ガイド Volume 2」をMovable Type 5.1対応に改訂しました。 「Movable Type 5.1 Webサイト製作ガイドVolume 1」の続編で、変数等の応用的な機能や、ウェブサイトやテーマなどのMovable Type 5の新機能についてしっかり解説した書籍です。
Movable TypeでWeb製作をされている方などにお勧めです。
PDFによる販売で、当サイトでのみ購入できます(書店では購入できません)

他にも多数書籍を執筆しています。
こちらもぜひご覧ください。

ブログ記事詳細検索プラグイン(その20・検索フォーム/検索結果表示の事例・数値の範囲で検索)

| コメント(11) | トラックバック(0)

検索フォーム/検索結果表示テンプレートの事例の1つとして、「フィールドの値が○○以上□□以下」など、2つの数値で条件を指定して検索する場合を取り上げます。

数値の範囲で検索

以下のような事例を基に解説します。

  • 商品の価格を表すために、「entry_price」というベースネームのカスタムフィールドを作っているものとします。
  • 検索結果表示用のテンプレートモジュールには、「詳細検索結果」という名前を付けるものとします。
  • 「価格が○○円以上□□円以下」という条件で検索できるようにします。

1.検索フォーム側

検索フォーム側には、上限/下限の2つの数値を入力するために、テキスト入力欄を2つ作ります。
下限/上限のテキスト入力欄のname属性を、それぞれ「entry_price_min」「entry_price_max」にするなら、テンプレートの検索フォーム部分は以下のように組むことが考えられます。

<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="entry_price_min">価格が</label>
    <input type="text" name="entry_price_min" id="entry_price_min" size="10" />円以上
    <input type="text" name="entry_price_max" id="entry_price_max" size="10" />円以下
  </p>
  <p>
    <input type="submit" value="送信" />
  </p>
</form>

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

数値の範囲で検索する場合の検索フォームテンプレートの例

2.検索結果表示テンプレート側

検索結果表示テンプレート側では、以下のような手順で、検索結果を出力します。

  • MTGetQueryParamsToVarsタグを使って、フォームから送信された値を変数に代入します。
  • MTSearchConditionCompareタグやMTSearchConditionCFSectionタグ/MTSearchConditionCFCompareタグを使って、数値での検索条件を指定します。

1.で作ったフォームだと、MTGetQueryParamsToVarsタグによって、入力された数値は「qp_entry_price_min」と「qp_entry_price_max」という変数に代入されます。
これらの変数を、検索条件の下限/上限に指定します。
また、カスタムフィールドで検索するので、MTSearchConditionCFSectionタグとMTSearchConditionCFCompareタグを使って条件を指定します。
上記の話に沿って、検索結果表示テンプレートの検索部分を作ると、以下のようになります。

<$mt:GetQueryParamsToVars$>
<mt:SearchConditions>
  <mt:SearchConditionCFSection field="entry_price">
    <$mt:SearchConditionCFCompare ge="$qp_entry_price_min" le="$qp_entry_price_max"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

4行目のMTSearchConditionCFCompareタグで、ge/leの2つのモディファイアを使って、範囲の下限と上限を指定しています。

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

数値の範囲で検索する場合の検索結果表示テンプレートの例

3.SearchEntriesプラグイン関係の記事の一覧

SearchEntriesプラグイン関係のその他の記事は、以下のリンクから参照できます。

Facebook連携

当記事について「いいね」や「送信」を行っていただけると幸いです。


この記事についてウォールに投稿

トラックバック(0)

トラックバックURL: http://www.h-fj.com/mt/mt-tb.cgi/2117.

コメント(スレッド3件,コメント11件)

コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。

No.1 SH : (無題)

藤本様

初心者なもので説明が至らなかったら申し訳ありません。
とても便利なプラグインでいつも大変助かっております。

「Can't call method "type" on an undefined value at /(ルートパス)SearchEntries/Plugin.pm line 703」

と言うエラーが出てしまいます。本文のフリーワード検索は問題なく使用できる(再構築され、きちんと出力される)のですが、カスタムフィールドの検索を行おうとすると、検索結果を出力する時(再構築する時に)エラーが出てしまいます。ご教授願えますか?
利用MTバージョン:MT5

No.2  : (無題)

>SHさん
こんにちは。

ご質問の件ですが、MTSearchConditionCFSectionタグのfieldモディファイアに指定しているベースネームが、実際のカスタムフィールドのベースネームと一致していないのではないかと思います。
ベースネームの指定を見直してみてください。

No.3 (匿名) : (無題)

>藤本

お忙しい所早速の回答ありがとうございます。
説明の補足ですが検索を利用しているのは、WEBサイトの下部(例:ウェブサイト.com/ブログ/)のブログでカスタムフィールドの作成はシステムから行いました。管理画面上で確認した所、ベースネームの指定に間違いはありませんでした。
(例:cf_01等といった指定をしております。
ブログでカスタムフィールドを作成しなくてはならない、cfと言う文字は禁止といった条件等はありますでしょうか?

度々で申し訳ありませんがよろしくお願い致します。

No.4 SH : (無題)

>藤本様

藤本様宛ての様と当方の名前が抜けていました。誠に申し訳ありませんでした。

No.5  : (無題)

>SHさん
こんにちは。

システムのカスタムフィールドに正しく対応していない不具合が見つかりました。
修正版を明日公開します。

No.6 SH : (無題)

>藤本様

迅速な対応、感謝致します。
明日の修正版楽しみにしております。
不動産の構築をしているのですが、複数、多数のAND検索+OR検索が苦労しておりまして…藤本様のプラグインで解消できるのではないかと期待しております。

ちなみに、カスタムフィールドでドロップダウンやプラグインの「More Custom Fields」
ttp://eatdrinksleepmovabletype.com/plugins/more_custom_fields/index.php
(他の作者様のプラグインで申し訳ないです。)
で作成したものを検索フォーム側でチェックボックスとして複数選択して結果を返す事は可能でしょうか?

プラグインの改良後など、お時間のある時で構いませんのでご教授よろしくお願い致します。

No.7  : (無題)

>SHさん
こんにちは。

不具合を修正した版を公開しました。

http://www.h-fj.com/mt_plugin/SearchEntries_1_03.zip

More Custom Fieldsプラグインの件ですが、保存されるデータの形式を見た限りでは、一部条件はありますが、検索することは可能なはずです。
明日にでも、その方法を記事にしたいと思います。

No.8 SH : (無題)

>藤本様

これは幅が広がりさらに便利になりますね!
明日の記事を楽しみに修正番を早速使わせていただきます!
対応有難うございました!

No.9 マッキー : 浮動小数点での数値に対しての"le"モディファイアの挙動

>藤本様、
素晴らしいプラグイン、いつもありがとうございます。

ひとつ気になる挙動がありましたので、お知らせします。
上記の例で、min以上、max以下の場合「ge="$min" le="$max"」という設定になるかと思いますが、カスタムフィールドを浮動小数点で設定している場合に、leがltのような挙動をみせます。
例えば、「ge="1.2" le="1.2"」とすれば、値が1.2のものは該当しそうですがヒットしません。試しに「ge="1.2" le=1.20001"」などとしてみるとヒットします。
ちなみに整数の場合は、「ge="500" le="500"」とすれば、500のものがヒットするなど、大丈夫そうです。

もし原因や対処方法など分かりましたら、ご教授ください。
よろしくお願いいたします。

No.10  : Re:浮動小数点での数値に対しての"le"モディファイアの挙動

>マッキーさん
こんにちは。

ご質問の件ですが、起こっている動作からすると、おそらくはPerl内部で10進数と2進数との間で変換する際の誤差の影響だと思います。
例えば、0.2は10進数では割り切れる数ですが、2進数にすると割り切れない数になります。それを有限の桁数で表すために、ごくわずかな誤差が生じます。

カスタムフィールドで倍精度浮動小数点数を扱えれば誤差の影響はかなり少なくなりますが、現状のMTではカスタムフィールドには単精度浮動小数点数しか保存できないので、いかんともしがたいところです。

No.11 マッキー : Re:浮動小数点での数値に対しての"le"モディファイアの挙動

藤本さん、
返信ありがとうございます。

倍精度、単精度、、、何やら難しそうな問題があるようですね。詳細は理解が及びそうにないですが、根本にかかわる、簡単に解決できる問題ではないことは理解できました。

かっこ悪いですが、 ($mtSetVar name="max" op="+" value="0.0001"$) みたいな形で、誤差レベルの数字を足すことで対処できそうです。

お忙しいところご丁寧なお返事、ありがとうございましたm(_"_)m

コメントする


Facebookでコメント

試験的にFacebookのコメントフォームを設置しました。