動的な検索の場合
SearchEntriesプラグインを、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)を組み合わせると、検索フォームでの動的な検索結果もページ分割することもできます。
検索フォームの作り方
検索フォームの作り方は、これまでに解説してきた方法とほぼ同じです。
ただし、フォーム(<form・・・>~</form>)の中に、以下のタグを追加する必要があります。
<input type="hidden" name="first_time" value="1" />
例えば、ブログ記事のタイトルで検索するフォームを作る場合だと、以下のようにform要素の部分を作ります。
<form name="srh" method="get" action="<$mt:RealtimeRebuildCGIPath$>">
<p>
<label for="title">キーワード</label><br />
<input type="text" id="title" name="title" />
</p>
<p>
<input type="submit" name="submit" value="送信" />
</p>
<input type="hidden" name="blog_id" value="<$mt:BlogID$>" />
<input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="詳細検索結果"$>" />
<input type="hidden" name="first_time" value="1" />
</form>
検索結果テンプレートの作り方
次に、これまでの動的検索と同様に、検索結果を出力するためにテンプレートモジュールを作成し、その中にSearchConditionsタグのブロック等を入れます。
ページ分割を行う場合、検索結果テンプレートの中で、検索を行う部分は、以下のように書きます。
<$mt:GetQueryParamsToVars$>
<mt:If name="qp_first_time">
<$mt:SetVar name="count_only" value="dp_total_count"$>
<$mt:SetVar name="dp_per_page" value="1ページあたりの出力件数"$>
<$mt:SetVar name="dp_offset" value="0"$>
<mt:Else>
<$mt:SetVar name="set_only" value="1"$>
<mt:DivPagesInit>
</mt:If>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
検索条件を表すテンプレートタグ
<$mt:SearchLimit limit="$dp_per_page"$>
<$mt:SearchOffset offset="$dp_offset"$>
</mt:SearchConditions>
<mt:If name="qp_first_time">
<mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:If>
4行目の「1ページあたりの出力件数」の箇所で、検索結果の1ページに出力するブログ記事の件数を指定します。
また、11行目の「検索条件を表すテンプレートタグ」の部分に、MTSearchCondition系の各種のタグを書いて、検索条件を指定します。
例えば、以下のような場合を考えます。
- 手順1.のフォームのように、ブログ記事のタイトルで検索したいとします。
- タイトルの入力欄のname属性を「title」にしているとします。
- 検索結果は1ページあたり10件ずつ出力したいとします。
この場合、検索を行う部分は以下のように書きます。
<$mt:GetQueryParamsToVars$>
<mt:If name="qp_first_time">
<$mt:SetVar name="count_only" value="dp_total_count"$>
<$mt:SetVar name="dp_per_page" value="10"$>
<$mt:SetVar name="dp_offset" value="0"$>
<mt:Else>
<$mt:SetVar name="set_only" value="1"$>
<mt:DivPagesInit>
</mt:If>
<mt:SearchConditions count_only="$count_only" set_only="$set_only">
<$mt:SearchConditionLike field="title" values="$qp_title"$>
<$mt:SearchLimit limit="$dp_per_page"$>
<$mt:SearchOffset offset="$dp_offset"$>
</mt:SearchConditions>
<mt:If name="qp_first_time">
<mt:DivPagesInit per_page="$dp_per_page" total_count="$dp_total_count">
</mt:If>
検索結果の出力
検索結果を出力する方法は、静的に検索してページ分割する場合と同じです。
具体的な手順は、静的なページ分割の場合の「検索結果の出力」を参照してください。
ページ移動リンクの出力
ページ移動リンクを出力する方法は、静的に検索してページ分割する場合とほぼ同じです。
具体的な手順は、静的なページ分割の場合の「ページ移動リンクの出力」を参照してください。
だたし、リンクのアドレスを変数に代入する処理が、以下のように変わります。
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" build_params="1" name="検索フォームの各要素のname属性"$>&page=</mt:SetVarBlock>
「検索フォームの各要素のname属性」の部分には、検索フォーム内で検索条件の入力に使っている各要素のname属性を、コンマで区切って並べます。
また、「テンプレート名」には、検索結果表示テンプレートの名前を入れます。
例えば、手順1.の検索フォームだと、検索フォーム内には、キーワードを入力する欄があり、そのname属性が「title」になっています。
検索結果を「詳細検索結果」というテンプレートに沿って出力するなら、MTSetVarBlockタグを以下のように書きます。
<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="詳細検索結果" build_params="1" name="title"$>&page=</mt:SetVarBlock>
リアルタイム再構築の許可
テンプレートを作り終わったら、検索結果テンプレートのリアルタイム再構築を許可します。
手順は以下の通りです。
- ブログの「ツール」→「プラグイン」メニューを選びます。
- プラグイン一覧の中で、「RealtimeRebuild」の「設定」のタブを開きます。
- 「再構築を許可するテンプレート」の欄で、ここまでで作った検索結果テンプレートのチェックをオンにします。
- 「変更を保存」ボタンをクリックします。
検索結果ページのキャッシュ
静的な検索結果をページ分割する場合と同様に、検索フォームを使った検索結果をページ分割する場合でも、検索結果のページをキャッシュすることができます。
ただし、その手順は静的な検索結果のページ分割とはやや異なります。