期間で検索
検索フォームで、日付の期間を指定して検索したい場合もあります。
今回は、「○○年□□月~●●年■■月の記事」のように、日付を2つ入力して、その期間に該当するブログ記事検索する方法を解説します。
以下のような事例を基に解説します。
- 「○○○○年□□月~●●●●年■■月に公開された」という条件でブログ記事を検索します。
- 検索結果表示用のテンプレートモジュールには、「詳細検索結果」という名前を付けるものとします。
- 年および月をselectで選べるようにします。
検索フォームの作り方
まず、検索フォームを作ります。
日付を1つだけ入力する場合と同様に、年や月などを入力する要素では、name属性の先頭部分を共通にし、その後に「_year」等の接尾語を付けます。
また、期間の最初と最初のそれぞれで、name属性の先頭部分を別にします。
今取り上げている例だと、期間の最初/最後を入力する要素で、name属性の先頭部分を、それぞれedate1/edate2にすることにします。
実際に検索フォームを作ると、以下のようになります。
<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>
<select name="edate1_year">
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
</select>
<label for="edate1_year">年</label>
<select name="edate1_month">
<mt:For var="m" from="1" to="12">
<option value="<$mt:GetVar name="m"$>"><$mt:GetVar name="m"$></option>
</mt:For>
</select>
<label for="edate1_year">月</label>
~
<select name="edate2_year">
<option value="2008">2008</option>
<option value="2009">2009</option>
<option value="2010">2010</option>
</select>
<label for="edate2_year">年</label>
<select name="edate2_month">
<mt:For var="m" from="1" to="12">
<option value="<$mt:GetVar name="m"$>"><$mt:GetVar name="m"$></option>
</mt:For>
</select>
<label for="edate2_year">月</label>
</p>
<p>
<input type="submit" value="送信" />
</p>
</form>
検索結果テンプレートの作り方
次に、検索結果テンプレートを作ります。
フォームで入力された日付は、日付を1つだけ入力する場合と同様に、MTGetParamToDateタグを使って、14桁の数値に変換します。
入力された年/月等から、その最初の日の0時0分0秒を表す14桁の数値を得るには、以下のように書きます。
<$mt:GetParamToDate field="フィールド名" start="日時"$>
fieldモディファイアには、検索フォームの日付入力欄のname属性の値のうち、「_year」等を除いた共通部分を指定します。
また、startモディファイアの「日時」には、以下の値を指定します。
変換先の日時 | 指定する値 |
年 | year |
月 | month |
日 | day |
時 | hour |
分 | minute |
分 | second |
変換後の日付は、名前が「qp_フィールド名」の変数に代入されます。
同様に、入力された年/月等から、その最後の日の23時59分59秒を表す14桁の数値を得るには、以下のように書きます。
<$mt:GetParamToDate field="フィールド名" end="日時"$>
「検索フォームの作り方」で作った検索フォームを元に検索する場合、「edate1」で入力された年/月が期間の最初で、「edate2」で入力された年/月が期間の最後です。
したがって、「<$mt:GetParamToDate field="edate1" start="month"$>」と「<$mt:GetParamToDate field="edate2" end="month"$>」のタグで、期間の最初/最後の日付を14桁の数値に変換します。
また、変換後の数値は、変数qp_edate1/qp_edate2に代入されます。
例えば、期間の最初/最後の入力欄で、2010年1月と2010年5月が選択された場合、変数qp_edate1/qp_edate2の値は、それぞれ以下のようになります。
変数 | 値 |
qp_edate1 | 20100101000000 |
qp_edate2 | 20100531235959 |
ここまでの話にそって、検索結果を出力する部分を作ると、以下のようになります。
<$mt:GetQueryParamsToVars$>
<$mt:GetParamToDate field="edate1" start="month"$>
<$mt:GetParamToDate field="edate2" end="month"$>
<mt:SearchConditions>
<$mt:SearchConditionCompare field="authored_on" ge="$qp_edate1" le="$qp_edate2"$>
</mt:SearchConditions>
<mt:IfNonZero tag="SearchLoadedEntryCount">
<p><$mt:SearchLoadedEntryCount$>件</p>
<mt:Entries>
<$mt:Include module="ブログ記事の概要"$>
</mt:Entries>
<mt:Else>
<p>条件に合う記事がありませんでした。</p>
</mt:IfNonZero>