- //fix non-static factory method error
- error_reporting(error_reporting() & ~E_STRICT);
- $this->pager = \Pager::factory(
- array(
- 'mode' => 'Sliding',
- 'perPage' => $perPage,
- 'delta' => 2,
- 'totalItems' => $itemCount,
- 'currentPage' => $currentPage,
- 'urlVar' => 'page',
- 'append' => $append,
- 'path' => '',
- 'fileName' => $filename,
- 'separator' => '###',
- 'spacesBeforeSeparator' => 0,
- 'spacesAfterSeparator' => 0,
- 'curPageSpanPre' => '',
- 'curPageSpanPost' => '',
- 'firstPagePre' => '',
- 'firstPageText' => 'first',
- 'firstPagePost' => '',
- 'lastPagePre' => '',
- 'lastPageText' => 'last',
- 'lastPagePost' => '',
- 'prevImg' => '« prev',
- 'nextImg' => 'next »',
- )
- );
+
+ $numPages = ceil($itemCount / $perPage);
+ $this->numPages = $numPages;
+
+ //1-based
+ $pages = [
+ 1 => true,
+ 2 => true,
+ $numPages - 1 => true,
+ $numPages => true,
+ ];
+ if ($currentPage <= 6) {
+ $pages[3] = 3;
+ $pages[4] = 4;
+ $pages[5] = 5;
+ }
+ if ($currentPage >= $numPages - 5) {
+ $pages[$numPages - 2] = true;
+ $pages[$numPages - 3] = true;
+ $pages[$numPages - 4] = true;
+ }
+ for ($n = $currentPage - 2; $n <= $currentPage + 2; $n++) {
+ $pages[$n] = true;
+ }
+ foreach (array_keys($pages) as $key) {
+ if ($key < 1 || $key > $numPages) {
+ unset($pages[$key]);
+ }
+ }
+ if ($currentPage >= 7 && !isset($pages[4])) {
+ $pages[3] = null;
+ }
+ if ($currentPage <= $numPages - 6 && !isset($pages[$numPages - 3])) {
+ $pages[$numPages - 2] = null;
+ }
+
+ ksort($pages);
+ foreach ($pages as $pageNum => &$value) {
+ if ($pageNum == $currentPage) {
+ $value = ['active'=> false, 'title' => $pageNum];
+ } else if ($value !== null) {
+ $value = $this->makeLink($pageNum, $filename);
+ } else {
+ $value = ['active'=> false, 'title' => '…'];
+ }
+ }
+
+ $prev = ['active'=> false, 'title' => '« prev'];
+ if ($currentPage > 1) {
+ $prev = $this->makeLink($currentPage - 1, $filename, '« prev');
+ }
+ $next = ['active'=> false, 'title' => 'next »'];
+ if ($currentPage < $numPages) {
+ $next = $this->makeLink($currentPage + 1, $filename, 'next »');
+ }
+ //first and last are for opensearch
+ $first = ['active'=> false, 'title' => 'first'];
+ if ($currentPage > 1) {
+ $first = $this->makeLink(1, $filename, 'first');
+ }
+ $last = ['active'=> false, 'title' => 'last'];
+ if ($numPages > 1 && $currentPage < $numPages) {
+ $last = $this->makeLink($numPages, $filename, 'last');
+ }
+
+ $this->links = [
+ 'prev' => $prev,
+ 'next' => $next,
+ 'first' => $first,
+ 'last' => $last,
+ 'pages' => $pages,
+ ];