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"> « Previous</a> </MTIfPreviousResults> <MTPagerBlock> <MTIfCurrentPage><MTVar name="__value__"><MTElse><a href="<MTPagerLink>"><MTVar name="__value__"></a></MTIfCurrentPage> <mt:unless name="__last__"> </mt:unless> </MTPagerBlock> <MTIfMoreResults> <a href="<MTNextLink>" rel="next"> Next »</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">« Previous</a> </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"> </MTIf> </MTIf></MTIf> </MTPagerBlock> <MTIfMoreResults> <a href="<MTNextLink>" rel="next">Next »</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にして、このあたりの修正はまた今度。