TopMovable Typeカスタマイズページ分割 > 2009年8月
2009年8月24日

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

August 24,2009 1:33 AM
Tag:[, , ]
Permalink

以前公開した「Movable Type のページ分割によるナビゲーションの前後ページ表示を絞り込む」で、表示するページ数を常に一定にできるよう、機能を追加しました。

1.比較

以下、offset モディファイアに「2」を設定した場合の、機能追加前と機能追加後の表示です。offset モディファイアとは、現在表示中のページから前後に表示するページ数を指定するためのものでます。「2」を設定すれば、現在のページと前後ページ含め最大5ページ分が表示されますが、機能追加前では、末端のページのオフセットは切り捨てられます。

機能追加前

1ページ目
機能追加前の1ページ目

2ページ目
機能追加前の2ページ目

5ページ目
機能追加前の5ページ目

9ページ目
機能追加前の9ページ目

10ページ目
機能追加前の10ページ目

機能追加後

機能追加後は、切り捨てられた分のオフセットを反対側のオフセットに加えることで、常に同じページ数を表示することができます。

1ページ目
機能追加後の1ページ目

2ページ目
機能追加後の1ページ目

5ページ目
機能追加後の1ページ目

9ページ目
機能追加後の1ページ目

10ページ目
機能追加後の1ページ目

以下、カスタマイズ方法です。機能追加後の表示を行いたい場合は必ず4項の設定を行なってください。

2.MTPaginate プラグインによるページ分割の設定

下記の記事を参考にして、MTPaginate プラグインを Movable Type に設定してください。

注:2項を実施する前に、必ずページ分割が正常に動作することを確認してください。すべてを一気に行うと、正常に動作しなかった場合の切り分けができなくなります。

3.プラグインファイルの修正

MTPaginate/lib/MTPaginate.pm を任意のエディタで開き、赤色部分(v1.28 では 497行~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;
                        my $offset = $args->{offset} || 2;
                        my $fixed_offset = $args->{fixed_offset} || 0;
                        $res .=<<PHP;
if ($fixed_offset) {
  if (($end - \$paginate_current_page) <= $offset) {
    \$before_offset = $offset + ($offset - ($end - \$paginate_current_page));
    \$after_offset = $offset;
  } else if ((\$paginate_current_page - $start) <= $offset) {
    \$before_offset = $offset;
    \$after_offset = $offset + ($offset - (\$paginate_current_page - $start));
  } else {
    \$before_offset = $offset;
    \$after_offset = $offset;
  }
} else {
  \$before_offset = $offset;
  \$after_offset = $offset;
}
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 < \$before_offset) {
          echo '$separator';
        }
      } else {
        if (\$i - \$paginate_current_page < (\$after_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 < (\$before_offset+1)) {
          echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
        }
      } else {
        if(\$i - \$paginate_current_page < (\$after_offset+1)) {
          echo "<a href=\\\"\$paginate_self=\$i$anchor\\\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
        }
      }
    }
  }
}
PHP
                        if ($format_all && $place_all eq 'after') {

4.offset モディファイアの指定

テンプレートに記述している MTPaginateNavigator タグに offset モディファイアを与えれば、前後に表示するページ数を指定できます。
指定しない場合のデフォルト値は2になっているので、前後2ページを表示します。

<MTPaginateNavigator offset="3">

とすれば、表示ページの前後3ページのナビゲーションを表示します。

5.fixed_offset モディファイアの指定

テンプレートに記述している MTPaginateNavigator タグに fixed_offset="1" を与えれば、末端のページでも、offset モディファイアで設定した値になるように表示します。指定しない場合のデフォルト値は 0 です。

<MTPaginateNavigator offset="2" fixed_offset="1">

とすれば、表示中のページにかかわらず、常に5ページのナビゲーションを表示します(ページ分割数が5ページ以下の場合を除く)。

Comments [2] | Trackbacks [1]
2009年8月 6日

ダイナミックパブリッシングによるページ分割

Movable Type 4.2 ではダイナミックパブリッシングによるページ分割が行なえます。

カテゴリーアーカイブのページナビゲーション
カテゴリーアーカイブ

月別アーカイブのページナビゲーション
月別アーカイブ

メインページのページナビゲーション
メインページ

本エントリーでは、以下の解説を元に「既定のブログ」へのページ分割設定方法を紹介します。

1..htaccess の変更(4.2 以前からダイナミックパブリッシングを導入している場合)

参考とした元記事では 以下のように .htaccess の変更を行なっていますが、4.2 からダイナミックパブリッシングの運用を開始している場合は設定不要です。

変更前

RewriteRule ^(.*)$ $mtview_server_url [L,QSA]

変更後

RewriteRule ^(.*)(\?.*)?$ $mtview_server_url$2 [L,QSA]

2.「ブログ記事リスト」アーカイブテンプレートにページナビゲーションの追加

ブログ記事管理画面の「デザイン」→「テンプレート」→「カテゴリ別ブログ記事リスト(または月別ブログ記事リスト)」をクリックし、以下のサブテンプレート(青色部分)を追加します。

...前略...
    <div class="content-nav">
        <mt:ArchivePrevious><a href="<$mt:ArchiveLink$>">&laquo; <$mt:ArchiveTitle$></a> |</mt:ArchivePrevious>
        <a href="<$mt:Link template="main_index"$>">メインページ</a> |
        <a href="<$mt:Link template="archive_index"$>">アーカイブ</a>
        <mt:ArchiveNext>| <a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$> &raquo;</a></mt:ArchiveNext>
    </div>
 
    <div class="content-nav">
        <mt:IfPreviousResults><a href="<mt:PreviousLink encode_html="1">" rel="prev">&laquo; Previous</a>&nbsp;&nbsp;</mt:IfPreviousResults>
        <mt:PagerBlock>
            <mt:IfCurrentPage><mt:Var name="__value__"><mt:Else><a href="<mt:PagerLink encode_html="1">"><mt:Var name="__value__"></a></mt:IfCurrentPage>
            <mt:unless name="__last__">&nbsp;</mt:unless>
        </mt:PagerBlock>
        <mt:IfMoreResults>&nbsp;&nbsp;<a href="<mt:NextLink encode_html="1">" rel="next">Next &raquo;</a>
        </mt:IfMoreResults>
    </div>
 
</div>
...後略...

3.アーカイブテンプレートの修正

1項の編集画面を開いた状態で、MTEntries タグに offset="auto" を追加し、limit="xx" でページ単位の表示数を設定します。$limit はそのまま使っても構いません。

変更前

<mt:Entries limit="$limit">

変更後

<mt:Entries limit="10" offset="auto">

これでアーカイブページにアクセスすればページ分割が行なえると思います。

なお、カテゴリアーカイブについては、MTEntriesWithSubCategories タグでも動作確認できました。

4.メインページについて

メインページもブログ記事リストのアーカイブページと同様の方法でページ分割可能ですが、ブログ内のすべてのブログ記事がページ分割対象となるため、カスタマイズが必要です(別の機会にエントリーしたいと思います)。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

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

AMN
Categories
Monthly Archives
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3