TopMovable Typeカスタマイズページ分割 > Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む
News
各種ブログテンプレート
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 ReTweet This!
関連記事
この記事を読んだ人はこんな記事も読んでいます
人気エントリー
Hatena Hot Entries
Hatena Entries
トラックバック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 : 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 : August 24, 2009 1:48 AM
コメントする
greeting

*必須



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

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

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

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

Now loading...
Introduction
Entry Trackbacks
一日ひきこもりday。
 [White Wing version2.0] 05/25 20:43
Entries of this Category
Recent Entries
Recent Comments
Recent Trackbacks
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 ...
Categories
Monthly Archives
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
クリエイティブ・コモンズ・ライセンス
Powered by
Movable Type 5.02