Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む
Movable Type の MTPaginate プラグインによるページ分割を行った際、ナビゲーションの前後ページの表示を絞り込む方法です。
どういうことかと言うと、デフォルトの設定では、分割されたページが下の画面のようにすべて表示されてしまうのですが、本エントリーのカスタマイズを行えば、(多分)直近の前後ページのみの表示に変更できる、というものです。
下は、カスタマイズを行った後のナビゲーションです。上の画面と同じ、5ページに分割されたサンプルで、1ページ目を表示している状態です(とりあえず前後1ページのナビゲーションを表示する設定にしています)。
2ページ目を表示している時のナビゲーションです。3ページ目のナビゲーションが現れました。
3ページ目を表示している時のナビゲーションです。4ページ目のナビゲーションが現れ、1ページの表示が消えます。
4ページ目を表示している時のナビゲーションです。5ページ目のナビゲーションが現れ、2ページの表示が消えました。
5ページ目を表示している時のナビゲーションです。3ページの表示が消えました。
以下、カスタマイズ方法です。
1.MTPaginate プラグインによるページ分割の設定
下記の記事を参考にして、MTPaginate プラグインを Movable Type に設定してください。
注:2項を実施する前に、必ずページ分割が正常に動作することを確認してください。すべてを一気に行うと、正常に動作しなかった場合の切り分けができなくなります。
2.プラグインファイルの修正
MTPaginate/lib/MTPaginate.pm を任意のエディタで開き、赤色部分(v1.28 では 498行~506行)を青色部分に置き換えます。
$format_title = " . sprintf(' title=\"$format_title\"', \$i)" if $format_title;
$res .=<<PHP;
for(\$i = $start; \$i <= $end; \$i++) {
if(\$i > $start)
echo '$separator';
if(\$i == \$paginate_current_page) {
echo sprintf("$format_current", \$i);
} else {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
}
PHP
if ($format_all && $place_all eq 'after') {
下が置き換えた後のリストです。
$format_title = " . sprintf(' title=\"$format_title\"', \$i)" if $format_title;
$res .=<<PHP;
for (\$i = $start; \$i <= $end; \$i++) {
if (\$paginate_current_page == 'all') {
if(\$i > $start)
echo '$separator';
if(\$i == \$paginate_current_page) {
echo sprintf("$format_current", \$i);
} else {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
} else {
if (\$i > $start) {
if (\$i == \$paginate_current_page && \$i != 1) {
echo '$separator';
} else if (\$i < \$paginate_current_page) {
if (\$paginate_current_page - \$i < $offset) {
echo '$separator';
}
} else {
if (\$i - \$paginate_current_page < ($offset+1)) {
echo '$separator';
}
}
}
if (\$i == \$paginate_current_page) {
echo sprintf("$format_current", \$i);
} else {
if(\$i < \$paginate_current_page) {
if(\$paginate_current_page - \$i < ($offset+1)) {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
} else {
if(\$i - \$paginate_current_page < ($offset+1)) {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
}
}
}
}
PHP
if ($format_all && $place_all eq 'after') {
追加した箇所の2行上に、さらに青色の行を1行追加してください。
$format_title = " . sprintf(' title=\"$format_title\"', \$i)" if $format_title;
my $offset = $args->{offset} || 2;
$res .=<<PHP;
for (\$i = $start; \$i <= $end; \$i++) {
if (\$paginate_current_page == 'all') {
if(\$i > $start)
echo '$separator';
if(\$i == \$paginate_current_page) {
echo sprintf("$format_current", \$i);
} else {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
} else {
if (\$i > $start) {
if (\$i == \$paginate_current_page && \$i != 1) {
echo '$separator';
} else if (\$i < \$paginate_current_page) {
if (\$paginate_current_page - \$i < $offset) {
echo '$separator';
}
} else {
if (\$i - \$paginate_current_page < ($offset+1)) {
echo '$separator';
}
}
}
if (\$i == \$paginate_current_page) {
echo sprintf("$format_current", \$i);
} else {
if(\$i < \$paginate_current_page) {
if(\$paginate_current_page - \$i < ($offset+1)) {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
} else {
if(\$i - \$paginate_current_page < ($offset+1)) {
echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title . sprintf('>$format', \$i) . '</a>';
}
}
}
}
}
PHP
if ($format_all && $place_all eq 'after') {
修正が終わったら保存し、元のディレクトリにアップロードして、ファイルを上書きしてください。
うまく動かないようでしたら、元のMTPaginateのプラグインアーカイブから同じファイルを取り出して、再度チャレンジしてください。
3.offset モディファイアの指定
テンプレートに記述している MTPaginateNavigator タグに offset モディファイアを与えれば、前後に表示するページ数を指定できます。
指定しない場合のデフォルト値は2になっているので、前後2ページを表示します。
<MTPaginateNavigator offset="3">
とすれば、表示ページの前後3ページのナビゲーションを表示します。
4.動作確認状況
このカスタマイズで確認している MTPaginateNavigator タグのオプションは、
<$MTPaginateNavigator offset="n" style="links" format_all="All pages" place_all="before" separator=" | ">
<$MTPaginateNavigator offset="n" style="links" format_all="All pages" place_all="after" separator=" | ">
の2種類のみです。これ以外のパターンは未確認ですので、予めご容赦ください。
- Movable Type 7のコンテンツデータ(コンテンツタイプアーカイブ)をページ分割する方法
- Movable Typeでブログ記事やウェブページをページ分割する方法
- Movable Typeの「最近のブログ記事」をページ分割する
- PageButeプラグインでページ分割がないときにナビゲーションや(X)HTMLマークアップを表示しない方法
- Movable Typeのダイナミックパブリッシングでのページ分割ナビゲーションの不具合を解消する
- Movable Type 5のダイナミックパブリッシングでのページ分割について
- Movable Type のページ分割でページ番号を title 要素に表示する
- Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む(改)
- ダイナミックパブリッシングによるページ分割
- コメントのページ分割 for Movable Type 4
- PageBute プラグインによるページ分割
- アーカイブページのページ分割 for Movable Type 4.1
- メインページのページ分割 for Movable Type 4
- ページ分割の Ajax 化
- 検索結果のページ分割(3.3x 版)
≫ 一日ひきこもりday。 from White Wing version2.0
今日は、一日家にひきこもりの一日でした。チビが金曜日から熱をだして、昨日は39.... [続きを読む]
はじめまして。
こちらのプラグインをありがたく使わせていただいております。
一点、お伺いことがしたいことがあり書き込ませていただきました。
現在、ページ分割はうまくいっているのですが、
1ページ目と5ページ目とでページ送りに表示されるページ数が違ってしまうのです。
【1ページ目】 1 | 2 | 3 | 4 | 5 |All pages>
【5ページ目】 < 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |All pages>
という状態です。
<$MTPaginateNavigator offset="4" style="links" format_all="All pages" place_all="after" separator="|">
【理想】 < 3 | 4 | 5 | 6 | 7 |All pages>
offsetには4という数値を入れて、どのページでも5ページ分の表示をしたかったのですが、このようにはできないのでしょうか?
理想としてはアメーバブログのページ送りのような感じで、「次のページ」などもあれば完璧なのですが…。
お手数おかけいたしますがお返事いただければ幸いです。
>てるさん
こんにちは。
ご返事遅くなってすいません。
コメントで頂いた事象は現在の仕様通り(offsetモディファイアは現在の表示ページの前後の表示件数を指定する)です。
ご要望の機能につきましては、動作確認ができ次第、別途エントリー致します。
それではよろしくお願い致します。
yujiroさま
お返事ありがとうございます
別エントリーが建てられるのをお待ちしておりますね。
どうぞよろしくお願いいたします。
>てるさん
こんばんは。
以下のURLで記事を投稿致しましたので動作をご確認ください。
http://www.koikikukan.com/archives/2009/08/24-013333.php
それではよろしくお願い致します。