Movable Type 5β4でのページ送りの不具合と修正

Movable Type 4.3(現状では日本語版なし)で、メインページやカテゴリアーカイブページ/月別アーカイブページ等に、ページ送りの機能を付けることができるようになりました。
1ページ目は静的に再構築し、2ページ目以降はアクセスがあった時点で動的に再構築する方法です。
また、ページ送りは検索(mt-search.cgi)の機能を流用して作られています。

Pagination for Static Templates(MOVABLE TYPE.ORGの記事)

このページの解説に沿って、Movable Type 5.0β4で、メインページおよびアーカイブページのページ送りを試してみました。
しかし、一部不具合があり、完全には動作しませんでした。
その修正法を紹介します。
シックス・アパートにもフィードバックしておきました。

10月26日 15時40分
FogBugzのリストにこの不具合が掲載されました。
FB: Pagination of Main Index
FB: Pagination doesn't work on original archive template

1.メインページでの問題とその修正

メインページのテンプレートをページ送りできるように書き換えて再構築し、実際にページ送りを行うと、以下のエラーがWebブラウザに表示されます。

Can't call method "template_params" on an undefined value

検索処理の本体(MT_DIR/lib/MT/App/Search.pm)のソースを見てみると、682~683行目が問題の原因であることが分かりました。
以下のように書き換えると、エラーが出なくなりました。

・書き換え前

my $params = $archiver->template_params;
map { $ctx->var( $_, $params->{ $_ } ) } keys %$params;
・書き換え後
if ($archiver) {
    my $params = $archiver->template_params;
    map { $ctx->var( $_, $params->{ $_ } ) } keys %$params;
}

書き換え前のプログラムだと、インデックステンプレートでは$archiverは存在しないので、template_paramsメソッドを実行できず、エラーが起こります。
そこで、$archiverが存在するときだけ、処理を行うように変えています。

2.アーカイブテンプレートでの問題

既存のアーカイブテンプレートを書き換えた場合は動作しましたが、新たにアーカイブテンプレートを作ってページ送りの機能を入れると、ページ移動のリンクをクリックした際に、Webブラウザに以下のエラーメッセージが表示されました。

テンプレートはインデックスでないアーカイブタイプ用の記事リストidを持たなければなりません

MT_DIR/lib/MT/App/Search.pmを見ると、758~759行目に以下の記述があります。
これによると、テンプレートのidentifierプロパティの最後が「entry_listing」で終わっていることが必要です。
しかし、新たに作ったアーカイブテンプレートでは、identifierプロパティに値がありません。
これが問題の原因です。

return $app->errtrans( 'Template must have identifier entry_listing for non-Index archive types' )
    unless ($app->config->SearchAlwaysAllowTemplateID || $tmpl->identifier =~ /entry_listing$/ );

phpMyAdminでテンプレート(mt_templateテーブル)を操作し、新規作成したアーカイブテンプレートのidentifierプロパティ(template_identifier列)に「category_entry_listing」の値を指定すると、ページ送りが動作するようになりました。

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください