KumbiaPHP beta2-dev
Framework PHP en español
|
00001 <?php 00023 class Paginator 00024 { 00063 public static function paginate ($model) 00064 { 00065 $params = Util::getParams(func_get_args()); 00066 $page_number = isset($params['page']) ? (int) $params['page'] : 1; 00067 $per_page = isset($params['per_page']) ? (int) $params['per_page'] : 10; 00068 //Si la página o por página es menor de 1 (0 o negativo) 00069 if ($page_number < 1 && $per_page < 1) { 00070 throw new KumbiaException("La página $page_number no existe en el páginador"); 00071 } 00072 $start = $per_page * ($page_number - 1); 00073 //Instancia del objeto contenedor de página 00074 $page = new stdClass(); 00075 //Si es un array, se hace páginacion de array 00076 if (is_array($model)) { 00077 $items = $model; 00078 $n = count($items); 00079 //si el inicio es superior o igual al conteo de elementos, 00080 //entonces la página no existe, exceptuando cuando es la página 1 00081 if ($page_number > 1 && $start >= $n) { 00082 throw new KumbiaException("La página $page_number no existe en el páginador"); 00083 } 00084 $page->items = array_slice($items, $start, $per_page); 00085 } else { 00086 //Arreglo que contiene los argumentos para el find 00087 $find_args = array(); 00088 $conditions = null; 00089 //Asignando Parámetros de busqueda 00090 if (isset($params['conditions'])) { 00091 $conditions = $params['conditions']; 00092 } elseif (isset($params[1])) { 00093 $conditions = $params[1]; 00094 } 00095 if (isset($params['columns'])) { 00096 $find_args[] = "columns: {$params['columns']}"; 00097 } 00098 if (isset($params['join'])) { 00099 $find_args[] = "join: {$params['join']}"; 00100 } 00101 if (isset($params['group'])) { 00102 $find_args[] = "group: {$params['group']}"; 00103 } 00104 if (isset($params['having'])) { 00105 $find_args[] = "having: {$params['having']}"; 00106 } 00107 if (isset($params['order'])) { 00108 $find_args[] = "order: {$params['order']}"; 00109 } 00110 if (isset($params['distinct'])) { 00111 $find_args[] = "distinct: {$params['distinct']}"; 00112 } 00113 if (isset($conditions)) { 00114 $find_args[] = $conditions; 00115 } 00116 //contar los registros 00117 $n = call_user_func_array(array($model , 'count'), $find_args); 00118 //si el inicio es superior o igual al conteo de elementos, 00119 //entonces la página no existe, exceptuando cuando es la página 1 00120 if ($page_number > 1 && $start >= $n) { 00121 throw new KumbiaException("La página $page_number no existe en el páginador"); 00122 } 00123 //Asignamos el offset y limit 00124 $find_args[] = "offset: $start"; 00125 $find_args[] = "limit: $per_page"; 00126 //Se efectua la busqueda 00127 $page->items = call_user_func_array(array($model , 'find'), $find_args); 00128 } 00129 //Se efectuan los calculos para las páginas 00130 $page->next = ($start + $per_page) < $n ? ($page_number + 1) : false; 00131 $page->prev = ($page_number > 1) ? ($page_number - 1) : false; 00132 $page->current = $page_number; 00133 $page->total = ceil($n / $per_page); 00134 $page->count = $n; 00135 $page->per_page = $per_page; 00136 return $page; 00137 } 00161 public static function paginate_by_sql ($model, $sql) 00162 { 00163 $params = Util::getParams(func_get_args()); 00164 $page_number = isset($params['page']) ? (int) $params['page'] : 1; 00165 $per_page = isset($params['per_page']) ? (int) $params['per_page'] : 10; 00166 //Si la página o por página es menor de 1 (0 o negativo) 00167 if ($page_number < 1 || $per_page < 1) { 00168 throw new KumbiaException("La página $page_number no existe en el páginador"); 00169 } 00170 $start = $per_page * ($page_number - 1); 00171 //Instancia del objeto contenedor de página 00172 $page = new stdClass(); 00173 //Cuento las apariciones atraves de una tabla derivada 00174 $n = $model->count_by_sql("SELECT COUNT(*) FROM ($sql) AS t"); 00175 //si el inicio es superior o igual al conteo de elementos, 00176 //entonces la página no existe, exceptuando cuando es la página 1 00177 if ($page_number > 1 && $start >= $n) { 00178 throw new KumbiaException("La página $page_number no existe en el páginador"); 00179 } 00180 $page->items = $model->find_all_by_sql($model->limit($sql, "offset: $start", "limit: $per_page")); 00181 //Se efectuan los calculos para las páginas 00182 $page->next = ($start + $per_page) < $n ? ($page_number + 1) : false; 00183 $page->prev = ($page_number > 1) ? ($page_number - 1) : false; 00184 $page->current = $page_number; 00185 $page->total = ceil($n / $per_page); 00186 $page->count = $n; 00187 $page->per_page = $per_page; 00188 return $page; 00189 } 00190 }