MT4.2のダイナミックパブリッシングでのページ分割

MT3のときにプラグインか何かでページ分割してたんですが、MT4に移行したときにプラグインやテンプレートを全初期化したのでページ分割もなくなりました。

で、世の中のブログを見てるとMT4でページ分割してる人がいるのでググってみたところ、Movable Type Hackathonでお会いしたjunnamaさんが、下記のような記事を書いておられました。

MT4.2のダイナミックパブリッシングでのページ分割互換、静的ページ分割プラグイン。

http://junnama.alfasado.net/online/2008/06/mt42.html

これによると、MT本家のドキュメントの下記を参照すれば良いと言うことだ。

ダイナミックパブリッシングでのページ分割
http://www.movabletype.jp/documentation/designer/pagination.html
(すでにphpダイナミックパブリッシングの設定が終わってる前提の手順っす)

これに従い、まず。.htaccessを修正。

RewriteRule ^(.*)$ /mtview.php [L,QSA]

RewriteRule ^(.*)(\?.*)?$ /mtview.php$2 [L,QSA]
に変更する

で、メインページのテンプレートのMTEntriesのところを下記の用にして、offsetをautoに、limit(1ページあたりに表示する記事数)を10にする。

<MTEntries offset="auto" limit="10">
<$MTEntryTrackbackData$>
<$MTInclude module="ブログ記事の概要"$>
</MTEntries>

で、Pagerを表示したいところに下記を入れる。

<div class="content-nav">
<MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">
&laquo; Previous</a>&nbsp;&nbsp;</MTIfPreviousResults>
<MTPagerBlock>
<MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage>
<mt:unless name="__last__">&nbsp;</mt:unless>
</MTPagerBlock>
<MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">
Next &raquo;</a>
</MTIfMoreResults>
</div>

すると。

はい、やりすぎー。

ちょっっとテンプレートを直してみる。

<$MTCurrentPage setvar="curpage"$>
<$MTTotalPages setvar="totalpage"$>
<MTIf name="totalpage" gt="1">
<div class="content-nav">
<MTSetVarBlock name="beginpage"><MTGetVar name="curpage" value="4" op="-"></MTSetVarBlock>
<MTIf name="beginpage" lt="1"><MTSetVar name="beginpage" value="1"></MTIf>
<MTSetVarBlock name="endpage"><MTGetVar name="beginpage" value="14" op="+"></MTSetVarBlock>
<MTIf name="endpage" gt="totalpage"><MTSetVar name="endpage" value="$totalpage"></MTIf>
<MTIfPreviousResults><a href="<MTPreviousLink>" rel="prev">&laquo; Previous</a>&nbsp;&nbsp;</MTIfPreviousResults>
<MTPagerBlock>
<MTIf name="__counter__" le="$endpage"><MTIf name="__counter__" ge="$beginpage">
<MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage>
<MTIf name="__counter__" ne="$endpage">&nbsp;</MTIf>
</MTIf></MTIf>
</MTPagerBlock>
<MTIfMoreResults>&nbsp;&nbsp;<a href="<MTNextLink>" rel="next">Next &raquo;</a></MTIfMoreResults>
</div>
</MTIf>

これでいいかな?
と思ったら、MTTotalPages の値がとれない。MTTotalPages のチェックを省く。

うむ。良い感じだ。

でもMTTotalPages のチェックを省いてるのでページが1ページしかないときに、以下のようになってしまう。

これはダサイ。

あと何故かわらかないが、全部で2ページのときの1ページ目を表示しているときにMTIfMoreResultsがでない。

なめやがってー。

ここまで来たら後にひけないので直しました。

php/lib/function.mttotalpages.php

// 修正前
function smarty_function_mttotalpages($args, &$ctx) {
$limit = $ctx->stash('__pager_limit');
if (!$limit) return 1;
$offset = $ctx->stash('__pager_offset');
ceil( $count / $limit );
}

残念。PHPはPerlと違って最後の行の出力はreturnされません。というか、そもそも$countが未定義だよー。で、下記が修正後。

// 修正後
function smarty_function_mttotalpages($args, &$ctx) {
$limit = $ctx->stash('__pager_limit');
if (!$limit) return 1;
$count = $ctx->stash('__pager_total_count');
return ceil( $count / $limit );
}

php/lib/block.mtifmoreresults.php

// 修正前
function smarty_block_mtifmoreresults($args, $content, &$ctx, &$repeat) {
if (!isset($content)) {
$limit = $ctx->stash('__pager_limit');
$count = $ctx->stash('__pager_total_count');
$offset = $ctx->stash('__pager_offset');
if ( $limit && !$offset ) $offset += $limit;
return $ctx->_hdlr_if($args, $content, $ctx, $repeat, ( $limit + $offset ) < $count);
} else {
return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
}
}
?>

な、何故 $limit を2回足す?とりあえず押せ押せでintにcastしよう。

// 修正後
function smarty_block_mtifmoreresults($args, $content, &$ctx, &$repeat) {
if (!isset($content)) {
$limit = (int)$ctx->stash('__pager_limit');
$count = (int)$ctx->stash('__pager_total_count');
$offset = (int)$ctx->stash('__pager_offset');
return $ctx->_hdlr_if($args, $content, $ctx, $repeat, ( $limit + $offset ) < $count);
} else {
return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
}
}

これで思い通りに動いたさ。どうせならMTOSのtrunkなおしたいんだけど。。。

ここまで来てさらに気がついたが、
設定 > 公開設定 > ダイナミックパブリッシング設定 > キャッシュする
にチェックが入っているとパラメータが変わっても同じキャッシュが使い回されるので、
Pagerが機能しない。。。眠くなってきたのでとりあえずキャッシュはOFFにして、このあたりの修正はまた今度。