TopMovable Typeカスタマイズページ分割 > Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む
2008年4月22日

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

Posted at April 22,2008 1:11 AM
Category:[ページ分割]
Tag:[, , ]

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

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


コメントする

*必須



お知らせ:2008年5月現在、多忙のため、7月頃までコメントを速やかに回答できない状態が続きます。ご質問の内容によっては回答が7月以降になる可能性がありますので、予めご了承ください。

太字 イタリック アンダーライン ハイパーリンク 引用

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

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

Now loading...
Entries of this Category
QRcode

現在停止中です
携帯電話からこのQRcodeを撮影することで携帯用URLを取得することができます

URI for cellular phones
ギターに入った猫
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

loading ...
BlogPeople
Now loading...
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 4.1
 
List Me!