method() != 'get') { exit; } if (!c::admin()->permission()->check(['global', 'support-all', 'support-view', 'support-crud'])) { header('HTTP/1.1 401 Unauthorized'); exit; } // manual query is faster than using the Order->exports // @todo: merge this with Order::find when we get rid of old cockpit/orders $limit = $this->request()['limit'] ? c::db()->escape($this->request()['limit']) : 20; $search = $this->request()['search'] ? c::db()->escape($this->request()['search']) : ''; $page = $this->request()['page'] ? c::db()->escape($this->request()['page']) : 1; $sort = $this->request()['sort'] ? c::db()->escape($this->request()['sort']) : null; if ($sort{0} == '-') { $sort = substr($sort, 1); $sc = true; } else { $sc = false; } if ($page == 1) { $offset = '0'; } else { $offset = ($page-1) * $limit; } $q = ' SELECT -WILD- FROM `user` LEFT JOIN `order` using(id_user) WHERE 1=1 '; if ($search) { $q .= Crunchbutton_Query::search([ 'search' => stripslashes($search), 'fields' => [ 'user.name' => 'like', 'user.phone' => 'like', 'user.address' => 'like', '`order`.name' => 'like', '`order`.phone' => 'like', '`order`.address' => 'like', 'user.id_user' => 'liker' ] ]); } $q .= ' GROUP BY `user`.id_user '; // get the count $count = 0; $r = c::db()->query(str_replace('-WILD-','COUNT(*) c', $q)); while ($c = $r->fetch()) { $count++; } switch ($sort) { case 'orders': $q .= ' ORDER BY orders '.($sc ? 'ASC' : 'DESC').', `user`.id_user DESC, `order`.date ASC '; break; case 'order': $q .= ' ORDER BY _order_date '.($sc ? 'ASC' : 'DESC').', `user`.id_user DESC, `order`.date ASC '; break; case 'name': $q .= ' ORDER BY user.name '.($sc ? 'DESC' : 'ASC').', `user`.id_user DESC, `order`.date ASC '; break; case 'address': $q .= ' ORDER BY user.address '.($sc ? 'DESC' : 'ASC').', `user`.id_user DESC, `order`.date ASC '; break; case 'phone': $q .= ' ORDER BY user.phone '.($sc ? 'DESC' : 'ASC').', `user`.id_user DESC, `order`.date ASC '; break; default: $q .= ' ORDER BY `user`.id_user '.($sc ? 'DESC' : 'ASC').', `order`.date ASC '; break; } $q .= ' LIMIT '.$offset.', '.$limit.' '; // do the query $data = []; $r = c::db()->query(str_replace('-WILD-',' `user`.*, (SELECT MAX(`order`.date) FROM `order` WHERE `order`.id_user = user.id_user) as _order_date, COUNT(`order`.id_order) orders ', $q)); while ($o = $r->fetch()) { $u = new User($o); $o->image = $u->image(false); $data[] = $o; } echo json_encode([ 'count' => intval($count), 'pages' => ceil($count / $limit), 'page' => $page, 'results' => $data ]); } }