aboutsummaryrefslogtreecommitdiff
path: root/lib/Minz/Paginator.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Minz/Paginator.php')
-rw-r--r--lib/Minz/Paginator.php196
1 files changed, 196 insertions, 0 deletions
diff --git a/lib/Minz/Paginator.php b/lib/Minz/Paginator.php
new file mode 100644
index 000000000..5858e76a5
--- /dev/null
+++ b/lib/Minz/Paginator.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * MINZ - Copyright 2011 Marien Fressinaud
+ * Sous licence AGPL3 <http://www.gnu.org/licenses/>
+*/
+
+/**
+ * La classe Paginator permet de gérer la pagination de l'application facilement
+ */
+class Minz_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;
+ }
+}