diff --git a/wire/modules/Markup/MarkupPagerNav/PagerNav.php b/wire/modules/Markup/MarkupPagerNav/PagerNav.php index a524c0e7..f285f016 100644 --- a/wire/modules/Markup/MarkupPagerNav/PagerNav.php +++ b/wire/modules/Markup/MarkupPagerNav/PagerNav.php @@ -29,11 +29,11 @@ class PagerNavItem { 'label' => '', 'pageNum' => 0, 'type' => '', // first, previous, next, last, current, or separator - ); + ); public function __construct($label, $pageNum, $type = '') { - $this->data['label'] = $label; - $this->data['pageNum'] = $pageNum; + $this->data['label'] = (string) $label; + $this->data['pageNum'] = (int) $pageNum; $this->data['type'] = $type; } @@ -69,11 +69,12 @@ class PagerNav implements \IteratorAggregate { protected $totalItems = 0; protected $firstItem = 0; protected $itemsPerPage = 0; + protected $version = 'MP'; // MP=matjazpotocnik PR #260 protected $labels = array( 'previous' => 'prev', 'next' => 'next' - ); + ); protected $separator = NULL; @@ -96,7 +97,6 @@ class PagerNav implements \IteratorAggregate { $this->totalItems = $totalItems; $this->currentPage = $currentPage-1; $this->itemsPerPage = $itemsPerPage; - $this->firstItem = $this->currentPage * $this->itemsPerPage; /* @@ -109,12 +109,16 @@ class PagerNav implements \IteratorAggregate { } */ - if($this->totalItems > 0) $this->totalPages = ceil($this->totalItems / $this->itemsPerPage)-1; - else $this->totalPages = 0; + if($this->totalItems > 0) { + $this->totalPages = ceil($this->totalItems / $this->itemsPerPage) - 1; + } else { + $this->totalPages = 0; + } /* // uncomment this section for debugging - echo "totalItems: " . $this->totalItems . "
" . + echo + "totalItems: " . $this->totalItems . "
" . "totalPages: " . $this->totalPages . "
" . "currentPage: " . $this->currentPage . "
" . "itemsPerPage: " . $this->itemsPerPage . "
"; @@ -142,22 +146,28 @@ class PagerNav implements \IteratorAggregate { if(!is_null($this->pager)) return $this->pager; $this->pager = array(); - if($this->numPageLinks) { $numPageLinks = $this->numPageLinks-1; - //$numHalf = (int) round($numPageLinks / 2); $numHalf = (int) floor($numPageLinks / 2); $startPage = $this->currentPage - $numHalf; - if($startPage <= 0) { - $startPage = 0; - - } else if($startPage > 0) { - $numPageLinks--; + if($this->version === 'MP') { + if($startPage < 0) $startPage = 0; + if($numHalf >= ($this->currentPage - 1)) $startPage = 0; + if($this->currentPage + $this->numPageLinks - $numHalf >= $this->totalPages) $startPage++; + if($this->currentPage == $this->totalPages - $numPageLinks) $startPage--; // to prevent 32 33 34 ... and 31 is missing + if($startPage < 0) $startPage = 0; // just in case + $endPage = $startPage + $numPageLinks; + if($this->currentPage == $endPage) $endPage++; // to prevent 1 2 3 ... and 4 is missing + } else { + if($startPage <= 0) { + $startPage = 0; + } else { + $numPageLinks--; + } + $endPage = $startPage + $numPageLinks; } - $endPage = $startPage + $numPageLinks; - if($endPage > $this->totalPages) { $endPage = $this->totalPages; $startPage = $endPage - $numPageLinks; @@ -171,37 +181,52 @@ class PagerNav implements \IteratorAggregate { /* // uncomment for debugging purposes - echo "numPageLinks=$numPageLinks
" . + echo + "numPageLinks=$numPageLinks
" . "numHalf=$numHalf
" . + "currentPage={$this->currentPage}
". //MP + "pageNum=". ($this->currentPage+1) . "
". //MP "startPage=$startPage
" . "endPage=$endPage
" . "totalPages={$this->totalPages}
" . "totalItems={$this->totalItems}
"; */ - - for($n = $startPage; $n <= ($endPage+1); $n++) { - $type = $n == ($this->currentPage+1) ? PagerNavItem::typeCurrent : ''; - if($n) $this->pager[] = new PagerNavItem($n, $n - 1, $type); + if($this->version === 'MP') { + for($n = $startPage; $n <= $endPage; $n++) { //MP + $type = $n == ($this->currentPage) ? PagerNavItem::typeCurrent : ''; + $this->pager[] = new PagerNavItem($n + 1, $n, $type); + } + } else { + for($n = $startPage; $n <= ($endPage+1); $n++) { + $type = $n == ($this->currentPage + 1) ? PagerNavItem::typeCurrent : ''; + if($n) $this->pager[] = new PagerNavItem($n, $n - 1, $type); + } } if($this->currentPage < $this->totalPages) { $useLast = true; $item = null; - $key = null; - foreach($this->pager as $key => $item) { + foreach($this->pager as $item) { if($item->pageNum == $this->totalPages) $useLast = false; } - /* - if($item && $item->pageNum == ($this->totalPages-1)) { - unset($this->pager[$key]); - $this->pager[] = $this->separator; - $this->pager[] = new PagerNavItem($this->totalPages+1, $this->totalPages); - $useLast = false; + if($this->version === 'MP') { + if($item && $item->pageNum == ($this->totalPages - 1)) { + $this->pager[] = new PagerNavItem($this->totalPages + 1, $this->totalPages); + $useLast = false; + } + } else { + /* not used but for reference + if($item && $item->pageNum == ($this->totalPages-1)) { + unset($this->pager[$key]); + $this->pager[] = $this->separator; + $this->pager[] = new PagerNavItem($this->totalPages+1, $this->totalPages); + $useLast = false; + } + */ } - */ if($useLast) { $this->pager[] = $this->separator; @@ -215,21 +240,22 @@ class PagerNav implements \IteratorAggregate { $firstPageLink = false; - foreach($this->pager as $key => $item) { + foreach($this->pager as $item) { // convert from 0-based to 1-based if($item->type != 'separator') $item->pageNum = $item->pageNum+1; if($item->pageNum == 1) $firstPageLink = true; } - if(!$firstPageLink) { - // if the first page in pager is page 2, then get rid of it because we're already adding a page 1 (via typeFirst) // and leaving it here would result in 1 ... 2 $item = reset($this->pager); - if($item->pageNum == 2) array_shift($this->pager); - - array_unshift($this->pager, $this->separator); + if($this->version === 'MP') { + if($item->pageNum != 2) array_unshift($this->pager, $this->separator); // prev 1 2 3 4 5 6 next + } else { + if($item->pageNum == 2) array_shift($this->pager); + array_unshift($this->pager, $this->separator); + } array_unshift($this->pager, new PagerNavItem(1, 1, PagerNavItem::typeFirst)); // add reference to page 1 } @@ -237,13 +263,15 @@ class PagerNav implements \IteratorAggregate { array_unshift($this->pager, new PagerNavItem($this->getLabel('previous'), $this->currentPage, PagerNavItem::typePrevious)); } - } else $this->pager = array(); + } else { + $this->pager = array(); + } return $this->pager; } - #[\ReturnTypeWillChange] + #[\ReturnTypeWillChange] public function getIterator() { return new \ArrayObject($this->getPager()); } public function getFirstItem() { return $this->firstItem; } public function getItemsPerPage() { return $this->itemsPerPage; }