public static function pageselector($name, $rows, $pageNow = 1, $nbTotalPage = 1, $showAll = 200, $sliceStart = 5, $sliceEnd = 5, $percent = 20, $range = 10, $prompt = '')
{
$increment = floor($nbTotalPage / $percent);
$pageNowMinusRange = $pageNow - $range;
$pageNowPlusRange = $pageNow + $range;
$gotopage = $prompt . ' <select class="pageselector ajax"';
$gotopage .= ' name="' . $name . '" >';
if ($nbTotalPage < $showAll) {
$pages = range(1, $nbTotalPage);
} else {
$pages = array();
// Always show first X pages
for ($i = 1; $i <= $sliceStart; $i++) {
$pages[] = $i;
}
// Always show last X pages
for ($i = $nbTotalPage - $sliceEnd; $i <= $nbTotalPage; $i++) {
$pages[] = $i;
}
// Based on the number of results we add the specified
// $percent percentage to each page number,
// so that we have a representing page number every now and then to
// immediately jump to specific pages.
// As soon as we get near our currently chosen page ($pageNow -
// $range), every page number will be shown.
$i = $sliceStart;
$x = $nbTotalPage - $sliceEnd;
$met_boundary = false;
while ($i <= $x) {
if ($i >= $pageNowMinusRange && $i <= $pageNowPlusRange) {
// If our pageselector comes near the current page, we use 1
// counter increments
$i++;
$met_boundary = true;
} else {
// We add the percentage increment to our current page to
// hop to the next one in range
$i += $increment;
// Make sure that we do not cross our boundaries.
if ($i > $pageNowMinusRange && !$met_boundary) {
$i = $pageNowMinusRange;
}
}
if ($i > 0 && $i <= $x) {
$pages[] = $i;
}
}
/*
Add page numbers with "geometrically increasing" distances.
This helps me a lot when navigating through giant tables.
Test case: table with 2.28 million sets, 76190 pages. Page of interest
is between 72376 and 76190.
Selecting page 72376.
Now, old version enumerated only +/- 10 pages around 72376 and the
percentage increment produced steps of about 3000.
The following code adds page numbers +/- 2,4,8,16,32,64,128,256 etc.
around the current page.
*/
$i = $pageNow;
$dist = 1;
while ($i < $x) {
$dist = 2 * $dist;
$i = $pageNow + $dist;
if ($i > 0 && $i <= $x) {
$pages[] = $i;
}
}
$i = $pageNow;
$dist = 1;
while ($i > 0) {
$dist = 2 * $dist;
$i = $pageNow - $dist;
if ($i > 0 && $i <= $x) {
$pages[] = $i;
}
}
// Since because of ellipsing of the current page some numbers may be
// double, we unify our array:
sort($pages);
$pages = array_unique($pages);
}
foreach ($pages as $i) {
if ($i == $pageNow) {
$selected = 'selected="selected" style="font-weight: bold"';
} else {
$selected = '';
}
$gotopage .= ' <option ' . $selected . ' value="' . ($i - 1) * $rows . '">' . $i . '</option>' . "\n";
}
$gotopage .= ' </select>';
return $gotopage;
}