KumbiaPHP  beta2
Framework PHP
 Todo Estructuras de Datos Namespaces Archivos Funciones Variables Páginas
paginate.php
Ir a la documentación de este archivo.
1 <?php
31 class Paginator
32 {
33 
73  public static function paginate($model)
74  {
75  $params = Util::getParams(func_get_args());
76  $page_number = isset($params['page']) ? (int) $params['page'] : 1;
77  $per_page = isset($params['per_page']) ? (int) $params['per_page'] : 10;
78  //Si la página o por página es menor de 1 (0 o negativo)
79  if ($page_number < 1 && $per_page < 1) {
80  throw new KumbiaException("La página $page_number no existe en el páginador");
81  }
82  $start = $per_page * ($page_number - 1);
83  //Instancia del objeto contenedor de página
84  $page = new stdClass();
85  //Si es un array, se hace páginacion de array
86  if (is_array($model)) {
87  $items = $model;
88  $n = count($items);
89  //si el inicio es superior o igual al conteo de elementos,
90  //entonces la página no existe, exceptuando cuando es la página 1
91  if ($page_number > 1 && $start >= $n) {
92  throw new KumbiaException("La página $page_number no existe en el páginador");
93  }
94  $page->items = array_slice($items, $start, $per_page);
95  } else {
96  //Arreglo que contiene los argumentos para el find
97  $find_args = array();
98  $conditions = null;
99  //Asignando Parámetros de busqueda
100  if (isset($params['conditions'])) {
101  $conditions = $params['conditions'];
102  } elseif (isset($params[1])) {
103  $conditions = $params[1];
104  }
105  if (isset($params['columns'])) {
106  $find_args[] = "columns: {$params['columns']}";
107  }
108  if (isset($params['join'])) {
109  $find_args[] = "join: {$params['join']}";
110  }
111  if (isset($params['group'])) {
112  $find_args[] = "group: {$params['group']}";
113  }
114  if (isset($params['having'])) {
115  $find_args[] = "having: {$params['having']}";
116  }
117  if (isset($params['order'])) {
118  $find_args[] = "order: {$params['order']}";
119  }
120  if (isset($params['distinct'])) {
121  $find_args[] = "distinct: {$params['distinct']}";
122  }
123  if (isset($conditions)) {
124  $find_args[] = $conditions;
125  }
126  //contar los registros
127  $n = call_user_func_array(array($model, 'count'), $find_args);
128  //si el inicio es superior o igual al conteo de elementos,
129  //entonces la página no existe, exceptuando cuando es la página 1
130  if ($page_number > 1 && $start >= $n) {
131  throw new KumbiaException("La página $page_number no existe en el páginador");
132  }
133  //Asignamos el offset y limit
134  $find_args[] = "offset: $start";
135  $find_args[] = "limit: $per_page";
136  //Se efectua la busqueda
137  $page->items = call_user_func_array(array($model, 'find'), $find_args);
138  }
139  //Se efectuan los calculos para las páginas
140  $page->next = ($start + $per_page) < $n ? ($page_number + 1) : false;
141  $page->prev = ($page_number > 1) ? ($page_number - 1) : false;
142  $page->current = $page_number;
143  $page->total = ceil($n / $per_page);
144  $page->count = $n;
145  $page->per_page = $per_page;
146  return $page;
147  }
148 
172  public static function paginate_by_sql($model, $sql)
173  {
174  $params = Util::getParams(func_get_args());
175  $page_number = isset($params['page']) ? (int) $params['page'] : 1;
176  $per_page = isset($params['per_page']) ? (int) $params['per_page'] : 10;
177  //Si la página o por página es menor de 1 (0 o negativo)
178  if ($page_number < 1 || $per_page < 1) {
179  throw new KumbiaException("La página $page_number no existe en el páginador");
180  }
181  $start = $per_page * ($page_number - 1);
182  //Instancia del objeto contenedor de página
183  $page = new stdClass();
184  //Cuento las apariciones atraves de una tabla derivada
185  $n = $model->count_by_sql("SELECT COUNT(*) FROM ($sql) AS t");
186  //si el inicio es superior o igual al conteo de elementos,
187  //entonces la página no existe, exceptuando cuando es la página 1
188  if ($page_number > 1 && $start >= $n) {
189  throw new KumbiaException("La página $page_number no existe en el páginador");
190  }
191  $page->items = $model->find_all_by_sql($model->limit($sql, "offset: $start", "limit: $per_page"));
192  //Se efectuan los calculos para las páginas
193  $page->next = ($start + $per_page) < $n ? ($page_number + 1) : false;
194  $page->prev = ($page_number > 1) ? ($page_number - 1) : false;
195  $page->current = $page_number;
196  $page->total = ceil($n / $per_page);
197  $page->count = $n;
198  $page->per_page = $per_page;
199  return $page;
200  }
201 
202 }