ページネーションで常に5件ページリンクを表示する[備忘録]
自分の勉強用です。
ページネーションコード
ページネーションで常に5件のリンクを表示&5件のページ未満の投稿数でもリンクを適切に表示するコードについて。
min関数とmax関数について
min関数
min(配列)とした場合、min()は配列の中で最も小さい数値を返す。
min(1, 10)とした場合、min()はそれらの中で最も小さいものを返す。
異なる型の値を比較する際、例えばstringとintを比較するときには、数値0と評価する。
stringとstringを比較する場合は、ABC順で評価する。
返される値は何も変換されていない、元の形の値。
戻り値
異なる型で同じ値と評価される複数の値(0 と'abc')を渡した場合は関数に最初に渡されたほうを返す。
max関数
max配列)とした場合、max()は配列の中で最も大きい数値を返す。
max(1, 10)とした場合、max()はそれらの中で最も大きいものを返す。
それ以外は上記と同じ。
ページ一覧の最初と最後の定義
ページ一覧の最初と最後の数値は可変なので、「ページ数 < 5」でも「ページ数 >= 5」でも適切にページネーションが表示される必要がある。
5件のリンクを作成するので、ページ一覧の最初をまず定義する。
$page(現在のページ)がページネーションの中央に来ると考えると、$pageから -2したページが、ページ一覧の最初に来る。
しかし、ページ一覧の最初のページは1になるはずなので、「$page <= 2」の場合、-2したページは「0 or -1」になってしまう。
その場合に備えて、max関数で、$first_page(最初のページ)より$pageが小さい場合は$first_pageを$start(ページネーションで表示する最初のリンク)に代入するようにする。
最初のページリンクが定義できたら、最後のページリンクを定義する。
ページリンクは5件表示するので、「最初のページリンク + 4」で最後のページリンクのページ数は計算できる。
ただ、ページ数の中央値を超えたページが$pageだった場合、$end(最後のページ)が存在しないページになってしまう。
なので、「$start + 4 > $total_page」の場合は、$total_pageが$endに代入されるようにmin関数を使用する。
これで、$end(最後のページリンク)の幅を決めることが出来る。
最大ページの一個前のページにいる時に起こる問題(ページリンクが5件以下になってしまう)
ページが全部で9ページの場合、「$page = 8」になるまでこのif文は使われない。
「$end - $start」が4より小さくなるのは、「$page = 8」からだからだ。
というのも、常に5件ページリンクをつくるのに、「$page = 8」の時、「$start = 6(8-2)」になるが、$endは「$total_page = 9」で、「6, 7, 8, 9」の4つしかリンク番号が作成されなくなってしまう。
そのため、「$end - $start」が4より小さい場合は、$startの位置をずらしてあげる必要がある。
そのために、「$end - 4」か$first_pageのうち、大きい方をmax関数で$startに再代入してあげる。
なぜ、「$end - 4」なのかというと、$endから4つ引いた位置は5件のページリンクの最初となるから。(あまり上手な説明となっていない‥汗)
ページネーションをつくる
ここまでで、ページネーションのリンクの下ごしらえはできたので、あとはHTMLで表示するために$pagination[]に「$start->$end」まで数値をfor文で++して代入してあげればいい。