Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class Paginator
- {
- /** @var int */
- private $limit = 20;
- /** @var int */
- private $page;
- /** @var int */
- private $numItems;
- /** @var int */
- private $numLinks;
- /**
- * @param int
- * @param int
- * @return void
- */
- public function __construct($numItems, $page = 1)
- {
- $this->numItems = (int) $numItems;
- $this->numLinks = $this->getNumLinks();
- $this->page = $page > 0 ? (int) $page : 1;
- if ($page > $this->numLinks) {
- $this->page = 1;
- }
- }
- /**
- * @param int
- * @return void
- */
- public function setLimit($limit)
- {
- $this->limit = $limit;
- }
- /**
- * @return int
- */
- private function getNumLinks()
- {
- return (int) floor($this->numItems / $this->limit);
- }
- /**
- * @return int
- */
- public function getOffset()
- {
- return $this->page * $this->limit;
- }
- /**
- * @param int
- * @param string|NULL
- * @param string|NULL
- * @param array
- * @param bool
- * @return string
- */
- private function getLinkHtml($page, $char = NULL, $attributes = array(), $isActive = FALSE)
- {
- if ($char === NULL) {
- $char = $page;
- }
- if ($page !== NULL) {
- $page = "?page=" . $page;
- } else {
- $page = "#";
- }
- $attrs = $this->getAttributesAsString($attributes);
- $active = "";
- if ($isActive) {
- $active = ' class="active"';
- }
- return '<a href="' . $page . '"' . $attrs . $active . '>' . $char . '</a>';
- }
- /**
- * @param string
- * @param array
- * @return string
- */
- private function getInactiveLinkHtml($char, $attributes = array())
- {
- $attrs = $this->getAttributesAsString($attributes);
- return '<span class="inactive"' . $attrs . '>' . $char . '</span>';
- }
- /**
- * @param array
- * @return string
- */
- private function getAttributesAsString(array $attributes)
- {
- $attrs = "";
- foreach ($attributes as $name => $value) {
- $attrs .= ' ' . $name . '="' . $value . '"';
- }
- return $attrs;
- }
- /**
- * @return string
- */
- public function __toString()
- {
- $list = "";
- // previous and the first page
- if ($this->page > 1) {
- $previousPage = $this->page - 1;
- $list .= $this->getLinkHtml(1, "««", array("title" => "První stránka"));
- $list .= $this->getLinkHtml($previousPage, "«", array("title" => "Předchozí stránka"));
- } else {
- $list .= $this->getInactiveLinkHtml("««");
- $list .= $this->getInactiveLinkHtml("«");
- }
- // each pages
- if ($this->numLinks === 0) {
- $list .= $this->getLinkHtml(1, NULL, array(), TRUE);
- } else {
- for ($i = -2; $i <= 2; $i++) {
- if ($i <= $this->numLinks) {
- $page = $this->page + $i;
- if ($page > 0 && $page <= $this->numLinks) {
- $active = $page === $this->page;
- $list .= $this->getLinkHtml($page, NULL, array(), $active);
- }
- }
- }
- }
- // next and the last page
- if ($this->page < $this->numLinks) {
- $nextPage = $this->page + 1;
- $list .= $this->getLinkHtml($nextPage, "»", array("title" => "Další stránka"));
- $list .= $this->getLinkHtml($this->numLinks, "»»", array("title" => "Poslední stránka"));
- } else {
- $list .= $this->getInactiveLinkHtml("»");
- $list .= $this->getInactiveLinkHtml("»»");
- }
- return <<<EOT
- <div class="paginator">
- {$list}
- </div>
- EOT;
- }
- }
- // použití
- $numItems = 100;
- $page = isset($_GET["page"]) ? (int) $_GET["page"] : 1;
- echo new Paginator($numItems, $page);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement