Home> Internet >  MovableType >  DynamicMTMLを利用したページ分割処理

DynamicMTMLを利用したページ分割処理

アーカイブのページ分割には今まで、ダイナミックパブリッシングを利用したページ分割や、検索CGIを使ったページ分割、それにPagerPageButeなどのプラグインを利用したページ分割などがありました。あ、あと実は未だに使っているMTPaginateなんてのもありましたね。

しかしこれらは、それぞれに長所と共に短所があり、必ずしもどれがベストな選択とは言えないところがありました。
ダイナミックパブリッシングはPHPによる動的生成、検索CGIはPerlによる動的生成であり、それぞれ表示するたびにそれなりの負荷がかかります。
それに対して、プラグインによるアーカイブ生成は、表示はスタティックファイルなので高速ですが、再構築時にページ数に応じて負荷が高くなり、継続的にコンテンツを投入されるサイトでの、カテゴリーアーカイブを分割するような場合には、TimeOutエラーなどで処理できなくなる確率が高くなります。

DynamicMTMLを利用することで、再構築時の負荷もが低いまま、表示時の負荷もそれほど高くならない、ページ分割処理が可能になります。(最近はほとんどこの方法でページ分割をこなしてる気がする)

アーカイブを作成

例として、カテゴリーアーカイブとアイテム一覧をアーカイブとして出力するようにしてみます。

カテゴリーアーカイブのページ分割

DynamicMTMLでのアーカイブは、スタティックなHTMLファイルとして出力されます。そのHTML内に書かれたMTMLを動的に処理することで、内容を出し分けます。

以下カテゴリーアーカイブのページング処理部分の内容です。ヘッダやフッタ、その他装飾のスタティックな部分は省略してます。MTEntriesループ内で表示されるものは、「ブログ記事概要」テンプレートモジュールの内容になります。
URLの後ろに「?p=2」などとすることで2ページ以降が表示されます。MTQueryというDynamicMTMLのタグでkey指定して受け取っているので、そこを変更すれば「?page=2」等に変更もできます。

クエリで受け取ったページからもろもろの変数設定する部分
<<MTRawMTML>MTSetVar</MTRawMTML> name="blog_id" value="<$MTBlogID$>"> <<MTRawMTML>MTSetVar</MTRawMTML> name="total_entry" value="<$MTCategoryCount$>"> <MTDynamicMTML> <MTSetVar name="limit" value="20"> <MTQuery key="p" setvar="current_page"> <MTUnless name="current_page"><MTSetVar name="current_page" value="1"></MTUnless> <MTVar name="current_page" op="*" value="$limit" setvar="last_entry"> <MTVar name="last_entry" op="-" value="$limit" setvar="first_entry"> <MTVar name="total_entry" op="/" value="$limit" regex_replace="/\.\d+\$/","" setvar="total_pages"> <MTIf name="total_entry" op="mod" value="$limit"><MTSetVar name="total_pages" op="++"></MTIf> </MTDynamicMTML>
ココがMTEntriesループ部分
<<MTRawMTML>MTEntries</MTRawMTML> include_blogs="$blog_id" categories="<$MTCategoryLabel$>" limit="$limit" offset="$first_entry"> <MTRawMTML><$MTInclude module="ブログ記事概要" blog_id="$blog_id"$></MTRawMTML> <MTML tag="/MTEntries">
ココからPager用コード
<MTDynamicMTML> <MTIf name="total_pages" gt="1"> <MTUnless name="current_page" eq="1"><a href="<$MTCurrentArchiveURL$>?p=<$MTVar name="current_page" op="--"$>">前へ</a></MTUnless> <MTFor var="x" from="1" to="$total_pages"> <MTIf name="x" eq="1"> <MTIf name="current_page" eq="1"> <span class="current">1</span> <MTElse> <a href="<$MTCurrentArchiveURL$>"><$MTVar name="x"$></a> </MTIf> <MTElse> <MTIf name="current_page" eq="$x"> <span class="current"><$MTVar name="x"$></span> <MTElse> <a href="<$MTCurrentArchiveURL$>?p=<$MTVar name="x"$>"><$MTVar name="x"$></a> </MTIf> </MTIf> </MTFor> <MTUnless name="current_page" eq="$total_pages"><a href="<$MTCurrentArchiveURL$>?p=<$MTVar name="current_page" op="++"$>">次へ</a></MTUnless> </MTIf> </MTDynamicMTML>

first_entryはMTEntriesに渡すオフセット値になっていて、この値に1を足すとそのページに表示される最初の記事が、記事全体での何番目かという数字になります。last_entryはそのページに表示される最後の記事が、全体で何番目の記事かという数字になりますが、厳密には最終ページなどで分割数に満たない時はこの数字より小さくなります。
よくある「21ページ中7ページ(121~140)」の様な表示は以下のコードで表示できます。

<MTDynamicMTML>
<$MTVar name="total_pages"$>ページ中<$MTVar name="current_page"$>ページ(<$MTVar name="first_entry" op="++"$>~<MTIf name="current_page" eq="$total_pages"><$MTVar name="total_entry"$><MTElse><$MTVar name="last_entry"$></MTIf>)
</MTDynamicMTML>

アイテム一覧ページ

さてアイテムの場合はと言うと、基本的にはブログ記事と一緒で、こんな感じになります。assets_per_rowモディファイアなどと組み合わせると、それっぽいアーカイブページが作成できるものと思います。

クエリで受け取ったページからもろもろの変数設定する部分
<<MTRawMTML>MTSetVar</MTRawMTML> name="blog_id" value="<$MTBlogID$>"> <<MTRawMTML>MTSetVar</MTRawMTML> name="total_asset" value="<$MTAssetCount$>"> <MTDynamicMTML> <MTSetVar name="limit" value="20"> <MTQuery key="p" setvar="current_page"> <MTUnless name="current_page"><MTSetVar name="current_page" value="1"></MTUnless> <MTVar name="current_page" op="*" value="$limit" setvar="last_asset"> <MTVar name="last_asset" op="-" value="$limit" setvar="first_asset"> <MTVar name="total_asset" op="/" value="$limit" regex_replace="/\.\d+\$/","" setvar="total_pages"> <MTIf name="total_asset" op="mod" value="$limit"><MTSetVar name="total_pages" op="++"></MTIf> </MTDynamicMTML>
ココがMTAssetsループ部分
<<MTRawMTML>MTAssets</MTRawMTML> include_blogs="$blog_id" sort_by="created_on" lastn="$limit" offset="$first_asset"> <MTRawMTML><$MTAssetThumnbnailLink width="200"$></MTRawMTML> <MTML tag="/MTAssets">
ココからPager用コード
<MTDynamicMTML> <MTIf name="total_pages" gt="1"> <MTUnless name="current_page" eq="1"><a href="<$MTCurrentArchiveURL$>?p=<$MTVar name="current_page" op="--"$>">前へ</a></MTUnless> <MTFor var="x" from="1" to="$total_pages"> <MTIf name="x" eq="1"> <MTIf name="current_page" eq="1"> <span class="current">1</span> <MTElse> <a href="<$MTCurrentArchiveURL$>"><$MTVar name="x"$></a> </MTIf> <MTElse> <MTIf name="current_page" eq="$x"> <span class="current"><$MTVar name="x"$></span> <MTElse> <a href="<$MTCurrentArchiveURL$>?p=<$MTVar name="x"$>"><$MTVar name="x"$></a> </MTIf> </MTIf> </MTFor> <MTUnless name="current_page" eq="$total_pages"><a href="<$MTCurrentArchiveURL$>?p=<$MTVar name="current_page" op="++"$>">次へ</a></MTUnless> </MTIf> </MTDynamicMTML>

他にも使い方が沢山

ダイナミックパブリッシングで動作するループタグで、limit指定やoffset指定が使えるものなら、応用可能です。
例えば、SearchEntriesを使うことで、簡単に複雑なクエリを処理する(DynamicMTMLのSearchEntriesタグは、フィールドの部分一致で指定が可能です)検索ページを作成できます。

この方法での負荷の発生は、主に表示時にダイナミックパブリッシング部分を動的に生成する部分になるはずです。
パラメータ部分に複雑ななクエリが必要な場合は、パラメータ生成までを静的に済ませられないかを検討したり、ブロック表示部の処理が複雑な場合は、別ファイルとして処理させておく等の手段が有効です。
単純なブロック表示の場合なら、さほど負荷は発生しませんので、そのページがダイナミックパブリッシングで処理されていると気づかないこともあります。

Comment:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.zelazny.mydns.jp/cgi-bin/MT/mt-tb.cgi/2275

Home> Internet >  MovableType >  DynamicMTMLを利用したページ分割処理

CC Licence

Creative Commons License

このブログはクリエイティブ・コモンズでライセンスされています。

Feeds

Return to page top