Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む

Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む

Posted at April 22,2008 1:11 AM
Tag:[Customize, MovableType, Paginate]

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種類のみです。これ以外のパターンは未確認ですので、予めご容赦ください。

関連記事
zenback
人気エントリー
トラックバックURL


トラックバック

一日ひきこもりday。 from White Wing version2.0
今日は、一日家にひきこもりの一日でした。チビが金曜日から熱をだして、昨日は39.... [続きを読む]

Tracked on May 25, 2008 8:43 PM
コメント

はじめまして。
こちらのプラグインをありがたく使わせていただいております。
一点、お伺いことがしたいことがあり書き込ませていただきました。

現在、ページ分割はうまくいっているのですが、
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ページ分の表示をしたかったのですが、このようにはできないのでしょうか?
理想としてはアメーバブログのページ送りのような感じで、「次のページ」などもあれば完璧なのですが…。

お手数おかけいたしますがお返事いただければ幸いです。

[1] Posted by てる : August 12, 2009 12:04 PM

>てるさん
こんにちは。
ご返事遅くなってすいません。
コメントで頂いた事象は現在の仕様通り(offsetモディファイアは現在の表示ページの前後の表示件数を指定する)です。
ご要望の機能につきましては、動作確認ができ次第、別途エントリー致します。
それではよろしくお願い致します。

[2] Posted by yujiro logo : August 20, 2009 4:19 PM

yujiroさま

お返事ありがとうございます
別エントリーが建てられるのをお待ちしておりますね。
どうぞよろしくお願いいたします。

[3] Posted by てる : August 23, 2009 1:49 AM

>てるさん
こんばんは。
以下のURLで記事を投稿致しましたので動作をご確認ください。

http://www.koikikukan.com/archives/2009/08/24-013333.php

それではよろしくお願い致します。

[4] Posted by yujiro logo : August 24, 2009 1:48 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)