diff --git a/system/Pager/PagerRenderer.php b/system/Pager/PagerRenderer.php index 1712ddfd13dd..ed95c1b1f41b 100644 --- a/system/Pager/PagerRenderer.php +++ b/system/Pager/PagerRenderer.php @@ -343,4 +343,78 @@ protected function updatePages(int $count = null) } //-------------------------------------------------------------------- + + /** + * Checks to see if there is a "previous" page before our "first" page. + * + * @return boolean + */ + public function hasPreviousPage(): bool + { + return $this->current > 1; + } + + //-------------------------------------------------------------------- + + /** + * Returns a URL to the "previous" page. + * + * You MUST call hasPreviousPage() first, or this value may be invalid. + * + * @return string|null + */ + public function getPreviousPage() + { + if (!$this->hasPreviousPage()) { + return null; + } + + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->current - 1); + } else { + $uri->setSegment($this->segment, $this->current - 1); + } + + return (string) $uri; + } + + //-------------------------------------------------------------------- + + /** + * Checks to see if there is a "next" page after our "last" page. + * + * @return boolean + */ + public function hasNextPage(): bool + { + return $this->current < $this->last; + } + + //-------------------------------------------------------------------- + + /** + * Returns a URL to the "next" page. + * + * You MUST call hasNextPage() first, or this value may be invalid. + * + * @return string|null + */ + public function getNextPage() + { + if (!$this->hasNextPage()) { + return null; + } + + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->current + 1); + } else { + $uri->setSegment($this->segment, $this->current + 1); + } + + return (string) $uri; + } } diff --git a/tests/system/Pager/PagerRendererTest.php b/tests/system/Pager/PagerRendererTest.php index ea22274b7dd3..636700461523 100644 --- a/tests/system/Pager/PagerRendererTest.php +++ b/tests/system/Pager/PagerRendererTest.php @@ -1,4 +1,6 @@ - $uri, 'pageCount' => 10, // 10 pages 'currentPage' => 4, - 'total' => 100,// 100 records, so 10 per page + 'total' => 100, // 100 records, so 10 per page ]; $pager = new PagerRenderer($details); @@ -451,4 +453,77 @@ public function testGetFirstAndGetLastSegment() $this->assertEquals('http://example.com/foo/50?foo=bar', $pager->getLast()); } + //-------------------------------------------------------------------- + + public function testHasPreviousPageReturnsFalseWhenCurrentPageIsFirst() + { + $details = [ + 'uri' => $this->uri, + 'pageCount' => 5, + 'currentPage' => 1, + 'total' => 100 + ]; + + $pager = new PagerRenderer($details); + + $this->assertNull($pager->getPreviousPage()); + $this->assertFalse($pager->hasPreviousPage()); + } + + //-------------------------------------------------------------------- + + public function testHasNextPageReturnsFalseWhenCurrentPageIsLast() + { + $details = [ + 'uri' => $this->uri, + 'pageCount' => 5, + 'currentPage' => 5, + 'total' => 100 + ]; + + $pager = new PagerRenderer($details); + + $this->assertNull($pager->getNextPage()); + $this->assertFalse($pager->hasNextPage()); + } + + //-------------------------------------------------------------------- + + public function testHasPreviousPageReturnsTrueWhenFirstIsMoreThanCurrent() + { + $uri = $this->uri; + + $details = [ + 'uri' => $uri, + 'pageCount' => 10, + 'currentPage' => 3, + 'total' => 100 + ]; + + $pager = new PagerRenderer($details); + + $this->assertNotNull($pager->getPreviousPage()); + $this->assertTrue($pager->hasPreviousPage()); + $this->assertEquals('http://example.com/foo?page=2', $pager->getPreviousPage()); + } + + //-------------------------------------------------------------------- + + public function testHasNextPageReturnsTrueWhenLastIsMoreThanCurrent() + { + $uri = $this->uri; + + $details = [ + 'uri' => $uri, + 'pageCount' => 10, + 'currentPage' => 3, + 'total' => 100 + ]; + + $pager = new PagerRenderer($details); + + $this->assertNotNull($pager->getNextPage()); + $this->assertTrue($pager->hasNextPage()); + $this->assertEquals('http://example.com/foo?page=4', $pager->getNextPage()); + } }