mt-view.cgiを使ってみる
「Movable Typeのマイナー機能を使ってみる」シリーズ第一弾。
(今まで気がつかないのもどうかしているが)Movable Type 2.6以降にバンドルされているmt-view.cgiは、(Rebuildしたタイミング静的にページを生成するのではなく)動的ページ生成を可能にする。これは、mt-search.cgiが動的に検索結果のページを生成したり、mt-comments.cgiが動的にコメントリストのページを生成するのに似ている。mt-view.cgiは今のところofficialにはサポートされておらず、使用方法も公開されていない(現況から変更される可能性がある)。しかしながら、この機能は、たまにしか必要にならないページをいちいちサーバ上に静的にページを生成したくない場合には(とりわけその個数が膨大であればあるほど)極めて役に立つ。
前準備
既定ではmt-view.cgiは利用不可能になっているはずである。まずはmt.cfgでSafeModeというConfiguration Parameterを0にセットする必要がある。この変更により、mt-view.cgiは利用可能になるが、他のmt{,-comments,-search,-send-entry,...}.cgiがCharsetを適切に設定してくれるのに対して、mt-view.cgiはそれをなぜか行わない。したがってMT2.6xのdistributionをas-isで使用している限りはブラウザ側では文字化けが起きるはずである。より本質的には、インストールされているPerlのCGIモジュールが規定するCharset(たいていはiso-8859-1)がクライアントサイドに返されるために生じる(言うまでもなく)。
この不具合を修正するには、lib/MT/App/Viewer.pmに以下のようなパッチを当てておく。
*** lib/MT/App/Viewer.pm~ Sun Feb 23 16:25:46 2003
--- lib/MT/App/Viewer.pm Mon Dec 8 02:23:38 2003
***************
*** 20,25 ****
--- 20,26 ----
$app->SUPER::init(@_) or return;
$app->add_methods(main => \&view);
$app->{default_mode} = 'main';
+ $app->{charset} = $app->{cfg}->PublishCharset;
$app;
}
また、<$MTViewScript$>という変数テンプレートが標準では使えないので、lib/MT/Template/Context.pmに以下のパッチもあてておくとよい。
*** lib/MT/Template/Context.pm~ Wed May 28 16:48:24 2003
--- lib/MT/Template/Context.pm Mon Dec 8 14:37:48 2003
***************
*** 78,83 ****
--- 78,84 ----
$ctx->register_handler(TrackbackScript => \&_hdlr_trackback_script);
$ctx->register_handler(SearchScript => \&_hdlr_search_script);
$ctx->register_handler(XMLRPCScript => \&_hdlr_xmlrpc_script);
+ $ctx->register_handler(ViewScript => \&_hdlr_view_script);
$ctx->register_handler(Date => \&_hdlr_sys_date);
$ctx->register_handler(Version => \&_hdlr_mt_version);
$ctx->register_handler(PublishCharset => \&_hdlr_publish_charset);
***************
*** 409,414 ****
--- 410,416 ----
sub _hdlr_trackback_script { MT::ConfigMgr->instance->TrackbackScript }
sub _hdlr_search_script { MT::ConfigMgr->instance->SearchScript }
sub _hdlr_xmlrpc_script { MT::ConfigMgr->instance->XMLRPCScript }
+ sub _hdlr_view_script { MT::ConfigMgr->instance->ViewScript }
sub _hdlr_blogs {
my($ctx, $args, $cond) = @_;
使用法
以下ではmt-view.cgiを使って、動的ページ生成を行う方法を述べる。
- Main Indexを生成する
http://www.mysite.tld/mt/mt-view.cgi/BlogId - Daily Archiveを生成する (YYYY年MM月DD日)
http://www.mysite.tld/mt/mt-view.cgi/BlogId/archives/YYYY/MM/DD/ - Monthly Archiveを生成する (YYYY年MM月)
http://www.mysite.tld/mt/mt-view.cgi/BlogId/archives/YYYY/MM/ - Weekly Archiveを生成する (YYYY年MM月第NN週)
http://www.mysite.tld/mt/mt-view.cgi/BlogId/archives/week/YYYY/MM/NN/ - Entryを生成する
http://www.mysite.tld/mt/mt-view.cgi/BlogId/entry/EntryId/ - Category Archiveを生成する
http://www.mysite.tld/mt/mt-view.cgi/BlogId/section/CategoryId/
活用法
Calendarでの利用はすぐに思いつく。Daily Archiveを静的に生成しておいてもよいのだが、Daily Archiveはそもそも滅多に使わないので無駄が多い。
<MTCalendar> <MTCalendarWeekHeader><tr></MTCalendarWeekHeader> <td> <MTCalendarIfEntries> <a href="<$MTCGIPath$><$MTViewScript$>/<$MTBlogID$>/archives/<$MTCalendarDate format="%Y/%m/%d"$>"> <$MTCalendarDay$> </a> </MTCalendarIfEntries> <MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries> <MTCalendarIfBlank> </MTCalendarIfBlank> </td> <MTCalendarWeekFooter></tr></MTCalendarWeekFooter> </MTCalendar>
PermaLinkをhttp://www.mysite.tld/mt/mt-view.cgi/BlogId/entry/EntryId/のように指定できれば、一切静的にページを生成することなく、mt-view.cgiだけで賄うことができるはずである。現状ではそうするためにかなりの修正が必要になりそうなので省略する。
Comments and Trackbacks