protected function searchItems($itemtype, $params = array())
{
global $DEBUG_SQL;
$this->initEndpoint();
// check rights
if ($itemtype != 'AllAssets' && !$itemtype::canView()) {
return $this->messageRightError();
}
// retrieve searchoptions
$soptions = $this->listSearchOptions($itemtype);
// Check the criterias are valid
if (isset($params['criteria']) && is_array($params['criteria'])) {
foreach ($params['criteria'] as $criteria) {
if (isset($criteria['field']) && ctype_digit($criteria['field']) && !array_key_exists($criteria['field'], $soptions)) {
return $this->returnError(__("Bad field ID in search criteria"));
}
}
}
// manage forcedisplay
if (isset($params['forcedisplay'])) {
if (!is_array($params['forcedisplay'])) {
$params['forcedisplay'] = array(intval($params['forcedisplay']));
}
$params['forcedisplay'] = array_combine($params['forcedisplay'], $params['forcedisplay']);
} else {
$params['forcedisplay'] = array();
}
// transform range parameter in start and limit variables
if (isset($params['range']) > 0) {
if (preg_match("/^[0-9]+-[0-9]+\$/", $params['range'])) {
$range = explode("-", $params['range']);
$params['start'] = $range[0];
$params['list_limit'] = $range[1] - $range[0] + 1;
$params['range'] = $range;
} else {
$this->returnError("range must be in format : [start-end] with integers");
}
} else {
$params['range'] = array(0, $_SESSION['glpilist_limit']);
}
// force reset
$params['reset'] = 'reset';
// force logging sql queries
$_SESSION['glpi_use_mode'] = Session::DEBUG_MODE;
// call Core Search method
$rawdata = Search::getDatas($itemtype, $params, $params['forcedisplay']);
// probably a sql error
if (!isset($rawdata['data']) || count($rawdata['data']) === 0) {
$this->returnError("Unexpected SQL Error : " . array_splice($DEBUG_SQL['errors'], -2)[0], 500, "ERROR_SQL", false);
}
$cleaned_data = array('totalcount' => $rawdata['data']['totalcount'], 'count' => count($rawdata['data']['rows']), 'sort' => $rawdata['search']['sort'], 'order' => $rawdata['search']['order']);
if ($params['range'][0] > $cleaned_data['totalcount']) {
$this->returnError("Provided range exceed total count of data: " . $cleaned_data['totalcount'], 400, "ERROR_RANGE_EXCEED_TOTAL");
}
// fix end range
if ($params['range'][1] > $cleaned_data['totalcount'] - 1) {
$params['range'][1] = $cleaned_data['totalcount'] - 1;
}
//prepare cols (searchoptions_id) for cleaned data
$cleaned_cols = array();
foreach ($rawdata['data']['cols'] as $col) {
$cleaned_cols[] = $col['id'];
}
// prepare cols wwith uid
if (isset($params['uid_cols'])) {
$uid_cols = array();
foreach ($cleaned_cols as $col) {
$uid_cols[] = $soptions[$col]['uid'];
}
}
foreach ($rawdata['data']['rows'] as $row) {
$raw = $row['raw'];
$id = $raw['id'];
// keep row itemtype for all asset
if ($itemtype == 'AllAssets') {
$current_id = $raw['id'];
$current_itemtype = $raw['TYPE'];
}
// retrive value (and manage multiple values)
$clean_values = array();
foreach ($row as $rkey => $rvalues) {
// skip index who are not real columns (ex: raw, entities_id, etc)
if (!is_integer($rkey)) {
continue;
}
// manage multiple values (ex: IP adresses)
$current_values = array();
for ($valindex = 0; $valindex < $rvalues['count']; $valindex++) {
$current_values[] = $rvalues[$valindex]['name'];
}
if (count($current_values) == 1) {
$current_values = $current_values[0];
}
$clean_values[] = $current_values;
}
// combine cols (searchoptions_id) with values (raws data)
if (isset($params['uid_cols'])) {
$current_line = array_combine($uid_cols, $clean_values);
} else {
$current_line = array_combine($cleaned_cols, $clean_values);
}
// if all asset, provide type in returned data
if ($itemtype == 'AllAssets') {
$current_line['id'] = $current_id;
$current_line['itemtype'] = $current_itemtype;
}
// append to final array
if (isset($params['withindexes'])) {
$cleaned_data['data'][$id] = $current_line;
} else {
$cleaned_data['data'][] = $current_line;
}
}
// add rows with their html
if (isset($params['giveItems'])) {
$cleaned_data['data_html'] = array();
foreach ($rawdata['data']['rows'] as $row) {
$new_row = array();
foreach ($row as $cell_key => $cell) {
if (isset($cell['displayname'])) {
$new_row[$cell_key] = $cell['displayname'];
}
}
$new_row = array_combine($cleaned_cols, $new_row);
if (isset($params['withindexes'])) {
$cleaned_data['data_html'][$row['id']] = $new_row;
} else {
$cleaned_data['data_html'][] = $new_row;
}
}
}
if (isset($params['rawdata']) && $params['rawdata']) {
$cleaned_data['rawdata'] = $rawdata;
}
$cleaned_data['content-range'] = implode('-', $params['range']) . "/" . $cleaned_data['totalcount'];
// return data
return $cleaned_data;
}