*/ /** * La classe Paginator permet de gérer la pagination de l'application facilement */ class Paginator { /** * $items tableau des éléments à afficher/gérer */ private $items = array (); /** * $nbItemsPerPage le nombre d'éléments par page */ private $nbItemsPerPage = 10; /** * $currentPage page actuelle à gérer */ private $currentPage = 1; /** * $nbPage le nombre de pages de pagination */ private $nbPage = 1; /** * $nbItems le nombre d'éléments */ private $nbItems = 0; /** * Constructeur * @param $items les éléments à gérer */ public function __construct ($items) { $this->_items ($items); $this->_nbItems (count ($this->items (true))); $this->_nbItemsPerPage ($this->nbItemsPerPage); $this->_currentPage ($this->currentPage); } /** * Permet d'afficher la pagination * @param $view nom du fichier de vue situé dans /app/views/helpers/ * @param $getteur variable de type $_GET[] permettant de retrouver la page */ public function render ($view, $getteur) { $view = APP_PATH . '/views/helpers/'.$view; if (file_exists ($view)) { include ($view); } } /** * Permet de retrouver la page d'un élément donné * @param $item l'élément à retrouver * @return la page à laquelle se trouve l'élément (false si non trouvé) */ public function pageByItem ($item) { $page = false; $i = 0; do { if ($item == $this->items[$i]) { $page = ceil (($i + 1) / $this->nbItemsPerPage); } $i++; } while (!$page && $i < $this->nbItems ()); return $page; } /** * Permet de retrouver la position d'un élément donné (à partir de 0) * @param $item l'élément à retrouver * @return la position à laquelle se trouve l'élément (false si non trouvé) */ public function positionByItem ($item) { $find = false; $i = 0; do { if ($item == $this->items[$i]) { $find = true; } else { $i++; } } while (!$find && $i < $this->nbItems ()); return $i; } /** * Permet de récupérer un item par sa position * @param $pos la position de l'élément * @return l'item situé à $pos (dernier item si $pos<0, 1er si $pos>=count($items)) */ public function itemByPosition ($pos) { if ($pos < 0) { $pos = $this->nbItems () - 1; } if ($pos >= count($this->items)) { $pos = 0; } return $this->items[$pos]; } /** * GETTEURS */ /** * @param $all si à true, retourne tous les éléments sans prendre en compte la pagination */ public function items ($all = false) { $array = array (); $nbItems = $this->nbItems (); if ($nbItems <= $this->nbItemsPerPage || $all) { $array = $this->items; } else { $begin = ($this->currentPage - 1) * $this->nbItemsPerPage; $counter = 0; $i = 0; foreach ($this->items as $key => $item) { if ($i >= $begin) { $array[$key] = $item; $counter++; } if ($counter >= $this->nbItemsPerPage) { break; } $i++; } } return $array; } public function nbItemsPerPage () { return $this->nbItemsPerPage; } public function currentPage () { return $this->currentPage; } public function nbPage () { return $this->nbPage; } public function nbItems () { return $this->nbItems; } /** * SETTEURS */ public function _items ($items) { if (is_array ($items)) { $this->items = $items; } $this->_nbPage (); } public function _nbItemsPerPage ($nbItemsPerPage) { if ($nbItemsPerPage > $this->nbItems ()) { $nbItemsPerPage = $this->nbItems (); } if ($nbItemsPerPage < 0) { $nbItemsPerPage = 0; } $this->nbItemsPerPage = $nbItemsPerPage; $this->_nbPage (); } public function _currentPage ($page) { if($page < 1 || ($page > $this->nbPage && $this->nbPage > 0)) { throw new CurrentPagePaginationException ($page); } $this->currentPage = $page; } private function _nbPage () { if ($this->nbItemsPerPage > 0) { $this->nbPage = ceil ($this->nbItems () / $this->nbItemsPerPage); } } public function _nbItems ($value) { $this->nbItems = $value; } }