お知らせ

Movable Type 5.1 Webサイト製作ガイドVolume 12011年6月30日

Movable Type 5.1 Webサイト製作ガイドVolume 1」を発売しました。
Movable Type 5.1を基本からしっかりマスターしたい方のための書籍です。
前書「Movable Type 5 Webサイト製作ガイド Volume 1」をMovable Type 5.1対応に改訂しました。 Movable TypeでWeb製作をされている方などにお勧めです。
PDFによる販売で、当サイトでのみ購入できます(書店では購入できません)

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

ブログ記事詳細検索プラグイン(その30・検索結果のページ分割/動的な検索の場合)

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

SearchEntriesプラグインを、リアルタイム再構築プラグイン(RealtimeRebuild)およびページ分割プラグイン(DivPages)を組み合わせると、検索フォームでの動的な検索結果もページ分割することもできます。

1.検索フォームの作り方

検索フォームの作り方は、これまでに解説してきた方法とほぼ同じです。
ただし、フォーム(<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>

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

検索結果をページ分割する場合の検索フォームテンプレートの例

2.検索結果テンプレートの作り方

次に、これまでの動的検索と同様に、検索結果を出力するためにテンプレートモジュールを作成し、その中に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>

3.検索結果の出力

検索結果を出力する方法は、静的に検索してページ分割する場合と同じです。
具体的な手順は、静的なページ分割の場合の「3.検索結果の出力」を参照してください。

4.ページ移動リンクの出力

ページ移動リンクを出力する方法は、静的に検索してページ分割する場合とほぼ同じです。
具体的な手順は、静的なページ分割の場合の「4.ページ移動リンクの出力」を参照してください。

だたし、リンクのアドレスを変数に代入する処理が、以下のように変わります。

<mt:SetVarBlock name="pager_link"$><$mt:DivPagesCGILink tmpl_name="テンプレート名" build_params="1" name="検索フォームの各要素のname属性"$>&amp;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>

なお、手順2.~手順4.を含む検索結果テンプレートの例は、以下のリンクからダウンロードすることができます。

検索結果をページ分割する場合の検索結果テンプレートの例

5.リアルタイム再構築の許可

テンプレートを作り終わったら、検索結果テンプレートのリアルタイム再構築を許可します。
手順は以下の通りです。

  • ブログの「ツール」→「プラグイン」メニューを選びます。
  • プラグイン一覧の中で、「RealtimeRebuild」の「設定」のタブを開きます。
  • 「再構築を許可するテンプレート」の欄で、ここまでで作った検索結果テンプレートのチェックをオンにします。
  • 「変更を保存」ボタンをクリックします。

6.検索結果ページのキャッシュ

静的な検索結果をページ分割する場合と同様に、検索フォームを使った検索結果をページ分割する場合でも、検索結果のページをキャッシュすることができます。
ただし、その手順は静的な検索結果のページ分割とはやや異なります。
手順は後日解説します。

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

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

Facebook連携

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


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

トラックバック(0)

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

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

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

No.1 SH : (無題)

藤本様

いつもお世話になっております。
質問なのですが、動的分割を試したのですが、firefoxだと表示がおかしくなる…と言う事は考えられますでしょうか?

他タブブラウザ等ではきちんと動作するのですがfirefoxのみ件数表示とページ分割が正常に動かないような…

当方のミスでしたら申し訳ありません。お手間を取らせますがご教授願います。

No.2  : (無題)

>SHさん
こんにちは。

ご質問の件ですが、こちらで試した限りは、Webブラウザに関係なく同じ検索結果を得ることができています。
テンプレートの組み方をもう一度ご確認ください。

No.3 SH : (無題)

藤本様

確認してみたところ、解決致しました。テンプレートの問題ではなかった様なのですが、翌日確認した所なぜかきちんと動いていましたwお忙しいところ迅速な回答ありがとうございました。今後ともよろしくお願い致します。

No.4 maru : は存在しません とエラー

SearchEntriesプラグインを大変便利につかわせていただいております

検索のテストを作っており、検索と検索結果は無事に動作し、ページ分割もできているのですが、「ページ移動リンクの出力」をテンプレートに入れると、
テンプレートでエラーが見つかりました。
は存在しません
と言われてしまいます。

検索部分はインデックステンプレート、検索結果部分はテンプレートモジュールで作成しています。

No.5 maru : DivPagesCGILinkは存在しませんとエラー

すいません。タグを入れたら表記されていませんでした。
エラーは「DivPagesCGILinkは存在しません」です。

お忙しいところ申し訳ありませんが、よろしくお願いします。


>SearchEntriesプラグインを大変便利につかわせていただいております

>検索のテストを作っており、検索と検索結果は無事に動作し、ページ分割もできているのですが、「ページ移動リンクの出力」をテンプレートに入れると、
>テンプレートでエラーが見つかりました。
>は存在しません
>と言われてしまいます。

>検索部分はインデックステンプレート、検索結果部分はテンプレートモジュールで作成しています。

No.6  : Re:DivPagesCGILinkは存在しませんとエラー

>maruさん
こんにちは。

DivPagesプラグインのダウンロードのリンクが古いままになっていました。申し訳ありません。
最新版をダウンロードしてお使いください。

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

No.7 maru : ご返事ありがとうございます

了解しました。
早速試してみます。

No.8 maru : DivPagesCGILinkは存在しませんとエラー

DivPages_1_21.zipを使ってみました。
実はMTのバージョンが4.25だったため上手くいきませんでしたが、MTOS活用テクニックを再度見直し、アレンジして使用させていただいた結果、上手くページ分割して表示することができました。

最初からもっと良く本を見て作業するべきでした。
お手間をおかけし、申し訳ありません。

ありがとうございました。

No.9 みや : ページ移動リンクの出力でエラーになります

いつもお世話になっております。

「ページ移動リンクの出力」をテンプレートに入れると以下のエラーが表示されます。

Realtime Rebuild 1.62再構築に失敗しました。 : Can't locate object method "invoke_handler" via package "MT::Template::Context" at /var/www/home/●●/public_html/●●/mt4/plugins/RealtimeRebuild/../../plugins/DivPages/DivPages.pl line 571.

テンプレートは以下のように作成しております。
検索フォーム:テンプレートウィジェット
検索結果:テンプレートモジュール

MTのバージョンは4.2です。

ご教授頂ければ幸いです。

No.10  : Re:ページ移動リンクの出力でエラーになります

>みやさん
こんにちは。

現状のDivPagesプラグイン(バージョン1.21)は、MT4.xには対応していません(MT5.xの新しいプログラム記法を使っているため)。
DivPages.plの184行目/467行目/571行目にある「$ctx->invoke_handler」を「$ctx->tag」に書き換えれば,
MT4.xでも動作すると思います。
ただし、動作保障はできません。

No.11 みや : (無題)

藤本様

早速のご返信ありがとうございます。
教えて頂いたとおり修正しましたところ問題なく動作しました。
ありがとうございました。

コメントする


Facebookでコメント

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