Skip to content
Snippets Groups Projects
Commit b29a30c3 authored by David Maus's avatar David Maus
Browse files

Initial Commit

parents
No related branches found
No related tags found
No related merge requests found
((nil . ((php-project-name . "HAB Paginator"))))
/vendor/
composer.lock
*~
\#*
{
"name": "hab/php-paginator",
"autoload": {
"psr-4": {
"HAB\\Paginator\\": "lib/"
}
}
}
<?php
/**
* This file is part of HAB Paginator.
*
* HAB Paginator is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HAB Paginator is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HAB Paginator. If not, see <http://www.gnu.org/licenses/>.
*
* @author David Maus <maus@hab.de>
* @copyright (c) 2017 by Herzog August Bibliothek Wolfenbüttel
* @license http://www.gnu.org/licenses/gpl.txt GNU General Public License v3 or higher
*/
namespace HAB\Paginator;
use Countable;
/**
* Paginator.
*
* @author David Maus <maus@hab.de>
* @copyright (c) 2017 by Herzog August Bibliothek Wolfenbüttel
* @license http://www.gnu.org/licenses/gpl.txt GNU General Public License v3 or higher
*/
class Paginator implements Countable
{
/**
* Current page.
*
* @var integer
*/
private $currentPage;
/**
* Total number of items.
*
* @var integer
*/
private $numberOfItems;
/**
* Number of items per page.
*
* @var integer
*/
private $itemsPerPage = 25;
/**
* Number of pages.
*
* @var integer
*/
private $numberOfPages;
/**
* Pagination information.
*
* @var array
*/
private $pages;
/**
* Set number of items.
*
* @param integer $numberOfItems
* @return self
*/
public function setNumberOfItems ($numberOfItems)
{
$this->numberOfItems = $numberOfItems;
$this->numberOfPages = null;
return $this;
}
/**
* Return number of items.
*
* @return integer
*/
public function getNumberOfItems ()
{
return $this->numberOfItems;
}
/**
* Return number of items per page.
*
* @return integer
*/
public function getItemsPerPage ()
{
return $this->itemsPerPage;
}
/**
* Set number of items per page.
*
* @param integer $itemsPerPage
* @return self
*/
public function setItemsPerPage ($itemsPerPage)
{
$this->itemsPerPage = $itemsPerPage;
return $this;
}
/**
* Set current page.
*
* @param integer $currentPage
* @return self
*/
public function setCurrentPage ($currentPage)
{
$this->currentPage = $this->normalizePage($currentPage);
return $this;
}
/**
* Return current page.
*
* @return integer
*/
public function getCurrentPage ()
{
return $this->currentPage;
}
/**
* Return offset of current page.
*
* @return integer
*/
public function getCurrentPageOffset ()
{
$page = $this->getCurrentPage();
$size = $this->getItemsPerPage();
return ($page - 1) * $size;
}
/**
* Return paging information.
*
* @return array
*/
public function getPages ()
{
if (is_null($this->pages)) {
$this->pages = $this->createPages();
}
return $this->pages;
}
/**
* {@inheritDoc}
*/
public function count ()
{
if (is_null($this->numberOfPages)) {
$total = $this->getNumberOfItems();
$pagesize = $this->getItemsPerPage();
$this->numberOfPages = (int)ceil($total / $pagesize);
}
return $this->numberOfPages;
}
/**
* Return visible pages.
*
* @return array
*/
public function getVisiblePages ()
{
$current = $this->getCurrentPage();
$total = $this->count();
if ($total < 3) {
return array();
}
$start = max($current - 5, 1);
$end = min($start + 9, $total);
return range($start, $end);
}
/**
* Normalize page number.
*
* @param integer $page
* @return integer
*/
private function normalizePage ($page)
{
if ($page < 1) {
$page = 1;
}
$count = count($this);
if ($count > 0 and $page > $count) {
$page = $count;
}
return $page;
}
/**
* Create paging information.
*
* @return array
*/
private function createPages ()
{
$pages = array();
$pages['current'] = $this->getCurrentPage();
$pages['first'] = 1;
$pages['last'] = count($this);
$pages['count'] = count($this);
$pages['size'] = $this->getItemsPerPage();
$pages['visible'] = $this->getVisiblePages();
$pages['prev'] = ($pages['current'] === $pages['first']) ? null : $pages['current'] - 1;
$pages['next'] = ($pages['current'] === $pages['last']) ? null : $pages['current'] + 1;
return $pages;
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment