Commit b29a30c3 authored by David Maus's avatar David Maus
Browse files

Initial Commit

parents
((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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment