somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】paginateと独自ページャ

cakePHPのpaginate実行後の問題があったのでメモ。

 

VIEWにてページャのページ番号リンク押下時にページ遷移以外の処理が必要なため、paginateではなく独自ページャを用いてページ表示をしていました。

その処理とは、Javascriptを用いてある値をPOSTしつつページ遷移するというものです。 しかし、独自ページャは、表示するページ番号が全て表示されてしまうような作りになっていました…。

そもそも、paginateだけでなんとかできないのか?

完全修正は試してはいませんが、ごっそり作り変えればよさそうでした。 ページ番号リンクおよび、前へ・次へ・最初・最後(「<」「>」「<<」「>>」)リンクを変更すればよいからです。

変更せずに使うと、リンクのURL部分はVIEWを表示したときのURLと変わりませんでした。 NULLにしてみたり、#にしてみましたが、もとのURLに近いものが表示されました。 (パラメータを追加すると、「コントローラー/アクション/パラメータ名:値」となりました。)

これは、「paginator」のメソッドが最終的にHTMLヘルパーのリンクタグを用いているからだと思います。 リンクタグ生成時に、URLはもとのURLをベースに生成するようです。

また、今回はリンクにオプションとしてonclick属性を追加し、実行するJavascriptの関数を書きました。 Javascriptの関数は実行され、POSTすることに成功しましたが、最終的にはリンク自体のリクエストによって中断されてしまいました。

つまり、 リンクのURLを「#」や「javascript:void(0)」にすればよいので、HTMLヘルパーのリンクを使わずに実装すること。 Javascript関数の引数にページ番号を付加しないといけないので、「paginator」のメソッド(prev、next、numbers)を修正する必要があるでしょう。

 


 

以下、独自ページャのための構想 表示は以下のようにします。■:現在ページ

偶数:□□□■□□

奇数:□□■□□

表示形式(表示ページ数が偶数):(現在ページ - (表示ページ数 / 2))~(現在ページ)~(現在ページ + (表示ページ数 / 2) - 1)

表示例(表示ページ数が偶数):5- (6/ 2)~(5)~(5 + (6 / 2) - 1) ⇒:(5 - 3)~(5)~(5 + 3 - 1) ⇒:(2)~(5)~(7)

--------------------------------------------------------------------------------

 

表示形式(表示ページ数が奇数):(現在ページ - 切り捨て(表示ページ数 / 2))~(現在ページ)~(現在ページ + 切り捨て(表示ページ数 / 2))

表示例(表示ページ数が奇数):5- 切り捨て(5/ 2)~(5)~(5 + 切り捨て(5 / 2)) ⇒:(5 - 2)~(5)~(5 + 2) ⇒:(3)~(5)~(7)

 

--------------------------------------------------------------------------------

表示形式(表示ページ数両対応):(現在ページ - 切り捨て(表示ページ数 / 2))~(現在ページ)

表示形式(表示ページ数両対応):(現在ページ)~(現在ページ + 切り捨て(表示ページ数 / 2) (偶数:- 1))

--------------------------------------------------------------------------------

ただし、1ページ~全ページ数の範囲を超えた場合を考慮しなくてはならない。

--------------------------------------------------------------------------------

(現在ページ - 切り捨て(表示ページ数 / 2)) <= 0の場合:(1ページ)~(表示ページ数) (現在ページ + 切り捨て(表示ページ数 / 2) (偶数:- 1)) > 全ページ数の場合:(全ページ数 - 表示ページ数 + 1)~(全ページ数) 両端の範囲を超える場合⇒全ページ数 <= 表示ページ数の場合:(1ページ)~(全ページ数)

--------------------------------------------------------------------------------

first:<< prev:< next:> last:>> ページセパレータ: | function pagination($dispDataNum, $dataNum, $currentPage) {   $brTag = "<br />";   $hrTag = "<hr />";   $first = "&lt;&lt;";   $prev = "&lt;";   $next = "&gt;";   $last = "&gt;&gt;";   $seperator = "&nbsp;|&nbsp;";   $nbsp = "&nbsp;";   // 表示ページ数   $dispPageNum = 5;   // リンクURL   $url = "javascript:void(0);";   // 全ページ数   $allPageNum = ($dataNum % $dispDataNum == 0) ? 0 : 1;   $allPageNum += (int)($dataNum / $dispDataNum);   // 先頭・最終ページ取得   $aryPage = createFirstAndLastPage($dispPageNum, $allPageNum, $currentPage);   echo "表示ページ数:" .$dispPageNum .$brTag;   echo "表示データ数:" .$dispDataNum .$brTag;   echo "全ページ数:" .$allPageNum .$brTag;   echo "現在のページ番号:" .$currentPage .$brTag;   echo "先頭ページ番号:" .$aryPage["first"] .$brTag;   echo "最終ページ番号:" .$aryPage["last"] .$brTag;      echo $first .$nbsp .$prev .$nbsp;   for ($i = $aryPage["first"]; $i <= $aryPage["last"]; $i++) {     if ($i == $currentPage) {       echo "<b>" .$i ."</b>";     } else {       echo $i;     }     if ($i != $aryPage["last"]) {       echo $seperator;     }   }   echo $nbsp .$next .$nbsp .$last; } function createFirstAndLastPage($dispPageNum, $allPageNum, $currentPage) {   // 戻り値(仮)   $retAryPage = array(     "first" => $currentPage - (int)($dispPageNum / 2),     "last"  => $currentPage + (int)($dispPageNum / 2) - (($dispPageNum % 2 == 0) ? 1: 0)   );   // 全ページ数が表示ページ数以下   if ($allPageNum <= $dispPageNum) {     $retAryPage["first"] = 1;     $retAryPage["last"]  = $allPageNum;     return $retAryPage;   }   // 先頭ページが表示範囲以外   if ($retAryPage["first"] <= 0) {     $retAryPage["first"] = 1;     $retAryPage["last"]  = $dispPageNum;     return $retAryPage;   }   // 最終ページが表示範囲以外   if ($retAryPage["last"] > $allPageNum) {     $retAryPage["first"] = $allPageNum - $dispPageNum + 1;     $retAryPage["last"]  = $allPageNum;     return $retAryPage;   }   return $retAryPage; } pagination(3, 34, 5); [実行結果] 表示ページ数:5 表示データ数:3 全ページ数:12 現在のページ番号:5 先頭ページ番号:3 最終ページ番号:7 << < 3 | 4 | 5 | 6 | 7 > >> 表示ページ数:6 表示データ数:3 全ページ数:12 現在のページ番号:5 先頭ページ番号:2 最終ページ番号:7 << < 2 | 3 | 4 | 5 | 6 | 7 > >>