first = 1; $this->last = $details['pageCount']; $this->current = $details['currentPage']; $this->total = $details['total']; $this->uri = $details['uri']; $this->pageCount = $details['pageCount']; $this->segment = $details['segment'] ?? 0; } //-------------------------------------------------------------------- /** * Sets the total number of links that should appear on either * side of the current page. Adjusts the first and last counts * to reflect it. * * @param integer|null $count * * @return PagerRenderer */ public function setSurroundCount(int $count = null) { $this->updatePages($count); return $this; } //-------------------------------------------------------------------- /** * Checks to see if there is a "previous" page before our "first" page. * * @return boolean */ public function hasPrevious(): bool { return $this->first > 1; } //-------------------------------------------------------------------- /** * Returns a URL to the "previous" page. The previous page is NOT the * page before the current page, but is the page just before the * "first" page. * * You MUST call hasPrevious() first, or this value may be invalid. * * @return string|null */ public function getPrevious() { if (! $this->hasPrevious()) { return null; } $uri = clone $this->uri; if ($this->segment === 0) { $uri->addQuery('page', $this->first - 1); } else { $uri->setSegment($this->segment, $this->first - 1); } return (string) $uri; } //-------------------------------------------------------------------- /** * Checks to see if there is a "next" page after our "last" page. * * @return boolean */ public function hasNext(): bool { return $this->pageCount > $this->last; } //-------------------------------------------------------------------- /** * Returns a URL to the "next" page. The next page is NOT, the * page after the current page, but is the page that follows the * "last" page. * * You MUST call hasNext() first, or this value may be invalid. * * @return string|null */ public function getNext() { if (! $this->hasNext()) { return null; } $uri = clone $this->uri; if ($this->segment === 0) { $uri->addQuery('page', $this->last + 1); } else { $uri->setSegment($this->segment, $this->last + 1); } return (string) $uri; } //-------------------------------------------------------------------- /** * Returns the URI of the first page. * * @return string */ public function getFirst(): string { $uri = clone $this->uri; if ($this->segment === 0) { $uri->addQuery('page', 1); } else { $uri->setSegment($this->segment, 1); } return (string) $uri; } //-------------------------------------------------------------------- /** * Returns the URI of the last page. * * @return string */ public function getLast(): string { $uri = clone $this->uri; if ($this->segment === 0) { $uri->addQuery('page', $this->pageCount); } else { $uri->setSegment($this->segment, $this->pageCount); } return (string) $uri; } //-------------------------------------------------------------------- /** * Returns the URI of the current page. * * @return string */ public function getCurrent(): string { $uri = clone $this->uri; if ($this->segment === 0) { $uri->addQuery('page', $this->current); } else { $uri->setSegment($this->segment, $this->current); } return (string) $uri; } //-------------------------------------------------------------------- /** * Returns an array of links that should be displayed. Each link * is represented by another array containing of the URI the link * should go to, the title (number) of the link, and a boolean * value representing whether this link is active or not. * * @return array */ public function links(): array { $links = []; $uri = clone $this->uri; for ($i = $this->first; $i <= $this->last; $i ++) { $links[] = [ 'uri' => (string) ($this->segment === 0 ? $uri->addQuery('page', $i) : $uri->setSegment($this->segment, $i)), 'title' => (int) $i, 'active' => ($i === $this->current), ]; } return $links; } //-------------------------------------------------------------------- /** * Updates the first and last pages based on $surroundCount, * which is the number of links surrounding the active page * to show. * * @param integer|null $count The new "surroundCount" */ protected function updatePages(int $count = null) { if (is_null($count)) { return; } $this->first = $this->current - $count > 0 ? (int) ($this->current - $count) : 1; $this->last = $this->current + $count <= $this->pageCount ? (int) ($this->current + $count) : (int) $this->pageCount; } //-------------------------------------------------------------------- }