plasmasphere.net -プラズマスフィア ドットネット-

Diary

MTPaginate改造:ページング表示の変更

2008/10/01(Wed) 00:10

デフォルトのMTPaginateの表示がどうにもならんくらいダッセエんで、ちょっといじくってみました。

基本的には小粋空間のページ分割と似てますが、全く同じだと芸が無いので要所を変えてます。
例えば、<MTEntries lastn="9999999"> みたいに全件表示してページングした時のページリンクの羅列を制御したりとか。
カユイ所に手が届くぜ?

挙動は今の日記見てもらえば大体わかりますが、動作は以下の感じ。

  • 1ページを表示している時は、前のページリンクを表示しない。
  • 最終ページを表示している時は、次のページリンクを表示しない。
  • ページの数が設定数を超えた場合、省略して1ページ目と最終ページのリンクを表示する。
  • エントリー全件表示の非表示機能。

3つ目の項目が目玉です。
いらねー人は小粋空間さんの改造でオッケーですぞ。

MTPaginate.pl を改変します。
私の持ってたバージョンが 1.4 だったので、それ以外だと行数が違う可能性があるので、その辺はご容赦。
ていうか分からないならやらない方が無難です、動かなくなっても私は責任持てませんので、はい。
以下改変部分。

514行目から544行目の部分を…

				$res .=<<PHP
	if(\$paginate_current_page == 'all') {
		echo '$all_current$separator';
	} else {
		echo "<a href=\"\$paginate_self=all\"$title$target>$all</a>$separator";
	}
PHP
			}
			
			$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\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
	}
}
PHP
			if ($format_all && $place_all eq 'after') {
				my $title = "";
				$title =  sprintf(" title=\"$format_all_title\"", $num_pages) if $format_all_title;
				$res .=<<PHP
	if(\$paginate_current_page == 'all') {
		echo '$separator$all_current';
	} else {
		echo "$separator<a href=\"\$paginate_self=all\"$title$target>$all</a>";
	}
PHP

以下のソースに変更。

				$res .=<<PHP
	if(\$paginate_current_page == 'all') {
		echo '$all_current$separator';
	} else {
		echo "<a href=\"\$paginate_self=all\"$title$target>$all $end Pages.</a>$separator";
	}
PHP
			}
			
			$format_title = " . sprintf(' title="$format_title"', \$i)" if $format_title;
			$res .=<<PHP;
if(\$paginate_current_page - ($offset + 1) > 0 && $baf_link != "none") {
	echo "<a href=\"\$paginate_self=1\"$target" $format_title .  sprintf('>$format', '1') . '</a>';
	echo '$sub_separator';
}
for(\$i = $start; \$i <= $end; \$i++) {
	if(\$i == \$paginate_current_page) {
		echo sprintf("$format_current", \$i);
	} else {
		if((\$i < \$paginate_current_page) && (\$paginate_current_page - \$i < ($offset + 1))) {
			echo "<a href=\"\$paginate_self=\$i\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
			echo '$separator';
		}
		if((\$i > \$paginate_current_page) && (\$i - \$paginate_current_page < ($offset + 1))) {
			echo '$separator';
			echo "<a href=\"\$paginate_self=\$i\"$target" $format_title .  sprintf('>$format', \$i) . '</a>';
		}
	}
}
if(\$paginate_current_page + $offset < $end && $baf_link != "none") {
	echo '$sub_separator';
	echo "<a href=\"\$paginate_self=$end\"$target" $format_title .  sprintf('>$format', $end) . '</a>';
}
PHP
			if ($format_all && $place_all eq 'after' && $place_all ne 'none') {
				my $title = "";
				$title =  sprintf(" title=\"$format_all_title\"", $num_pages) if $format_all_title;
				$res .=<<PHP
	if(\$paginate_current_page == 'all') {
		echo '$separator$all_current';
	} else {
		echo "$separator<a href=\"\$paginate_self=all\"$title$target>$all $end Pages.</a>";
	}
PHP

433行目以下に強調部分の3行を追加。

433  my $format_title = $args->{format_title} || "";
my $offset = $args->{offset} || 2;
my $sub_separator = $args->{sub_separator} || '...';
my $baf_link = $args->{baf_link} || 1;

で改変終了です。

テンプレートから呼び出す時は、MTPaginateNavigator を指定します。
追加のパラメータは以下の通り。

前後のページリンクの表示数を変更する場合。デフォルトは2件。

<$MTPaginateNavigator offset="4">

1ページのリンクと最終ページのリンクを非表示にする場合。デフォルトは表示。
シンプルにページ替えのみの表示で良い場合は指定してください。

<$MTPaginateNavigator baf_link="none">

1ページリンク、最終ページリンクと、ページ替えリンクのセパレータを変更する場合。デフォルトは「...」。

<$MTPaginateNavigator sub_separator="-">

エントリー全件表示のリンクを消す場合。デフォルトは表示。

<$MTPaginateNavigator place_all="none">

パラメータは複数指定できるので、必要ならば指定してやってください。
ちなみに、この日記の指定はこんな感じです。

<$MTPaginateNavigator place_all="none" offset="4" separator="&nbsp;">

記事表示部分のテンプレートはこんな感じ。

<MTPaginate>

<MTPaginateIfMultiplePages>
<p class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>">«</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator place_all="none" offset="4" separator=" ">
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>">»</a>
</MTPaginateIfNextPage_>
</p>
</MTPaginateIfMultiplePages>

<MTPaginateContent max_sections="7">
<MTEntries lastn="9999999">

<$MTEntryTrackbackData$>

<div class="dbox">
<h2 id="a<$MTEntryID pad="1"$>"><a href="<$MTEntryPermalink valid_html="1"$>"><$MTEntryTitle$></a> <span class="sub"><$MTEntryDate format="%Y年%m月%d日"$></span></h2>

<$MTEntryBody eval="1"$>

<MTEntryIfExtended>
<p class="extended"><a href="<$MTEntryPermalink$>#more">続きを読む "<$MTEntryTitle$>"</a></p>
</MTEntryIfExtended>

<$MTInclude module="Posted_mod"$>
</div>

<$MTPaginateSectionBreak$>
</MTEntries>
</MTPaginateContent>

<MTPaginateIfMultiplePages>
<p class="paginate">
<MTPaginateIfPreviousPage_>
<a href="<$MTPaginatePreviousPageLink$>">«</a>
</MTPaginateIfPreviousPage_>
<$MTPaginateNavigator place_all="none" offset="4" separator=" ">
<MTPaginateIfNextPage_>
<a href="<$MTPaginateNextPageLink$>">»</a>
</MTPaginateIfNextPage_>
</p>
</MTPaginateIfMultiplePages>

</MTPaginate>

動作しねーよとか、わかんねーとかあったらコメントでも書いてください。
「どうやってやるの?」系の質問じゃない限り、答えるよう努力しますんで、はい。


似てるっぽいネタ


 
© 1999- plasmasphere.net All rights reserved.