00001 <?php
00060 class Paginator {
00061
00062 public static function paginate() {
00063 $params = Util::getParams(func_get_args());
00064
00065 $page_number = isset($params['page']) ? $params['page'] : 1;
00066 $per_page = isset($params['per_page']) ? $params['per_page'] : 10;
00067 $start = $per_page*($page_number-1);
00068
00072 $page = new stdClass();
00073
00077 if(is_array($params[0])) {
00078 $items = $params[0];
00079 $n = count($items);
00080 $page->items = array_slice($items, $start, $per_page);
00081 } else {
00082
00086 if(is_string($params[0])) {
00087 $m = Util::camelcase($params[0]);
00088 $model = ActiveRecord::get($m);
00089 } else {
00090 $model = $params[0];
00091 }
00092
00096 $find_args = array();
00097 $conditions = null;
00101 if(isset($params['conditions'])) {
00102 $conditions = $params['conditions'];
00103 }elseif(isset($params[1])) {
00104 $conditions = $params[1];
00105 }
00106
00107 if(isset($params['columns'])) {
00108 array_push($find_args, "columns: {$params['columns']}");
00109 }
00110 if(isset($params['join'])) {
00111 array_push($find_args, "join: {$params['join']}");
00112 }
00113 if(isset($params['group'])) {
00114 array_push($find_args, "group: {$params['group']}");
00115 }
00116 if(isset($params['having'])) {
00117 array_push($find_args, "having: {$params['having']}");
00118 }
00119 if(isset($params['order'])) {
00120 array_push($find_args, "order: {$params['order']}");
00121 }
00122 if(isset($params['distinct'])) {
00123 array_push($find_args, "distinct: {$params['distinct']}");
00124 }
00125 if(isset($conditions)) {
00126 array_push($find_args, $conditions);
00127 }
00128
00132
00133 $n = call_user_func_array(array($model, 'count'), $conditions);
00134
00138 array_push($find_args, "offset: $start");
00139 array_push($find_args, "limit: $per_page");
00140
00144 $page->items = call_user_func_array(array($model, 'find'), $find_args);
00145 }
00146
00150 $page->next = ($start + $per_page)<$n ? ($page_number+1) : false ;
00151 $page->prev = ($page_number>1) ? ($page_number-1) : false ;
00152 $page->current = $page_number;
00153 $page->total = ($n % $per_page) ? ((int)($n/$per_page) + 1):($n/$per_page);
00154 $page->count = $n;
00155
00156 return $page;
00157 }
00158
00182 public static function paginate_by_sql($model, $sql) {
00183 $params = Util::getParams(func_get_args());
00184
00185 $page_number = isset($params['page']) ? $params['page'] : 1;
00186 $per_page = isset($params['per_page']) ? $params['per_page'] : 10;
00187 $start = $per_page*($page_number-1);
00188
00192 if(is_string($params[0])) {
00193 $m = Util::camelcase($params[0]);
00194 $model = ActiveRecord::get($m);
00195 }
00196
00200 $page = new stdClass();
00201
00205 $n = $model->count_by_sql("SELECT COUNT(*) FROM ($sql) AS t");
00206 $page->items = $model->find_all_by_sql($model->limit($sql, "offset: $start", "limit: $per_page"));
00207
00211 $page->next = ($start + $per_page)<$n ? ($page_number+1) : false ;
00212 $page->prev = ($page_number>1) ? ($page_number-1) : false ;
00213 $page->current = $page_number;
00214 $page->total = ($n % $per_page) ? ((int)($n/$per_page) + 1):($n/$per_page);
00215 $page->count = $n;
00216
00217 return $page;
00218 }
00219 }