hashModeResult = $hashModeResult; } protected function addFilter($rule, $operation = 'and') { $searchField = $rule->field; $searchString = $rule->data; $method = $operation.'_where'; switch ($rule->op) { case "eq": $this->db->$method($searchField, '=', $searchString); break; case "ne": $this->db->$method($searchField, '<>', $searchString); break; case "lt": $this->db->$method($searchField, '<', $searchString); break; case "le": $this->db->$method($searchField, '<=', $searchString); break; case "gt": $this->db->$method($searchField, '>', $searchString); break; case "ge": $this->db->$method($searchField, '>=', $searchString); break; case "bw": $this->db->$method($searchField, 'LIKE', "{$searchString}%"); break; case "ew": $this->db->$method($searchField, 'LIKE', "%{$searchString}"); break; case "cn": $this->db->$method($searchField, 'LIKE', "%{$searchString}%"); break; } } /* В потомках может переопределять GET-данные. Используется в некоторых гридах (Грид с папками пользователя) */ protected function changeAjaxData() { } public function handle($userdata='') { $this->changeAjaxData(); $page = isset($_GET['page']) ? $_GET['page'] : 1; // get the requested page $limit = isset($_GET['rows']) ? $_GET['rows'] : 10; // get how many rows we want to have into the grid $sidx = isset($_GET['sidx']) ? $_GET['sidx'] : "id"; // get index row - i.e. user click to sort $sord = isset($_GET['sord']) ? $_GET['sord'] : 'desc'; // get the direction $search = isset($_GET['_search']) ? $_GET['_search'] : 'false'; $searchField = isset($_GET['searchField']) ? $_GET['searchField'] : "id"; $searchOper = isset($_GET['searchOper']) ? $_GET['searchOper'] : "eq"; $searchString = isset($_GET['searchString']) ? $_GET['searchString'] : ""; $filters = isset($_GET['filters']) ? $_GET['filters'] : NULL; // Обрабатываем поисковые параметры if ($search == 'true') { if(isset($filters)) { // Если фильтр задан через параметр filters $filters = json_decode($filters); $rules = $filters->rules; $operation = ($filters->groupOp=="AND") ? 'and' : 'or'; $this->db->and_open(); foreach($rules as $rule) { $this->addFilter($rule, $operation); } $this->db->close(); } else { $rule = array ( 'field' => $searchField, 'op' => $searchOper, 'data' => $searchString ); $this->addFilter((object) $rule); } } $responce->page = $page ; $dbCount = clone $this->db; if($this->useMainQueryCount) { // Используем подсчет строк основного запроса $responce->records = $dbCount->execute()->count(); } else { // Самостоятельно формируем запрос на подсчет общего числа строк $responce->records = $dbCount->count_records(); } if ($responce->records > 0) { $responce->total = ceil($responce->records / $limit); } else { $responce->total = 0; } $responce->userdata = $userdata; $offset = $limit * $page - $limit; $this->db->order_by($sidx, $sord); $this->db->limit($limit)->offset($offset); $this->rows = $this->db->execute()->as_array(); // Формируем данные для строк if($this->hashModeResult) { // Отдаем hash для каждой строки $i = 0; foreach ($this->rows as $row) { if(!isset($responce->rows[$i])) { $responce->rows[$i] = array(); } foreach($row as $key => $value) { $responce->rows[$i][$key] = ($value=='0.0000') ? '0' : $value; } $i++; } } else { // Отдаем массив для каждой строки $i = 0; foreach ($this->rows as $row) { if(isset($row['id'])) { $responce->rows[$i]['id'] = $row['id']; } $cells = array(); foreach($row as $cell) { $cells[] = ($cell=='0.0000') ? '0' : $cell; } $responce->rows[$i]['cell'] = $cells; $i++; } } return $responce; } }