Jordimario

Paginazionelol

Nov 14th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 5.91 KB | None | 0 0
  1. <?php
  2.  
  3. class Pagination
  4. {
  5.     private $last;
  6.     private $next;
  7.     private $prev;
  8.     private $first;
  9.     private $items;
  10.     private $current;
  11.  
  12.     private $options = array(
  13.         'separator' => '...',
  14.         'sideItemsCount' => 1,
  15.         'edgeItemsCount' => 1,
  16.         'activeClass' => 'active',
  17.         'paginationClass' => '',
  18.         'showNextPrevButtons' => false,
  19.         'renderOnePage' => false
  20.     );
  21.  
  22.     public function __construct(array $options = array())
  23.     {
  24.         $this->setOptions($options);
  25.     }
  26.  
  27.     public function __toString()
  28.     {
  29.         return '';
  30.     }
  31.  
  32.     public function last()
  33.     {
  34.         return $this->last;
  35.     }
  36.  
  37.     public function next()
  38.     {
  39.         return $this->next;
  40.     }
  41.  
  42.     public function prev()
  43.     {
  44.         return $this->prev;
  45.     }
  46.  
  47.     public function first()
  48.     {
  49.         return $this->first;
  50.     }
  51.  
  52.     public function items()
  53.     {
  54.         return $this->items;
  55.     }
  56.  
  57.     public function current()
  58.     {
  59.         return $this->current;
  60.     }
  61.  
  62.     public function paginate($current, $pages)
  63.     {
  64.         $this->current = $current;
  65.         $this->pages = $pages;
  66.         $this->last = $pages;
  67.  
  68.         $this->first = 1;
  69.         $this->prev = ($this->current > 1) ? $this->current - 1 : null;
  70.         $this->next = ($this->current) < $this->pages ? $this->current + 1 : null;
  71.  
  72.         $this->setItems();
  73.  
  74.         return $this;
  75.     }
  76.  
  77.     public function setOption(string $option, $value)
  78.     {
  79.         $this->options[$option] = $value;
  80.  
  81.         return $this;
  82.     }
  83.  
  84.     public function setOptions(array $options)
  85.     {
  86.         foreach ($this->options as $option => $value) {
  87.             $this->options[$option] = isset($options[$option]) ? $options[$option] : $this->options[$option];
  88.         }
  89.  
  90.         return $this;
  91.     }
  92.  
  93.     private function visibleEdgeItemsCount()
  94.     {
  95.         $separators = $this->options['separator'] ? 2 : 1;
  96.  
  97.         return 2 * $this->options['sideItemsCount'] + $this->options['edgeItemsCount'] + $separators;
  98.     }
  99.  
  100.     private function edgeItems()
  101.     {
  102.         $edgeItems = array();
  103.  
  104.         for ($i = 1; $i <= $this->options['edgeItemsCount']; $i++) {
  105.             $edgeItems[] = $i;
  106.         }
  107.  
  108.         for ($i = 0; $i < $this->options['edgeItemsCount']; $i++) {
  109.             $edgeItems[] = $this->last - $i;
  110.         }
  111.  
  112.         return $edgeItems;
  113.     }
  114.  
  115.     private function sideItems()
  116.     {
  117.         $sideItems = array();
  118.  
  119.         // when current page is in start edge
  120.         if ($this->current + $this->options['sideItemsCount'] <= $this->visibleEdgeItemsCount()) {
  121.             $start = $this->first;
  122.             $end = $this->visibleEdgeItemsCount();
  123.         }
  124.  
  125.         // when current page is in end edge
  126.         elseif ($this->current - $this->options['sideItemsCount'] > $this->last - $this->visibleEdgeItemsCount()) {
  127.             $start = $this->last - $this->visibleEdgeItemsCount() + 1;
  128.             $end = $this->last;
  129.         }
  130.  
  131.         else {
  132.             $start = $this->current - $this->options['sideItemsCount'];
  133.             $end = $this->current + $this->options['sideItemsCount'];
  134.         }
  135.  
  136.         for ($i = $start; $i <= $end; $i++) {
  137.             if ($i > 0 && $i <= $this->last) {
  138.                 $sideItems[] = $i;
  139.             }
  140.         }
  141.  
  142.         return $sideItems;
  143.     }
  144.  
  145.     private function setItems()
  146.     {
  147.         $visiblePages = array_unique(array_merge($this->edgeItems(), $this->sideItems()));
  148.  
  149.         $this->items = array();
  150.  
  151.         for ($page = 1; $page <= $this->pages; $page++) {
  152.  
  153.             if (in_array($page, $visiblePages)) {
  154.                 $this->items[] = $page;
  155.             }
  156.  
  157.             elseif ($page == ($this->first + $this->options['edgeItemsCount'])) {
  158.                 if ($this->options['separator']) {
  159.                     $this->items[] = $this->options['separator'];
  160.                 }
  161.             }
  162.  
  163.             elseif ($page == ($this->last - $this->options['edgeItemsCount'])) {
  164.                 if ($this->options['separator']) {
  165.                     $this->items[] = $this->options['separator'];
  166.                 }
  167.             }
  168.  
  169.         }
  170.  
  171.         return $this->items;
  172.     }
  173.  
  174.     public function checkIfPaginationIsNeeded()
  175.     {
  176.         return $this->options['renderOnePage'] || $this->last > 1;
  177.     }
  178.  
  179.     public function fresh()
  180.     {
  181.         $this->setItems();
  182.  
  183.         return $this;
  184.     }
  185.  
  186.     public function render($echo = false, $prevText = 'prev', $nextText = 'next')
  187.     {
  188.         if (!$this->checkIfPaginationIsNeeded()) {
  189.             return false;
  190.         }
  191.  
  192.         $content = '';
  193.  
  194.         if ($this->options['showNextPrevButtons'] && $this->prev) {
  195.             $content .= '<li class="pagination-prev-page"><a class="pagination-prev-link" href="?page=' . $this->prev . '">'. $prevText .'</a></li>';
  196.         }
  197.  
  198.         foreach ($this->items as $item) {
  199.  
  200.             if ($item == $this->options['separator']) {
  201.  
  202.                 $content .= '<li class="pagination-list-item pagination-separator-item"><span class="pagination-separator">' . $item . '</span></li>';
  203.  
  204.             } else {
  205.  
  206.                 $activeClass = ($this->current == $item) ? ' ' . $this->options['activeClass'] : '';
  207.                 $link = '<a class="pagination-page-link'. $activeClass .'" href="?page=' . $item . '">' . $item . "</a>";
  208.  
  209.                 $content .= '<li class="pagination-list-item">' . $link .'</li>';
  210.  
  211.             }
  212.  
  213.         }
  214.  
  215.         if ($this->options['showNextPrevButtons'] && $this->prev) {
  216.             $content .= '<li class="pagination-next-page"><a class="pagination-next-link" href="?page=' . $this->next . '">' . $nextText . '</a></li>';
  217.         }
  218.  
  219.         // $html = '<ul class="' . $this->options['paginationClass'] . '">' . $content . '</ul>';
  220.         $html = $content;
  221.  
  222.         if ($echo) {
  223.             echo $html;
  224.         }
  225.  
  226.         return $html;
  227.     }
  228. }
Add Comment
Please, Sign In to add comment