DittoのページングをYahoo!Japanっぽくシンプルにする

modxスニペット「Ditto」のページングは、ページ数が少ない間は良いのですが、ページ数が多くなってくると、そのままページ番号がずらずらと並ぶだけで、使いにくくなってきます。
現状のDittoには、10ページ毎にまとめる等の機能がありませんので、直接ソースに手を加えて改造するしかありません。

まず、ページングの仕様ですが、(Google仕様も検討しましたが、最大20ページ出るのは、ちょっと多すぎだと思うので、)以下のような現在のYahoo!Japanの仕様を参考にしました。(Bingになったらどうなるかわかりませんが)

              • -

・全体で10ページ以上ある場合、10ページ分の番号表示
・現在のページより小さい側に5ページ、大きい側に4ページあれば、これを表示

つまり、7ページ目から全体がシフトする

例)    [1] 2 3 4 5 6 7 8 9 10 次へ>
  <前へ 1 [2] 3 4 5 6 7 8 9 10 次へ>

  <前へ 1 2 3 4 5 [6] 7 8 9 10 次へ>
  <前へ 2 3 4 5 6 [7] 8 9 10 11 次へ>

              • -

■改造方法
modxに同梱のソース
assets/snippets/ditto/classes/ditto.class.inc.php
のpaginateメソッドの以下の2箇所にコードを追加挿入します。

1)

if ($inc != $start) {

(modx1.0.0Jの場合は1123行目、0.9.6.3の場合は1113行目)の直前に

			if ($x < $min_x) {
				continue;
			}
			if ($x > $max_x) {
				continue;
			}

を追加挿入。

2)

for ($x = 0; $x <= $totalpages -1; $x++) {

(modx1.0.0Jの場合は1120行目、0.9.6.3の場合は1110行目)の直前に

		$max_paginate = 10;
		$max_previous = 5;
		$cur_x = floor($start / $summarize);
		$min_x = $cur_x - $max_previous;
		if ($min_x < 0) {
			$min_x = 0;
		}
		$max_x = $min_x + $max_paginate - 1;
		if ($max_x > $totalpages - 1) {
			$max_x = $totalpages - 1;
			$min_x = $max_x - $max_paginate + 1;
		}

を追加挿入。