getReadConnection() static public method

Get Connection to slave, if exists, and if configured to be used for read only request
static public getReadConnection ( ) : DBmysql
return DBmysql object
 function constructSQL($itemtype, $params, $items_id_check = 0)
 {
     global $CFG_GLPI;
     // Instanciate an object to access method
     $item = NULL;
     if ($itemtype != 'States' && class_exists($itemtype)) {
         $item = new $itemtype();
     }
     // Default values of parameters
     $p = array();
     $p['link'] = array();
     //
     $p['field'] = array();
     //
     $p['contains'] = array();
     //
     $p['searchtype'] = array();
     //
     $p['sort'] = '1';
     //
     $p['order'] = 'ASC';
     //
     $p['start'] = 0;
     //
     $p['is_deleted'] = 0;
     $p['export_all'] = 0;
     $p['link2'] = '';
     //
     $p['contains2'] = '';
     //
     $p['field2'] = '';
     //
     $p['itemtype2'] = '';
     $p['searchtype2'] = '';
     foreach ($params as $key => $val) {
         $p[$key] = $val;
     }
     if ($p['export_all']) {
         $p['start'] = 0;
     }
     // Manage defautll seachtype value : for bookmark compatibility
     if (count($p['contains'])) {
         foreach ($p['contains'] as $key => $val) {
             if (!isset($p['searchtype'][$key])) {
                 $p['searchtype'][$key] = 'contains';
             }
         }
     }
     if (is_array($p['contains2']) && count($p['contains2'])) {
         foreach ($p['contains2'] as $key => $val) {
             if (!isset($p['searchtype2'][$key])) {
                 $p['searchtype2'][$key] = 'contains';
             }
         }
     }
     //      $target = Toolbox::getItemTypeSearchURL($itemtype);
     $limitsearchopt = Search::getCleanedOptions($itemtype);
     if (isset($CFG_GLPI['union_search_type'][$itemtype])) {
         $itemtable = $CFG_GLPI['union_search_type'][$itemtype];
     } else {
         $itemtable = getTableForItemType($itemtype);
     }
     $LIST_LIMIT = $_SESSION['glpilist_limit'];
     // Set display type for export if define
     $output_type = Search::HTML_OUTPUT;
     if (isset($_GET['display_type'])) {
         $output_type = $_GET['display_type'];
         // Limit to 10 element
         if ($_GET['display_type'] == GLOBAL_SEARCH) {
             $LIST_LIMIT = GLOBAL_SEARCH_DISPLAY_COUNT;
         }
     }
     // hack for States
     if (isset($CFG_GLPI['union_search_type'][$itemtype])) {
         $entity_restrict = true;
     } else {
         $entity_restrict = $item->isEntityAssign();
     }
     //      $metanames = array();
     // Get the items to display
     //      $toview = Search::addDefaultToView($itemtype);
     //      // Add items to display depending of personal prefs
     //      $displaypref = DisplayPreference::getForTypeUser($itemtype, Session::getLoginUserID());
     //      if (count($displaypref)) {
     //         foreach ($displaypref as $val) {
     //            array_push($toview,$val);
     //         }
     //      }
     /* =========== Add for plugin Monitoring ============ */
     $toview = array();
     array_push($toview, 1);
     // Add searched items
     if (count($p['field']) > 0) {
         foreach ($p['field'] as $key => $val) {
             if (!in_array($val, $toview) && $val != 'all' && $val != 'view') {
                 array_push($toview, $val);
             }
         }
     }
     // Add order item
     if (!in_array($p['sort'], $toview)) {
         array_push($toview, $p['sort']);
     }
     //      // Special case for Ticket : put ID in front
     //      if ($itemtype=='Ticket') {
     //         array_unshift($toview, 2);
     //      }
     // Clean toview array
     $toview = array_unique($toview);
     foreach ($toview as $key => $val) {
         if (!isset($limitsearchopt[$val])) {
             unset($toview[$key]);
         }
     }
     //      $toview_count = count($toview);
     // Construct the request
     //// 1 - SELECT
     // request currentuser for SQL supervision, not displayed
     $SELECT = "SELECT " . Search::addDefaultSelect($itemtype);
     // Add select for all toview item
     foreach ($toview as $key => $val) {
         $SELECT .= Search::addSelect($itemtype, $val, $key, 0);
     }
     //// 2 - FROM AND LEFT JOIN
     // Set reference table
     $FROM = " FROM `{$itemtable}`";
     // Init already linked tables array in order not to link a table several times
     $already_link_tables = array();
     // Put reference table
     array_push($already_link_tables, $itemtable);
     // Add default join
     $COMMONLEFTJOIN = Search::addDefaultJoin($itemtype, $itemtable, $already_link_tables);
     $FROM .= $COMMONLEFTJOIN;
     $searchopt = array();
     $searchopt[$itemtype] =& Search::getOptions($itemtype);
     // Add all table for toview items
     foreach ($toview as $key => $val) {
         $FROM .= Search::addLeftJoin($itemtype, $itemtable, $already_link_tables, $searchopt[$itemtype][$val]["table"], $searchopt[$itemtype][$val]["linkfield"], 0, 0, $searchopt[$itemtype][$val]["joinparams"]);
     }
     // Search all case :
     if (in_array("all", $p['field'])) {
         foreach ($searchopt[$itemtype] as $key => $val) {
             // Do not search on Group Name
             if (is_array($val)) {
                 $FROM .= Search::addLeftJoin($itemtype, $itemtable, $already_link_tables, $searchopt[$itemtype][$key]["table"], $searchopt[$itemtype][$key]["linkfield"], 0, 0, $searchopt[$itemtype][$key]["joinparams"]);
             }
         }
     }
     //// 3 - WHERE
     // default string
     $COMMONWHERE = Search::addDefaultWhere($itemtype);
     $first = empty($COMMONWHERE);
     // Add deleted if item have it
     if ($item && $item->maybeDeleted()) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         $COMMONWHERE .= $LINK . "`{$itemtable}`.`is_deleted` = '" . $p['is_deleted'] . "' ";
     }
     // Remove template items
     if ($item && $item->maybeTemplate()) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         $COMMONWHERE .= $LINK . "`{$itemtable}`.`is_template` = '0' ";
     }
     // Add Restrict to current entities
     if ($entity_restrict) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         if ($itemtype == 'Entity') {
             $COMMONWHERE .= getEntitiesRestrictRequest($LINK, $itemtable, 'id', '', true);
         } else {
             if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
                 // Will be replace below in Union/Recursivity Hack
                 $COMMONWHERE .= $LINK . " ENTITYRESTRICT ";
             } else {
                 $COMMONWHERE .= getEntitiesRestrictRequest($LINK, $itemtable, '', '', $item->maybeRecursive());
             }
         }
     }
     $WHERE = "";
     $HAVING = "";
     // Add search conditions
     // If there is search items
     if ($_SESSION["glpisearchcount"][$itemtype] > 0 && count($p['contains']) > 0) {
         for ($key = 0; $key < $_SESSION["glpisearchcount"][$itemtype]; $key++) {
             // if real search (strlen >0) and not all and view search
             if (isset($p['contains'][$key]) && strlen($p['contains'][$key]) > 0) {
                 // common search
                 if ($p['field'][$key] != "all" && $p['field'][$key] != "view") {
                     $LINK = " ";
                     $NOT = 0;
                     $tmplink = "";
                     if (is_array($p['link']) && isset($p['link'][$key])) {
                         if (strstr($p['link'][$key], "NOT")) {
                             $tmplink = " " . str_replace(" NOT", "", $p['link'][$key]);
                             $NOT = 1;
                         } else {
                             $tmplink = " " . $p['link'][$key];
                         }
                     } else {
                         $tmplink = " AND ";
                     }
                     if (isset($searchopt[$itemtype][$p['field'][$key]]["usehaving"])) {
                         // Manage Link if not first item
                         if (!empty($HAVING)) {
                             $LINK = $tmplink;
                         }
                         // Find key
                         $item_num = array_search($p['field'][$key], $toview);
                         $HAVING .= Search::addHaving($LINK, $NOT, $itemtype, $p['field'][$key], $p['searchtype'][$key], $p['contains'][$key], 0, $item_num);
                     } else {
                         // Manage Link if not first item
                         if (!empty($WHERE)) {
                             $LINK = $tmplink;
                         }
                         $WHERE .= Search::addWhere($LINK, $NOT, $itemtype, $p['field'][$key], $p['searchtype'][$key], $p['contains'][$key]);
                     }
                     // view and all search
                 } else {
                     $LINK = " OR ";
                     $NOT = 0;
                     $globallink = " AND ";
                     if (is_array($p['link']) && isset($p['link'][$key])) {
                         switch ($p['link'][$key]) {
                             case "AND":
                                 $LINK = " OR ";
                                 $globallink = " AND ";
                                 break;
                             case "AND NOT":
                                 $LINK = " AND ";
                                 $NOT = 1;
                                 $globallink = " AND ";
                                 break;
                             case "OR":
                                 $LINK = " OR ";
                                 $globallink = " OR ";
                                 break;
                             case "OR NOT":
                                 $LINK = " AND ";
                                 $NOT = 1;
                                 $globallink = " OR ";
                                 break;
                         }
                     } else {
                         $tmplink = "  AND ";
                     }
                     // Manage Link if not first item
                     if (!empty($WHERE)) {
                         $WHERE .= $globallink;
                     }
                     $WHERE .= " ( ";
                     $first2 = true;
                     $items = array();
                     if ($p['field'][$key] == "all") {
                         $items = $searchopt[$itemtype];
                     } else {
                         // toview case : populate toview
                         foreach ($toview as $key2 => $val2) {
                             $items[$val2] = $searchopt[$itemtype][$val2];
                         }
                     }
                     foreach ($items as $key2 => $val2) {
                         if (is_array($val2)) {
                             // Add Where clause if not to be done in HAVING CLAUSE
                             if (!isset($val2["usehaving"])) {
                                 $tmplink = $LINK;
                                 if ($first2) {
                                     $tmplink = " ";
                                     $first2 = false;
                                 }
                                 $WHERE .= Search::addWhere($tmplink, $NOT, $itemtype, $key2, $p['searchtype'][$key], $p['contains'][$key]);
                             }
                         }
                     }
                     $WHERE .= " ) ";
                 }
             }
         }
     }
     //// 4 - ORDER
     $ORDER = " ORDER BY `id` ";
     foreach ($toview as $key => $val) {
         if ($p['sort'] == $val) {
             $ORDER = Search::addOrderBy($itemtype, $p['sort'], $p['order'], $key);
         }
     }
     //// 5 - META SEARCH
     // Preprocessing
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
         // a - SELECT
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 $SELECT .= Search::addSelect($p['itemtype2'][$i], $p['field2'][$i], $i, 1, $p['itemtype2'][$i]);
             }
         }
         // b - ADD LEFT JOIN
         // Already link meta table in order not to linked a table several times
         $already_link_tables2 = array();
         // Link reference tables
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 if (!in_array(getTableForItemType($p['itemtype2'][$i]), $already_link_tables2)) {
                     $FROM .= Search::addMetaLeftJoin($itemtype, $p['itemtype2'][$i], $already_link_tables2, $p['contains2'][$i] == "NULL" || strstr($p['link2'][$i], "NOT"));
                 }
             }
         }
         // Link items tables
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 if (!isset($searchopt[$p['itemtype2'][$i]])) {
                     $searchopt[$p['itemtype2'][$i]] =& Search::getOptions($p['itemtype2'][$i]);
                 }
                 if (!in_array($searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["table"] . "_" . $p['itemtype2'][$i], $already_link_tables2)) {
                     $FROM .= Search::addLeftJoin($p['itemtype2'][$i], getTableForItemType($p['itemtype2'][$i]), $already_link_tables2, $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["table"], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["linkfield"], 1, $p['itemtype2'][$i], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["joinparams"]);
                 }
             }
         }
     }
     //// 6 - Add item ID
     // Add ID to the select
     if (!empty($itemtable)) {
         $SELECT .= "`{$itemtable}`.`id` AS id ";
     }
     //// 7 - Manage GROUP BY
     $GROUPBY = "";
     // Meta Search / Search All / Count tickets
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0 || !empty($HAVING) || in_array('all', $p['field'])) {
         $GROUPBY = " GROUP BY `{$itemtable}`.`id`";
     }
     if (empty($GROUPBY)) {
         foreach ($toview as $key2 => $val2) {
             if (!empty($GROUPBY)) {
                 break;
             }
             if (isset($searchopt[$itemtype][$val2]["forcegroupby"])) {
                 $GROUPBY = " GROUP BY `{$itemtable}`.`id`";
             }
         }
     }
     // Specific search for others item linked  (META search)
     if (is_array($p['itemtype2'])) {
         for ($key = 0; $key < $_SESSION["glpisearchcount2"][$itemtype]; $key++) {
             if (isset($p['itemtype2'][$key]) && !empty($p['itemtype2'][$key]) && isset($p['contains2'][$key]) && strlen($p['contains2'][$key]) > 0) {
                 $LINK = "";
                 // For AND NOT statement need to take into account all the group by items
                 if (strstr($p['link2'][$key], "AND NOT") || isset($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["usehaving"])) {
                     $NOT = 0;
                     if (strstr($p['link2'][$key], "NOT")) {
                         $tmplink = " " . str_replace(" NOT", "", $p['link2'][$key]);
                         $NOT = 1;
                     } else {
                         $tmplink = " " . $p['link2'][$key];
                     }
                     if (!empty($HAVING)) {
                         $LINK = $tmplink;
                     }
                     $HAVING .= Search::addHaving($LINK, $NOT, $p['itemtype2'][$key], $p['field2'][$key], $p['searchtype2'][$key], $p['contains2'][$key], 1, $key);
                 } else {
                     // Meta Where Search
                     $LINK = " ";
                     $NOT = 0;
                     // Manage Link if not first item
                     if (is_array($p['link2']) && isset($p['link2'][$key]) && strstr($p['link2'][$key], "NOT")) {
                         $tmplink = " " . str_replace(" NOT", "", $p['link2'][$key]);
                         $NOT = 1;
                     } else {
                         if (is_array($p['link2']) && isset($p['link2'][$key])) {
                             $tmplink = " " . $p['link2'][$key];
                         } else {
                             $tmplink = " AND ";
                         }
                     }
                     if (!empty($WHERE)) {
                         $LINK = $tmplink;
                     }
                     $WHERE .= Search::addWhere($LINK, $NOT, $p['itemtype2'][$key], $p['field2'][$key], $p['searchtype2'][$key], $p['contains2'][$key], 1);
                 }
             }
         }
     }
     // Use a ReadOnly connection if available and configured to be used
     $DBread = DBConnection::getReadConnection();
     // If no research limit research to display item and compute number of item using simple request
     $nosearch = true;
     for ($i = 0; $i < $_SESSION["glpisearchcount"][$itemtype]; $i++) {
         if (isset($p['contains'][$i]) && strlen($p['contains'][$i]) > 0) {
             $nosearch = false;
         }
     }
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0) {
         $nosearch = false;
     }
     $LIMIT = "";
     $numrows = 0;
     //No search : count number of items using a simple count(ID) request and LIMIT search
     if ($nosearch) {
         $LIMIT = " LIMIT " . $p['start'] . ", " . $LIST_LIMIT;
         // Force group by for all the type -> need to count only on table ID
         if (!isset($searchopt[$itemtype][1]['forcegroupby'])) {
             $count = "count(*)";
         } else {
             $count = "count(DISTINCT `{$itemtable}`.`id`)";
         }
         // request currentuser for SQL supervision, not displayed
         $query_num = "SELECT {$count}\n                       FROM `{$itemtable}`" . $COMMONLEFTJOIN;
         $first = true;
         if (!empty($COMMONWHERE)) {
             $LINK = " AND ";
             if ($first) {
                 $LINK = " WHERE ";
                 $first = false;
             }
             $query_num .= $LINK . $COMMONWHERE;
         }
         // Union Search :
         if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
             $tmpquery = $query_num;
             $numrows = 0;
             foreach ($CFG_GLPI[$CFG_GLPI["union_search_type"][$itemtype]] as $ctype) {
                 $ctable = getTableForItemType($ctype);
                 $citem = new $ctype();
                 if ($citem->canView()) {
                     // State case
                     if ($itemtype == 'States') {
                         $query_num = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                         $query_num .= " AND {$ctable}.`states_id` > '0' ";
                         // Add deleted if item have it
                         if ($citem && $citem->maybeDeleted()) {
                             $query_num .= " AND `{$ctable}`.`is_deleted` = '0' ";
                         }
                         // Remove template items
                         if ($citem && $citem->maybeTemplate()) {
                             $query_num .= " AND `{$ctable}`.`is_template` = '0' ";
                         }
                     } else {
                         // Ref table case
                         $reftable = getTableForItemType($itemtype);
                         $replace = "FROM `{$reftable}`\n                                  INNER JOIN `{$ctable}`\n                                       ON (`{$reftable}`.`items_id` =`{$ctable}`.`id`\n                                           AND `{$reftable}`.`itemtype` = '{$ctype}')";
                         $query_num = str_replace("FROM `" . $CFG_GLPI["union_search_type"][$itemtype] . "`", $replace, $tmpquery);
                         $query_num = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $query_num);
                     }
                     $query_num = str_replace("ENTITYRESTRICT", getEntitiesRestrictRequest('', $ctable, '', '', $citem->maybeRecursive()), $query_num);
                     $result_num = $DBread->query($query_num);
                     $numrows += $DBread->result($result_num, 0, 0);
                 }
             }
         } else {
             $result_num = $DBread->query($query_num);
             $numrows = $DBread->result($result_num, 0, 0);
         }
     }
     // If export_all reset LIMIT condition
     if ($p['export_all']) {
         $LIMIT = "";
     }
     if (!empty($WHERE) || !empty($COMMONWHERE)) {
         if (!empty($COMMONWHERE)) {
             $WHERE = ' WHERE ' . $COMMONWHERE . (!empty($WHERE) ? ' AND ( ' . $WHERE . ' )' : '');
         } else {
             $WHERE = ' WHERE ' . $WHERE . ' ';
         }
         $first = false;
     }
     if (!empty($HAVING)) {
         $HAVING = ' HAVING ' . $HAVING;
     }
     /* =========== Add for plugin Monitoring ============ */
     if ($items_id_check > 0) {
         if ($itemtype == "PluginMonitoringNetworkport") {
             if ($WHERE == '') {
                 $WHERE .= " WHERE `" . getTableForItemType($itemtype) . "`.`networkports_id`='" . $items_id_check . "' ";
             } else {
                 $WHERE .= " AND `" . getTableForItemType($itemtype) . "`.`networkports_id`='" . $items_id_check . "' ";
             }
         } else {
             $WHERE .= " AND `" . getTableForItemType($itemtype) . "`.`id`='" . $items_id_check . "' ";
         }
     }
     // Create QUERY
     if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
         $first = true;
         $QUERY = "";
         foreach ($CFG_GLPI[$CFG_GLPI["union_search_type"][$itemtype]] as $ctype) {
             $ctable = getTableForItemType($ctype);
             $citem = new $ctype();
             if ($citem->canView()) {
                 if ($first) {
                     $first = false;
                 } else {
                     $QUERY .= " UNION ";
                 }
                 $tmpquery = "";
                 // State case
                 if ($itemtype == 'States') {
                     $tmpquery = $SELECT . ", '{$ctype}' AS TYPE " . $FROM . $WHERE;
                     $tmpquery = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                     $tmpquery .= " AND `{$ctable}`.`states_id` > '0' ";
                     // Add deleted if item have it
                     if ($citem && $citem->maybeDeleted()) {
                         $tmpquery .= " AND `{$ctable}`.`is_deleted` = '0' ";
                     }
                     // Remove template items
                     if ($citem && $citem->maybeTemplate()) {
                         $tmpquery .= " AND `{$ctable}`.`is_template` = '0' ";
                     }
                 } else {
                     // Ref table case
                     $reftable = getTableForItemType($itemtype);
                     $tmpquery = $SELECT . ", '{$ctype}' AS TYPE,\n                                      `{$reftable}`.`id` AS refID, " . "\n                                      `{$ctable}`.`entities_id` AS ENTITY " . $FROM . $WHERE;
                     $replace = "FROM `{$reftable}`" . "\n                              INNER JOIN `{$ctable}`" . "\n                                 ON (`{$reftable}`.`items_id`=`{$ctable}`.`id`" . "\n                                     AND `{$reftable}`.`itemtype` = '{$ctype}')";
                     $tmpquery = str_replace("FROM `" . $CFG_GLPI["union_search_type"][$itemtype] . "`", $replace, $tmpquery);
                     $tmpquery = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                 }
                 $tmpquery = str_replace("ENTITYRESTRICT", getEntitiesRestrictRequest('', $ctable, '', '', $citem->maybeRecursive()), $tmpquery);
                 // SOFTWARE HACK
                 if ($ctype == 'Software') {
                     $tmpquery = str_replace("glpi_softwares.serial", "''", $tmpquery);
                     $tmpquery = str_replace("glpi_softwares.otherserial", "''", $tmpquery);
                 }
                 $QUERY .= $tmpquery;
             }
         }
         if (empty($QUERY)) {
             echo Search::showError($output_type);
             return;
         }
         $QUERY .= str_replace($CFG_GLPI["union_search_type"][$itemtype] . ".", "", $ORDER) . $LIMIT;
     } else {
         $QUERY = $SELECT . $FROM . $WHERE . $GROUPBY . $HAVING . $ORDER . $LIMIT;
     }
     $DBread->query("SET SESSION group_concat_max_len = 4096;");
     $result = $DBread->query($QUERY);
     /// Check group concat limit : if warning : increase limit
     if ($result2 = $DBread->query('SHOW WARNINGS')) {
         if ($DBread->numrows($result2) > 0) {
             $data = $DBread->fetch_assoc($result2);
             if ($data['Code'] == 1260) {
                 $DBread->query("SET SESSION group_concat_max_len = 4194304;");
                 $result = $DBread->query($QUERY);
             }
         }
     }
     // Get it from database and DISPLAY
     if ($result) {
         return $result;
     } else {
         return false;
     }
 }
Exemplo n.º 2
0
 /**
  * Retrieve datas from DB : construct data array containing columns definitions and rows datas
  *
  * add to data array a field data containing :
  *      cols : columns definition
  *      rows : rows data
  *
  * @since version 0.85
  *
  * @param $data array of search datas prepared to get datas
  *
  * @return nothing
  **/
 static function constructDatas(array &$data)
 {
     global $CFG_GLPI;
     if (!isset($data['sql']) || !isset($data['sql']['search'])) {
         return false;
     }
     $data['data'] = array();
     // Use a ReadOnly connection if available and configured to be used
     $DBread = DBConnection::getReadConnection();
     $DBread->query("SET SESSION group_concat_max_len = 16384;");
     // directly increase group_concat_max_len to avoid double query
     if (count($data['search']['metacriteria'])) {
         foreach ($data['search']['metacriteria'] as $metacriterion) {
             if ($metacriterion['link'] == 'AND NOT' || $metacriterion['link'] == 'OR NOT') {
                 $DBread->query("SET SESSION group_concat_max_len = 4194304;");
                 break;
             }
         }
     }
     $result = $DBread->query($data['sql']['search']);
     /// Check group concat limit : if warning : increase limit
     if ($result2 = $DBread->query('SHOW WARNINGS')) {
         if ($DBread->numrows($result2) > 0) {
             $res = $DBread->fetch_assoc($result2);
             if ($res['Code'] == 1260) {
                 $DBread->query("SET SESSION group_concat_max_len = 8194304;");
                 $result = $DBread->query($data['sql']['search']);
             }
         }
     }
     if ($result) {
         $data['data']['totalcount'] = 0;
         // if real search or complete export : get numrows from request
         if (!$data['search']['no_search'] || $data['search']['export_all']) {
             $data['data']['totalcount'] = $DBread->numrows($result);
         } else {
             if (!isset($data['sql']['count']) || count($data['sql']['count']) == 0) {
                 $data['data']['totalcount'] = $DBread->numrows($result);
             } else {
                 foreach ($data['sql']['count'] as $sqlcount) {
                     $result_num = $DBread->query($sqlcount);
                     $data['data']['totalcount'] += $DBread->result($result_num, 0, 0);
                 }
             }
         }
         // Search case
         $data['data']['begin'] = $data['search']['start'];
         $data['data']['end'] = min($data['data']['totalcount'], $data['search']['start'] + $data['search']['list_limit']) - 1;
         // No search Case
         if ($data['search']['no_search']) {
             $data['data']['begin'] = 0;
             $data['data']['end'] = min($data['data']['totalcount'] - $data['search']['start'], $data['search']['list_limit']) - 1;
         }
         // Export All case
         if ($data['search']['export_all']) {
             $data['data']['begin'] = 0;
             $data['data']['end'] = $data['data']['totalcount'] - 1;
         }
         // Get columns
         $data['data']['cols'] = array();
         $num = 0;
         $searchopt =& self::getOptions($data['itemtype']);
         foreach ($data['toview'] as $key => $val) {
             $data['data']['cols'][$num] = array();
             $data['data']['cols'][$num]['itemtype'] = $data['itemtype'];
             $data['data']['cols'][$num]['id'] = $val;
             $data['data']['cols'][$num]['name'] = $searchopt[$val]["name"];
             $data['data']['cols'][$num]['meta'] = 0;
             $data['data']['cols'][$num]['searchopt'] = $searchopt[$val];
             $num++;
         }
         // Display columns Headers for meta items
         $already_printed = array();
         if (count($data['search']['metacriteria'])) {
             foreach ($data['search']['metacriteria'] as $metacriteria) {
                 if (isset($metacriteria['itemtype']) && !empty($metacriteria['itemtype']) && isset($metacriteria['value']) && strlen($metacriteria['value']) > 0) {
                     if (!isset($already_printed[$metacriteria['itemtype'] . $metacriteria['field']])) {
                         $searchopt =& self::getOptions($metacriteria['itemtype']);
                         $data['data']['cols'][$num]['itemtype'] = $metacriteria['itemtype'];
                         $data['data']['cols'][$num]['id'] = $metacriteria['field'];
                         $data['data']['cols'][$num]['name'] = $searchopt[$metacriteria['field']]["name"];
                         $data['data']['cols'][$num]['meta'] = 1;
                         $data['data']['cols'][$num]['searchopt'] = $searchopt[$metacriteria['field']];
                         $num++;
                         $already_printed[$metacriteria['itemtype'] . $metacriteria['field']] = 1;
                     }
                 }
             }
         }
         // search group (corresponding of dropdown optgroup) of current col
         foreach ($data['data']['cols'] as $num => $col) {
             // search current col in searchoptions ()
             while (key($searchopt) !== null && key($searchopt) != $col['id']) {
                 next($searchopt);
             }
             if (key($searchopt) !== null) {
                 //search optgroup (non array option)
                 while (key($searchopt) !== null && is_numeric(key($searchopt)) && is_array(current($searchopt))) {
                     prev($searchopt);
                 }
                 if (key($searchopt) !== null && key($searchopt) !== "common") {
                     $data['data']['cols'][$num]['groupname'] = current($searchopt);
                 }
             }
             //reset
             reset($searchopt);
         }
         // Get rows
         // if real search seek to begin of items to display (because of complete search)
         if (!$data['search']['no_search']) {
             $DBread->data_seek($result, $data['search']['start']);
         }
         $i = $data['data']['begin'];
         $data['data']['warning'] = "For compatibility keep raw data  (ITEM_X, META_X) at the top for the moment. Will be drop in next version";
         $data['data']['rows'] = array();
         $data['data']['items'] = array();
         self::$output_type = $data['display_type'];
         while ($i < $data['data']['totalcount'] && $i <= $data['data']['end']) {
             $row = $DBread->fetch_assoc($result);
             $newrow = array();
             $newrow['raw'] = $row;
             // Parse datas
             foreach ($newrow['raw'] as $key => $val) {
                 // For compatibility keep data at the top for the moment
                 //                $newrow[$key] = $val;
                 $keysplit = explode('_', $key);
                 if (isset($keysplit[1]) && $keysplit[0] == 'ITEM') {
                     $j = $keysplit[1];
                     $fieldname = 'name';
                     if (isset($keysplit[2])) {
                         $fieldname = $keysplit[2];
                         $fkey = 3;
                         while (isset($keysplit[$fkey])) {
                             $fieldname .= '_' . $keysplit[$fkey];
                             $fkey++;
                         }
                     }
                     // No Group_concat case
                     if (strpos($val, self::LONGSEP) === false) {
                         $newrow[$j]['count'] = 1;
                         if (strpos($val, self::SHORTSEP) === false) {
                             if ($val == self::NULLVALUE) {
                                 $newrow[$j][0][$fieldname] = NULL;
                             } else {
                                 $newrow[$j][0][$fieldname] = $val;
                             }
                         } else {
                             $split2 = self::explodeWithID(self::SHORTSEP, $val);
                             $newrow[$j][0][$fieldname] = $split2[0];
                             $newrow[$j][0]['id'] = $split2[1];
                         }
                     } else {
                         if (!isset($newrow[$j])) {
                             $newrow[$j] = array();
                         }
                         $split = explode(self::LONGSEP, $val);
                         $newrow[$j]['count'] = count($split);
                         foreach ($split as $key2 => $val2) {
                             if (strpos($val2, self::SHORTSEP) === false) {
                                 $newrow[$j][$key2][$fieldname] = $val2;
                             } else {
                                 $split2 = self::explodeWithID(self::SHORTSEP, $val2);
                                 $newrow[$j][$key2]['id'] = $split2[1];
                                 if ($split2[0] == self::NULLVALUE) {
                                     $newrow[$j][$key2][$fieldname] = NULL;
                                 } else {
                                     $newrow[$j][$key2][$fieldname] = $split2[0];
                                 }
                             }
                         }
                     }
                 } else {
                     if ($key == 'currentuser') {
                         if (!isset($data['data']['currentuser'])) {
                             $data['data']['currentuser'] = $val;
                         }
                     } else {
                         $newrow[$key] = $val;
                         // Add id to items list
                         if ($key == 'id') {
                             $data['data']['items'][$val] = $i;
                         }
                     }
                 }
             }
             foreach ($data['data']['cols'] as $key => $val) {
                 $newrow[$key]['displayname'] = self::giveItem($val['itemtype'], $val['id'], $newrow, $key);
             }
             $data['data']['rows'][$i] = $newrow;
             $i++;
         }
         $data['data']['count'] = count($data['data']['rows']);
     } else {
         echo $DBread->error();
     }
 }
Exemplo n.º 3
0
 if ($col) {
     echo "<th>{$col}</th>";
 }
 echo "<th>" . __('Last inventory date', 'reports') . "</th>";
 if ($canedit) {
     echo "<th>&nbsp;</th>";
 }
 echo "<th class='blue'>" . __('ID') . "</th>" . "<th class='blue'>" . __('Name') . "</th>" . "<th class='blue'>" . __('Manufacturer') . "</th>" . "<th class='blue'>" . __('Inventory number') . "</th>" . "<th class='blue'>" . __('Serial number') . "</th>" . "<th class='blue'>" . __('Inventory number') . "</th>";
 if ($col) {
     echo "<th class='blue'>{$col}</th>";
 }
 echo "<th class='blue'>" . __('Last inventory date', 'reports') . "</th>";
 echo "</tr>\n";
 if (method_exists('DBConnection', 'getReadConnection')) {
     // In 0.80
     $DBread = DBConnection::getReadConnection();
 } else {
     $DBread = $DB;
 }
 $comp = new Computer();
 $result = $DBread->query($Sql);
 for ($prev = -1, $i = 0; $data = $DBread->fetch_array($result); $i++) {
     if ($prev != $data["entity"]) {
         $prev = $data["entity"];
         echo "<tr class='tab_bg_4'><td class='center' colspan='{$colspan}'>" . Dropdown::getDropdownName("glpi_entities", $prev) . "</td></tr>\n";
     }
     echo "<tr class='tab_bg_2'>";
     if ($canedit) {
         echo "<td><input type='checkbox' name='item[" . $data["AID"] . "]' value='1'></td>";
     }
     echo "<td class='b'>" . $data["AID"] . "</td>";
Exemplo n.º 4
0
 /**
  * Generic Search and list function
  *
  * Build the query, make the search and list items after a search.
  *
  * @param $itemtype        item type
  * @param $params    array of parameters may include field, contains, searchtype, sort, order,
  *                         start, deleted, link, link2, contains2, field2, itemtype2, searchtype2
  *
  * @return Nothing (display)
  **/
 static function showList($itemtype, array $params)
 {
     global $DB, $CFG_GLPI;
     // Instanciate an object to access method
     $item = NULL;
     if ($itemtype != 'AllAssets') {
         $item = getItemForItemtype($itemtype);
     }
     // Default values of parameters
     $p['link'] = array();
     //
     $p['field'] = array();
     //
     $p['contains'] = array();
     //
     $p['searchtype'] = array();
     //
     $p['sort'] = '1';
     //
     $p['order'] = 'ASC';
     //
     $p['start'] = 0;
     //
     $p['is_deleted'] = 0;
     $p['export_all'] = 0;
     $p['link2'] = '';
     //
     $p['contains2'] = '';
     //
     $p['field2'] = '';
     //
     $p['itemtype2'] = '';
     $p['searchtype2'] = '';
     foreach ($params as $key => $val) {
         $p[$key] = $val;
     }
     if ($p['export_all']) {
         $p['start'] = 0;
     }
     if (in_array('all', $p['field']) && !$CFG_GLPI['allow_search_all']) {
         Html::displayRightError();
     }
     if (in_array('view', $p['field']) && !$CFG_GLPI['allow_search_view']) {
         Html::displayRightError();
     }
     // Manage defautll seachtype value : for bookmark compatibility
     if (count($p['contains'])) {
         foreach ($p['contains'] as $key => $val) {
             if (!isset($p['searchtype'][$key])) {
                 $p['searchtype'][$key] = 'contains';
             }
         }
     }
     if (is_array($p['contains2']) && count($p['contains2'])) {
         foreach ($p['contains2'] as $key => $val) {
             if (!isset($p['searchtype2'][$key])) {
                 $p['searchtype2'][$key] = 'contains';
             }
         }
     }
     $target = Toolbox::getItemTypeSearchURL($itemtype);
     $limitsearchopt = self::getCleanedOptions($itemtype);
     $blacklist_tables = array();
     if (isset($CFG_GLPI['union_search_type'][$itemtype])) {
         $itemtable = $CFG_GLPI['union_search_type'][$itemtype];
         $blacklist_tables[] = getTableForItemType($itemtype);
     } else {
         $itemtable = getTableForItemType($itemtype);
     }
     $LIST_LIMIT = $_SESSION['glpilist_limit'];
     // Set display type for export if define
     $output_type = self::HTML_OUTPUT;
     if (isset($_GET['display_type'])) {
         $output_type = $_GET['display_type'];
         // Limit to 10 element
         if ($_GET['display_type'] == self::GLOBAL_SEARCH) {
             $LIST_LIMIT = self::GLOBAL_DISPLAY_COUNT;
         }
     }
     // hack for AllAssets
     if (isset($CFG_GLPI['union_search_type'][$itemtype])) {
         $entity_restrict = true;
     } else {
         $entity_restrict = $item->isEntityAssign();
     }
     self::$output_type = $output_type;
     $metanames = array();
     // Get the items to display
     $toview = self::addDefaultToView($itemtype);
     // Add items to display depending of personal prefs
     $displaypref = DisplayPreference::getForTypeUser($itemtype, Session::getLoginUserID());
     if (count($displaypref)) {
         foreach ($displaypref as $val) {
             array_push($toview, $val);
         }
     }
     // Add searched items
     if (count($p['field']) > 0) {
         foreach ($p['field'] as $key => $val) {
             if (!in_array($val, $toview) && $val != 'all' && $val != 'view') {
                 array_push($toview, $val);
             }
         }
     }
     // Add order item
     if (!in_array($p['sort'], $toview)) {
         array_push($toview, $p['sort']);
     }
     // Special case for Ticket : put ID in front
     if ($itemtype == 'Ticket') {
         array_unshift($toview, 2);
     }
     // Clean toview array
     $toview = array_unique($toview);
     foreach ($toview as $key => $val) {
         if (!isset($limitsearchopt[$val])) {
             unset($toview[$key]);
         }
     }
     $toview_count = count($toview);
     // Construct the request
     //// 1 - SELECT
     // request currentuser for SQL supervision, not displayed
     $SELECT = "SELECT '" . Toolbox::addslashes_deep($_SESSION['glpiname']) . "' AS currentuser,\n                        " . self::addDefaultSelect($itemtype);
     // Add select for all toview item
     foreach ($toview as $key => $val) {
         $SELECT .= self::addSelect($itemtype, $val, $key, 0);
     }
     //// 2 - FROM AND LEFT JOIN
     // Set reference table
     $FROM = " FROM `{$itemtable}`";
     // Init already linked tables array in order not to link a table several times
     $already_link_tables = array();
     // Put reference table
     array_push($already_link_tables, $itemtable);
     // Add default join
     $COMMONLEFTJOIN = self::addDefaultJoin($itemtype, $itemtable, $already_link_tables);
     $FROM .= $COMMONLEFTJOIN;
     $searchopt = array();
     $searchopt[$itemtype] =& self::getOptions($itemtype);
     // Add all table for toview items
     foreach ($toview as $key => $val) {
         if (!in_array($searchopt[$itemtype][$val]["table"], $blacklist_tables)) {
             $FROM .= self::addLeftJoin($itemtype, $itemtable, $already_link_tables, $searchopt[$itemtype][$val]["table"], $searchopt[$itemtype][$val]["linkfield"], 0, 0, $searchopt[$itemtype][$val]["joinparams"]);
         }
     }
     // Search all case :
     if (in_array("all", $p['field'])) {
         foreach ($searchopt[$itemtype] as $key => $val) {
             // Do not search on Group Name
             if (is_array($val)) {
                 if (!in_array($searchopt[$itemtype][$key]["table"], $blacklist_tables)) {
                     $FROM .= self::addLeftJoin($itemtype, $itemtable, $already_link_tables, $searchopt[$itemtype][$key]["table"], $searchopt[$itemtype][$key]["linkfield"], 0, 0, $searchopt[$itemtype][$key]["joinparams"]);
                 }
             }
         }
     }
     //// 3 - WHERE
     // default string
     $COMMONWHERE = self::addDefaultWhere($itemtype);
     $first = empty($COMMONWHERE);
     // Add deleted if item have it
     if ($item && $item->maybeDeleted()) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         $COMMONWHERE .= $LINK . "`{$itemtable}`.`is_deleted` = '" . $p['is_deleted'] . "' ";
     }
     // Remove template items
     if ($item && $item->maybeTemplate()) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         $COMMONWHERE .= $LINK . "`{$itemtable}`.`is_template` = '0' ";
     }
     // Add Restrict to current entities
     if ($entity_restrict) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         if ($itemtype == 'Entity') {
             $COMMONWHERE .= getEntitiesRestrictRequest($LINK, $itemtable, 'id', '', true);
         } else {
             if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
                 // Will be replace below in Union/Recursivity Hack
                 $COMMONWHERE .= $LINK . " ENTITYRESTRICT ";
             } else {
                 $COMMONWHERE .= getEntitiesRestrictRequest($LINK, $itemtable, '', '', $item->maybeRecursive());
             }
         }
     }
     $WHERE = "";
     $HAVING = "";
     // Add search conditions
     // If there is search items
     if ($_SESSION["glpisearchcount"][$itemtype] > 0 && count($p['contains']) > 0) {
         for ($key = 0; $key < $_SESSION["glpisearchcount"][$itemtype]; $key++) {
             // if real search (strlen >0) and not all and view search
             if (isset($p['contains'][$key]) && strlen($p['contains'][$key]) > 0) {
                 // common search
                 if ($p['field'][$key] != "all" && $p['field'][$key] != "view") {
                     $LINK = " ";
                     $NOT = 0;
                     $tmplink = "";
                     if (is_array($p['link']) && isset($p['link'][$key])) {
                         if (strstr($p['link'][$key], "NOT")) {
                             $tmplink = " " . str_replace(" NOT", "", $p['link'][$key]);
                             $NOT = 1;
                         } else {
                             $tmplink = " " . $p['link'][$key];
                         }
                     } else {
                         $tmplink = " AND ";
                     }
                     if (isset($searchopt[$itemtype][$p['field'][$key]]["usehaving"])) {
                         // Manage Link if not first item
                         if (!empty($HAVING)) {
                             $LINK = $tmplink;
                         }
                         // Find key
                         $item_num = array_search($p['field'][$key], $toview);
                         $HAVING .= self::addHaving($LINK, $NOT, $itemtype, $p['field'][$key], $p['searchtype'][$key], $p['contains'][$key], 0, $item_num);
                     } else {
                         // Manage Link if not first item
                         if (!empty($WHERE)) {
                             $LINK = $tmplink;
                         }
                         $WHERE .= self::addWhere($LINK, $NOT, $itemtype, $p['field'][$key], $p['searchtype'][$key], $p['contains'][$key]);
                     }
                     // view and all search
                 } else {
                     $LINK = " OR ";
                     $NOT = 0;
                     $globallink = " AND ";
                     if (is_array($p['link']) && isset($p['link'][$key])) {
                         switch ($p['link'][$key]) {
                             case "AND":
                                 $LINK = " OR ";
                                 $globallink = " AND ";
                                 break;
                             case "AND NOT":
                                 $LINK = " AND ";
                                 $NOT = 1;
                                 $globallink = " AND ";
                                 break;
                             case "OR":
                                 $LINK = " OR ";
                                 $globallink = " OR ";
                                 break;
                             case "OR NOT":
                                 $LINK = " AND ";
                                 $NOT = 1;
                                 $globallink = " OR ";
                                 break;
                         }
                     } else {
                         $tmplink = " AND ";
                     }
                     // Manage Link if not first item
                     if (!empty($WHERE)) {
                         $WHERE .= $globallink;
                     }
                     $WHERE .= " ( ";
                     $first2 = true;
                     $items = array();
                     if ($p['field'][$key] == "all") {
                         $items = $searchopt[$itemtype];
                     } else {
                         // toview case : populate toview
                         foreach ($toview as $key2 => $val2) {
                             $items[$val2] = $searchopt[$itemtype][$val2];
                         }
                     }
                     foreach ($items as $key2 => $val2) {
                         if (isset($val2['nosearch']) && $val2['nosearch']) {
                             continue;
                         }
                         if (is_array($val2)) {
                             // Add Where clause if not to be done in HAVING CLAUSE
                             if (!isset($val2["usehaving"])) {
                                 $tmplink = $LINK;
                                 if ($first2) {
                                     $tmplink = " ";
                                     $first2 = false;
                                 }
                                 $WHERE .= self::addWhere($tmplink, $NOT, $itemtype, $key2, $p['searchtype'][$key], $p['contains'][$key]);
                             }
                         }
                     }
                     $WHERE .= " ) ";
                 }
             }
         }
     }
     //// 4 - ORDER
     $ORDER = " ORDER BY `id` ";
     foreach ($toview as $key => $val) {
         if ($p['sort'] == $val) {
             $ORDER = self::addOrderBy($itemtype, $p['sort'], $p['order'], $key);
         }
     }
     //// 5 - META SEARCH
     // Preprocessing
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
         // a - SELECT
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 $SELECT .= self::addSelect($p['itemtype2'][$i], $p['field2'][$i], $i, 1, $p['itemtype2'][$i]);
             }
         }
         // b - ADD LEFT JOIN
         // Already link meta table in order not to linked a table several times
         $already_link_tables2 = array();
         // Link reference tables
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 if (!in_array(getTableForItemType($p['itemtype2'][$i]), $already_link_tables2)) {
                     $FROM .= self::addMetaLeftJoin($itemtype, $p['itemtype2'][$i], $already_link_tables2, $p['contains2'][$i] == "NULL" || strstr($p['link2'][$i], "NOT"));
                 }
             }
         }
         // Link items tables
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 if (!isset($searchopt[$p['itemtype2'][$i]])) {
                     $searchopt[$p['itemtype2'][$i]] =& self::getOptions($p['itemtype2'][$i]);
                 }
                 if (!in_array($searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["table"] . "_" . $p['itemtype2'][$i], $already_link_tables2)) {
                     $FROM .= self::addLeftJoin($p['itemtype2'][$i], getTableForItemType($p['itemtype2'][$i]), $already_link_tables2, $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["table"], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["linkfield"], 1, $p['itemtype2'][$i], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["joinparams"]);
                 }
             }
         }
     }
     //// 6 - Add item ID
     // Add ID to the select
     if (!empty($itemtable)) {
         $SELECT .= "`{$itemtable}`.`id` AS id ";
     }
     //// 7 - Manage GROUP BY
     $GROUPBY = "";
     // Meta Search / Search All / Count tickets
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0 || !empty($HAVING) || in_array('all', $p['field'])) {
         $GROUPBY = " GROUP BY `{$itemtable}`.`id`";
     }
     if (empty($GROUPBY)) {
         foreach ($toview as $key2 => $val2) {
             if (!empty($GROUPBY)) {
                 break;
             }
             if (isset($searchopt[$itemtype][$val2]["forcegroupby"])) {
                 $GROUPBY = " GROUP BY `{$itemtable}`.`id`";
             }
         }
     }
     // Specific search for others item linked  (META search)
     if (is_array($p['itemtype2'])) {
         for ($key = 0; $key < $_SESSION["glpisearchcount2"][$itemtype]; $key++) {
             if (isset($p['itemtype2'][$key]) && !empty($p['itemtype2'][$key]) && isset($p['contains2'][$key]) && strlen($p['contains2'][$key]) > 0) {
                 $LINK = "";
                 // For AND NOT statement need to take into account all the group by items
                 if (strstr($p['link2'][$key], "AND NOT") || isset($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["usehaving"])) {
                     $NOT = 0;
                     if (strstr($p['link2'][$key], "NOT")) {
                         $tmplink = " " . str_replace(" NOT", "", $p['link2'][$key]);
                         $NOT = 1;
                     } else {
                         $tmplink = " " . $p['link2'][$key];
                     }
                     if (!empty($HAVING)) {
                         $LINK = $tmplink;
                     }
                     $HAVING .= self::addHaving($LINK, $NOT, $p['itemtype2'][$key], $p['field2'][$key], $p['searchtype2'][$key], $p['contains2'][$key], 1, $key);
                 } else {
                     // Meta Where Search
                     $LINK = " ";
                     $NOT = 0;
                     // Manage Link if not first item
                     if (is_array($p['link2']) && isset($p['link2'][$key]) && strstr($p['link2'][$key], "NOT")) {
                         $tmplink = " " . str_replace(" NOT", "", $p['link2'][$key]);
                         $NOT = 1;
                     } else {
                         if (is_array($p['link2']) && isset($p['link2'][$key])) {
                             $tmplink = " " . $p['link2'][$key];
                         } else {
                             $tmplink = " AND ";
                         }
                     }
                     if (!empty($WHERE)) {
                         $LINK = $tmplink;
                     }
                     $WHERE .= self::addWhere($LINK, $NOT, $p['itemtype2'][$key], $p['field2'][$key], $p['searchtype2'][$key], $p['contains2'][$key], 1);
                 }
             }
         }
     }
     // Use a ReadOnly connection if available and configured to be used
     $DBread = DBConnection::getReadConnection();
     // If no research limit research to display item and compute number of item using simple request
     $nosearch = true;
     for ($i = 0; $i < $_SESSION["glpisearchcount"][$itemtype]; $i++) {
         if (isset($p['contains'][$i]) && strlen($p['contains'][$i]) > 0) {
             $nosearch = false;
         }
     }
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0) {
         $nosearch = false;
     }
     $LIMIT = "";
     $numrows = 0;
     //No search : count number of items using a simple count(ID) request and LIMIT search
     if ($nosearch) {
         $LIMIT = " LIMIT " . $p['start'] . ", " . $LIST_LIMIT;
         // Force group by for all the type -> need to count only on table ID
         if (!isset($searchopt[$itemtype][1]['forcegroupby'])) {
             $count = "count(*)";
         } else {
             $count = "count(DISTINCT `{$itemtable}`.`id`)";
         }
         // request currentuser for SQL supervision, not displayed
         $query_num = "SELECT {$count},\n                              '" . Toolbox::addslashes_deep($_SESSION['glpiname']) . "' AS currentuser\n                       FROM `{$itemtable}`" . $COMMONLEFTJOIN;
         $first = true;
         if (!empty($COMMONWHERE)) {
             $LINK = " AND ";
             if ($first) {
                 $LINK = " WHERE ";
                 $first = false;
             }
             $query_num .= $LINK . $COMMONWHERE;
         }
         // Union Search :
         if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
             $tmpquery = $query_num;
             $numrows = 0;
             foreach ($CFG_GLPI[$CFG_GLPI["union_search_type"][$itemtype]] as $ctype) {
                 $ctable = getTableForItemType($ctype);
                 if (($citem = getItemForItemtype($ctype)) && $citem->canView()) {
                     // State case
                     if ($itemtype == 'AllAssets') {
                         $query_num = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                         $query_num = str_replace($itemtype, $ctype, $query_num);
                         $query_num .= " AND `{$ctable}`.`id` IS NOT NULL ";
                         // Add deleted if item have it
                         if ($citem && $citem->maybeDeleted()) {
                             $query_num .= " AND `{$ctable}`.`is_deleted` = '0' ";
                         }
                         // Remove template items
                         if ($citem && $citem->maybeTemplate()) {
                             $query_num .= " AND `{$ctable}`.`is_template` = '0' ";
                         }
                     } else {
                         // Ref table case
                         $reftable = getTableForItemType($itemtype);
                         if ($item && $item->maybeDeleted()) {
                             $tmpquery = str_replace("`" . $CFG_GLPI["union_search_type"][$itemtype] . "`.`is_deleted`", "`{$reftable}`.`is_deleted`", $tmpquery);
                         }
                         $replace = "FROM `{$reftable}`\n                                  INNER JOIN `{$ctable}`\n                                       ON (`{$reftable}`.`items_id` =`{$ctable}`.`id`\n                                           AND `{$reftable}`.`itemtype` = '{$ctype}')";
                         $query_num = str_replace("FROM `" . $CFG_GLPI["union_search_type"][$itemtype] . "`", $replace, $tmpquery);
                         $query_num = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $query_num);
                     }
                     $query_num = str_replace("ENTITYRESTRICT", getEntitiesRestrictRequest('', $ctable, '', '', $citem->maybeRecursive()), $query_num);
                     $result_num = $DBread->query($query_num);
                     $numrows += $DBread->result($result_num, 0, 0);
                 }
             }
         } else {
             $result_num = $DBread->query($query_num);
             $numrows = $DBread->result($result_num, 0, 0);
         }
     }
     // If export_all reset LIMIT condition
     if ($p['export_all']) {
         $LIMIT = "";
     }
     if (!empty($WHERE) || !empty($COMMONWHERE)) {
         if (!empty($COMMONWHERE)) {
             $WHERE = ' WHERE ' . $COMMONWHERE . (!empty($WHERE) ? ' AND ( ' . $WHERE . ' )' : '');
         } else {
             $WHERE = ' WHERE ' . $WHERE . ' ';
         }
         $first = false;
     }
     if (!empty($HAVING)) {
         $HAVING = ' HAVING ' . $HAVING;
     }
     // Create QUERY
     if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
         $first = true;
         $QUERY = "";
         foreach ($CFG_GLPI[$CFG_GLPI["union_search_type"][$itemtype]] as $ctype) {
             $ctable = getTableForItemType($ctype);
             if (($citem = getItemForItemtype($ctype)) && $citem->canView()) {
                 if ($first) {
                     $first = false;
                 } else {
                     $QUERY .= " UNION ";
                 }
                 $tmpquery = "";
                 // AllAssets case
                 if ($itemtype == 'AllAssets') {
                     $tmpquery = $SELECT . ", '{$ctype}' AS TYPE " . $FROM . $WHERE;
                     if ($itemtype == 'AllAssets') {
                         $tmpquery .= " AND `{$ctable}`.`id` IS NOT NULL ";
                     }
                     // Add deleted if item have it
                     if ($citem && $citem->maybeDeleted()) {
                         $tmpquery .= " AND `{$ctable}`.`is_deleted` = '0' ";
                     }
                     // Remove template items
                     if ($citem && $citem->maybeTemplate()) {
                         $tmpquery .= " AND `{$ctable}`.`is_template` = '0' ";
                     }
                     $tmpquery .= $GROUPBY . $HAVING;
                     $tmpquery = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                     $tmpquery = str_replace($itemtype, $ctype, $tmpquery);
                 } else {
                     // Ref table case
                     $reftable = getTableForItemType($itemtype);
                     $tmpquery = $SELECT . ", '{$ctype}' AS TYPE,\n                                      `{$reftable}`.`id` AS refID, " . "\n                                      `{$ctable}`.`entities_id` AS ENTITY " . $FROM . $WHERE;
                     if ($item->maybeDeleted()) {
                         $tmpquery = str_replace("`" . $CFG_GLPI["union_search_type"][$itemtype] . "`.`is_deleted`", "`{$reftable}`.`is_deleted`", $tmpquery);
                     }
                     $replace = "FROM `{$reftable}`" . "\n                              INNER JOIN `{$ctable}`" . "\n                                 ON (`{$reftable}`.`items_id`=`{$ctable}`.`id`" . "\n                                     AND `{$reftable}`.`itemtype` = '{$ctype}')";
                     $tmpquery = str_replace("FROM `" . $CFG_GLPI["union_search_type"][$itemtype] . "`", $replace, $tmpquery);
                     $tmpquery = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                 }
                 $tmpquery = str_replace("ENTITYRESTRICT", getEntitiesRestrictRequest('', $ctable, '', '', $citem->maybeRecursive()), $tmpquery);
                 // SOFTWARE HACK
                 if ($ctype == 'Software') {
                     $tmpquery = str_replace("glpi_softwares.serial", "''", $tmpquery);
                     $tmpquery = str_replace("glpi_softwares.otherserial", "''", $tmpquery);
                 }
                 $QUERY .= $tmpquery;
             }
         }
         if (empty($QUERY)) {
             echo self::showError($output_type);
             return;
         }
         $QUERY .= str_replace($CFG_GLPI["union_search_type"][$itemtype] . ".", "", $ORDER) . $LIMIT;
     } else {
         $QUERY = $SELECT . $FROM . $WHERE . $GROUPBY . $HAVING . $ORDER . $LIMIT;
     }
     $DBread->query("SET SESSION group_concat_max_len = 4096;");
     $result = $DBread->query($QUERY);
     /// Check group concat limit : if warning : increase limit
     if ($result2 = $DBread->query('SHOW WARNINGS')) {
         if ($DBread->numrows($result2) > 0) {
             $data = $DBread->fetch_assoc($result2);
             if ($data['Code'] == 1260) {
                 $DBread->query("SET SESSION group_concat_max_len = 4194304;");
                 $result = $DBread->query($QUERY);
             }
         }
     }
     // Get it from database and DISPLAY
     if ($result) {
         // if real search or complete export : get numrows from request
         if (!$nosearch || $p['export_all']) {
             $numrows = $DBread->numrows($result);
         }
         // Contruct Pager parameters
         $globallinkto = self::getArrayUrlLink("field", $p['field']) . self::getArrayUrlLink("link", $p['link']) . self::getArrayUrlLink("contains", $p['contains']) . self::getArrayUrlLink("searchtype", $p['searchtype']) . self::getArrayUrlLink("field2", $p['field2']) . self::getArrayUrlLink("contains2", $p['contains2']) . self::getArrayUrlLink("itemtype2", $p['itemtype2']) . self::getArrayUrlLink("searchtype2", $p['searchtype2']) . self::getArrayUrlLink("link2", $p['link2']);
         $parameters = "sort=" . $p['sort'] . "&amp;order=" . $p['order'] . $globallinkto;
         // Not more used : clean pages : try to comment it
         /*
         $tmp=explode('?',$target,2);
         if (count($tmp)>1) {
            $target = $tmp[0];
            $parameters = $tmp[1].'&amp;'.$parameters;
         }
         */
         if ($output_type == self::GLOBAL_SEARCH) {
             if ($item = getItemForItemtype($itemtype)) {
                 echo "<div class='center'><h2>" . $item->getTypeName();
                 // More items
                 if ($numrows > $p['start'] + self::GLOBAL_DISPLAY_COUNT) {
                     echo " <a href='{$target}?{$parameters}'>" . __('All') . "</a>";
                 }
                 echo "</h2></div>\n";
             } else {
                 return false;
             }
         }
         // If the begin of the view is before the number of items
         if ($p['start'] < $numrows) {
             // Display pager only for HTML
             if ($output_type == self::HTML_OUTPUT) {
                 // For plugin add new parameter if available
                 if ($plug = isPluginItemType($itemtype)) {
                     $function = 'plugin_' . $plug['plugin'] . '_addParamFordynamicReport';
                     if (function_exists($function)) {
                         $out = $function($itemtype);
                         if (is_array($out) && count($out)) {
                             foreach ($out as $key => $val) {
                                 if (is_array($val)) {
                                     $parameters .= self::getArrayUrlLink($key, $val);
                                 } else {
                                     $parameters .= "&amp;{$key}={$val}";
                                 }
                             }
                         }
                     }
                 }
                 $search_config = "";
                 if (Session::haveRight("search_config", DisplayPreference::GENERAL)) {
                     //|| Session::haveRight("search_config_global",CREATE)) {
                     //                   Ajax::createModalWindow('searchconfig_window',
                     //                         $CFG_GLPI['root_doc']."/ajax/searchconfig.php?itemtype=$itemtype",
                     //                         array('title'    => __('Select default items to show'),
                     //                               'width'    => '1000'));
                     //                   $tmp = " class='pointer' onClick=\"searchconfig_window.show()\"";
                     $tmp = " class='pointer' onClick=\"var w = window.open('" . $CFG_GLPI["root_doc"] . "/front/popup.php?popup=search_config&amp;itemtype={$itemtype}' ,'glpipopup', " . "'height=400, width=1000, top=100, left=100, scrollbars=yes'); w.focus();\"";
                     $search_config = "<img alt=\"" . __s('Select default items to show') . "\" title=\"" . __s('Select default items to show') . "\" src='" . $CFG_GLPI["root_doc"] . "/pics/options_search.png' ";
                     $search_config .= $tmp . ">";
                 }
                 Html::printPager($p['start'], $numrows, $target, $parameters, $itemtype, 0, $search_config);
             }
             // Define begin and end var for loop
             // Search case
             $begin_display = $p['start'];
             $end_display = min($numrows, $p['start'] + $LIST_LIMIT);
             // No search Case
             if ($nosearch) {
                 $begin_display = 0;
                 $end_display = min($numrows - $p['start'], $LIST_LIMIT);
             }
             // Export All case
             if ($p['export_all']) {
                 $begin_display = 0;
                 $end_display = $numrows;
             }
             // Form to massive actions
             $isadmin = $item && $item->canUpdate();
             if (!$isadmin && in_array($itemtype, $CFG_GLPI["infocom_types"])) {
                 $isadmin = Infocom::canUpdate() || Infocom::canCreate();
             }
             $showmassiveactions = false;
             if ($itemtype != 'AllAssets') {
                 $showmassiveactions = count($item->getAllMassiveActions($p['is_deleted']));
                 if ($showmassiveactions && $output_type == self::HTML_OUTPUT) {
                     Html::openMassiveActionsForm('massform' . $itemtype);
                     $massiveactionparams = array('num_displayed' => $end_display - $begin_display, 'fixed' => false, 'is_deleted' => $p['is_deleted']);
                     Html::showMassiveActions($itemtype, $massiveactionparams);
                 }
             }
             // Compute number of columns to display
             // Add toview elements
             $nbcols = $toview_count;
             $already_printed = array();
             // Add meta search elements if real search (strlen>0) or only NOT search
             if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
                 for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
                     if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0 && (!isset($p['link2'][$i]) || !strstr($p['link2'][$i], "NOT"))) {
                         if (!isset($already_printed[$p['itemtype2'][$i] . $p['field2'][$i]])) {
                             $nbcols++;
                             $already_printed[$p['itemtype2'][$i] . $p['field2'][$i]] = 1;
                         }
                     }
                 }
             }
             if ($output_type == self::HTML_OUTPUT) {
                 // HTML display - massive modif
                 $nbcols++;
             }
             // Display List Header
             echo self::showHeader($output_type, $end_display - $begin_display + 1, $nbcols);
             // New Line for Header Items Line
             $headers_line = '';
             $headers_line_top = '';
             $headers_line_bottom = '';
             echo self::showNewLine($output_type);
             $header_num = 1;
             if ($output_type == self::HTML_OUTPUT && $showmassiveactions) {
                 // HTML display - massive modif
                 $headers_line_top .= self::showHeaderItem($output_type, Html::getCheckAllAsCheckbox('massform' . $itemtype), $header_num, "", 0, $p['order']);
                 $headers_line_bottom .= self::showHeaderItem($output_type, Html::getCheckAllAsCheckbox('massform' . $itemtype), $header_num, "", 0, $p['order']);
             }
             // Display column Headers for toview items
             foreach ($toview as $key => $val) {
                 $linkto = '';
                 if (!isset($searchopt[$itemtype][$val]['nosort']) || !$searchopt[$itemtype][$val]['nosort']) {
                     $linkto = "{$target}?itemtype={$itemtype}&amp;sort=" . $val . "&amp;order=" . ($p['order'] == "ASC" ? "DESC" : "ASC") . "&amp;start=" . $p['start'] . $globallinkto;
                 }
                 $headers_line .= self::showHeaderItem($output_type, $searchopt[$itemtype][$val]["name"], $header_num, $linkto, $p['sort'] == $val, $p['order']);
             }
             // Display columns Headers for meta items
             $already_printed = array();
             if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
                 for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
                     if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                         if (!isset($already_printed[$p['itemtype2'][$i] . $p['field2'][$i]])) {
                             if (!isset($metanames[$p['itemtype2'][$i]])) {
                                 if ($metaitem = getItemForItemtype($p['itemtype2'][$i])) {
                                     $metanames[$p['itemtype2'][$i]] = $metaitem->getTypeName();
                                 }
                             }
                             $headers_line .= self::showHeaderItem($output_type, sprintf(__('%1$s - %2$s'), $metanames[$p['itemtype2'][$i]], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["name"]), $header_num);
                             $already_printed[$p['itemtype2'][$i] . $p['field2'][$i]] = 1;
                         }
                     }
                 }
             }
             // Add specific column Header
             if ($itemtype == 'CartridgeItem') {
                 $headers_line .= self::showHeaderItem($output_type, _n('Cartridge', 'Cartridges', 2), $header_num);
             }
             if ($itemtype == 'ConsumableItem') {
                 $headers_line .= self::showHeaderItem($output_type, _n('Consumable', 'Consumables', 2), $header_num);
             }
             if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
                 $headers_line .= self::showHeaderItem($output_type, __('Item type'), $header_num);
             }
             if ($itemtype == 'ReservationItem' && $output_type == self::HTML_OUTPUT) {
                 $headers_line .= self::showHeaderItem($output_type, "&nbsp;", $header_num);
             }
             // End Line for column headers
             $headers_line .= self::showEndLine($output_type);
             $headers_line_top .= $headers_line;
             $headers_line_bottom .= $headers_line;
             echo $headers_line_top;
             // if real search seek to begin of items to display (because of complete search)
             if (!$nosearch) {
                 $DBread->data_seek($result, $p['start']);
             }
             // Define begin and end var for loop
             // Search case
             $i = $begin_display;
             // Init list of items displayed
             if ($output_type == self::HTML_OUTPUT) {
                 Session::initNavigateListItems($itemtype);
             }
             // Num of the row (1=header_line)
             $row_num = 1;
             $massiveaction_field = 'id';
             if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
                 $massiveaction_field = 'refID';
             }
             // Display Loop
             while ($i < $numrows && $i < $end_display) {
                 // Column num
                 $item_num = 1;
                 // Get data and increment loop variables
                 $data = $DBread->fetch_assoc($result);
                 $i++;
                 $row_num++;
                 // New line
                 echo self::showNewLine($output_type, $i % 2, $p['is_deleted']);
                 // Add item in item list
                 Session::addToNavigateListItems($itemtype, $data["id"]);
                 if ($output_type == self::HTML_OUTPUT && $showmassiveactions) {
                     // HTML display - massive modif
                     $tmpcheck = "";
                     if ($itemtype == 'Entity' && !in_array($data["id"], $_SESSION["glpiactiveentities"])) {
                         $tmpcheck = "&nbsp;";
                     } else {
                         if ($item->maybeRecursive() && !in_array($data["entities_id"], $_SESSION["glpiactiveentities"])) {
                             $tmpcheck = "&nbsp;";
                         } else {
                             $tmpcheck = Html::getMassiveActionCheckBox($itemtype, $data[$massiveaction_field]);
                         }
                     }
                     echo self::showItem($output_type, $tmpcheck, $item_num, $row_num, "width='10'");
                 }
                 // Print other toview items
                 foreach ($toview as $key => $val) {
                     echo self::showItem($output_type, self::giveItem($itemtype, $val, $data, $key), $item_num, $row_num, self::displayConfigItem($itemtype, $val, $data, $key));
                 }
                 // Print Meta Item
                 $already_printed = array();
                 if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
                     for ($j = 0; $j < $_SESSION["glpisearchcount2"][$itemtype]; $j++) {
                         if (isset($p['itemtype2'][$j]) && !empty($p['itemtype2'][$j]) && isset($p['contains2'][$j]) && strlen($p['contains2'][$j]) > 0) {
                             if (!isset($already_printed[$p['itemtype2'][$j] . $p['field2'][$j]])) {
                                 // General case
                                 if (strpos($data["META_{$j}"], "\$\$\$\$") === false) {
                                     $out = self::giveItem($p['itemtype2'][$j], $p['field2'][$j], $data, $j, 1);
                                     echo self::showItem($output_type, $out, $item_num, $row_num);
                                     // Case of GROUP_CONCAT item : split item and multilline display
                                 } else {
                                     $split = explode("\$\$\$\$", $data["META_{$j}"]);
                                     $count_display = 0;
                                     $out = "";
                                     $unit = "";
                                     $separate = '<br>';
                                     if (isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['splititems']) && $searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['splititems']) {
                                         $separate = '<hr>';
                                     }
                                     if (isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['unit'])) {
                                         $unit = $searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['unit'];
                                     }
                                     for ($k = 0; $k < count($split); $k++) {
                                         if ($p['contains2'][$j] == "NULL" || strlen($p['contains2'][$j]) == 0 || preg_match('/' . $p['contains2'][$j] . '/i', $split[$k]) || isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['forcegroupby'])) {
                                             if ($count_display) {
                                                 $out .= $separate;
                                             }
                                             $count_display++;
                                             // Manage Link to item
                                             $split2 = self::explodeWithID("\$\$", $split[$k]);
                                             if (isset($split2[1])) {
                                                 if (isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['datatype']) && $searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['datatype'] == 'itemlink') {
                                                     $out .= "<a id='" . $p['itemtype2'][$j] . '_' . $data["id"] . '_' . $split2[1] . "' ";
                                                     $out .= "href=\"" . Toolbox::getItemTypeFormURL($p['itemtype2'][$j]) . "?id=" . $split2[1] . "\">";
                                                     $out .= Dropdown::getValueWithUnit($split2[0], $unit);
                                                     $linkout = $out;
                                                     if ($_SESSION["glpiis_ids_visible"] || empty($split2[0])) {
                                                         $linkout = sprintf(__('%1$s (%2$s)'), $linkout, $split2[1]);
                                                     }
                                                     $out = $linkout . "</a>";
                                                 } else {
                                                     $out .= Dropdown::getValueWithUnit($split2[0], $unit);
                                                 }
                                             } else {
                                                 $out .= Dropdown::getValueWithUnit($split[$k], $unit);
                                             }
                                         }
                                     }
                                     echo self::showItem($output_type, $out, $item_num, $row_num);
                                 }
                                 $already_printed[$p['itemtype2'][$j] . $p['field2'][$j]] = 1;
                             }
                         }
                     }
                 }
                 // Specific column display
                 if ($itemtype == 'CartridgeItem') {
                     echo self::showItem($output_type, Cartridge::getCount($data["id"], $data["ALARM"], $output_type != self::HTML_OUTPUT), $item_num, $row_num);
                 }
                 if ($itemtype == 'ConsumableItem') {
                     echo self::showItem($output_type, Consumable::getCount($data["id"], $data["ALARM"], $output_type != self::HTML_OUTPUT), $item_num, $row_num);
                 }
                 if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
                     $typename = $data["TYPE"];
                     if ($itemtmp = getItemForItemtype($data["TYPE"])) {
                         $typename = $itemtmp->getTypeName();
                     }
                     echo self::showItem($output_type, $typename, $item_num, $row_num);
                 }
                 if ($itemtype == 'ReservationItem' && $output_type == self::HTML_OUTPUT) {
                     if ($data["ACTIVE"]) {
                         echo self::showItem($output_type, "<a href='reservation.php?reservationitems_id=" . $data["refID"] . "' title=\"" . __s('See planning') . "\">" . "<img src=\"" . $CFG_GLPI["root_doc"] . "/pics/reservation-3.png\" alt='' title=''></a>", $item_num, $row_num, "class='center'");
                     } else {
                         echo self::showItem($output_type, "&nbsp;", $item_num, $row_num);
                     }
                 }
                 // End Line
                 echo self::showEndLine($output_type);
             }
             $title = "";
             // Create title
             if ($output_type == self::PDF_OUTPUT_LANDSCAPE || $output_type == self::PDF_OUTPUT_PORTRAIT) {
                 if ($_SESSION["glpisearchcount"][$itemtype] > 0 && count($p['contains']) > 0) {
                     for ($key = 0; $key < $_SESSION["glpisearchcount"][$itemtype]; $key++) {
                         $titlecontain = '';
                         if (strlen($p['contains'][$key]) > 0) {
                             if (isset($p["link"][$key])) {
                                 $titlecontain = " " . $p["link"][$key] . " ";
                             }
                             switch ($p['field'][$key]) {
                                 case "all":
                                     $titlecontain = sprintf(__('%1$s %2$s'), $titlecontain, __('All'));
                                     break;
                                 case "view":
                                     $titlecontain = sprintf(__('%1$s %2$s'), $titlecontain, __('Items seen'));
                                     break;
                                 default:
                                     $titlecontain = sprintf(__('%1$s %2$s'), $titlecontain, $searchopt[$itemtype][$p['field'][$key]]["name"]);
                             }
                             switch ($p['searchtype'][$key]) {
                                 case "equals":
                                     if (in_array($searchopt[$itemtype][$p['field'][$key]]["field"], array('name', 'completename'))) {
                                         $titlecontain = sprintf(__('%1$s = %2$s'), $titlecontain, Dropdown::getDropdownName($searchopt[$itemtype][$p['field'][$key]]["table"], $p['contains'][$key]));
                                     } else {
                                         $titlecontain = sprintf(__('%1$s = %2$s'), $titlecontain, $p['contains'][$key]);
                                     }
                                     break;
                                 case "notequals":
                                     if (in_array($searchopt[$itemtype][$p['field'][$key]]["field"], array('name', 'completename'))) {
                                         $titlecontain = sprintf(__('%1$s <> %2$s'), $titlecontain, Dropdown::getDropdownName($searchopt[$itemtype][$p['field'][$key]]["table"], $p['contains'][$key]));
                                     } else {
                                         $titlecontain = sprintf(__('%1$s <> %2$s'), $titlecontain, $p['contains'][$key]);
                                     }
                                     break;
                                 case "lessthan":
                                     $titlecontain = sprintf(__('%1$s < %2$s'), $titlecontain, $p['contains'][$key]);
                                     break;
                                 case "morethan":
                                     $titlecontain = sprintf(__('%1$s > %2$s'), $titlecontain, $p['contains'][$key]);
                                     break;
                                 case "contains":
                                     $titlecontain = sprintf(__('%1$s = %2$s'), $titlecontain, '%' . $p['contains'][$key] . '%');
                                     break;
                                 case "under":
                                     $titlecontain = sprintf(__('%1$s %2$s'), $titlecontain, sprintf(__('%1$s %2$s'), __('under'), Dropdown::getDropdownName($searchopt[$itemtype][$p['field'][$key]]["table"], $p['contains'][$key])));
                                     break;
                                 case "notunder":
                                     $titlecontain = sprintf(__('%1$s %2$s'), $titlecontain, sprintf(__('%1$s %2$s'), __('not under'), Dropdown::getDropdownName($searchopt[$itemtype][$p['field'][$key]]["table"], $p['contains'][$key])));
                                     break;
                                 default:
                                     $titlecontain = sprintf(__('%1$s = %2$s'), $titlecontain, $p['contains'][$key]);
                                     break;
                             }
                         }
                         $title .= $titlecontain;
                     }
                 }
                 if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && count($p['contains2']) > 0) {
                     for ($key = 0; $key < $_SESSION["glpisearchcount2"][$itemtype]; $key++) {
                         $titlecontain2 = '';
                         if (strlen($p['contains2'][$key]) > 0) {
                             if (isset($p['link2'][$key])) {
                                 $titlecontain2 = sprintf(__('%1$s %2$s'), $titlecontain2, $p['link2'][$key]);
                             }
                             $titlecontain2 = sprintf(__('%1$s %2$s'), $titlecontain2, sprintf(__('%1$s / %2$s'), $metanames[$p['itemtype2'][$key]], $searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["name"]));
                             switch ($p['searchtype2'][$key]) {
                                 case "equals":
                                     if (in_array($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["field"], array('name', 'completename'))) {
                                         $titlecontain2 = sprintf(__('%1$s = %2$s'), $titlecontain2, Dropdown::getDropdownName($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["table"], $p['contains2'][$key]));
                                     } else {
                                         $titlecontain2 = sprintf(__('%1$s = %2$s'), $titlecontain2, $p['contains2'][$key]);
                                     }
                                     break;
                                 case "notequals":
                                     if (in_array($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["field"], array('name', 'completename'))) {
                                         $titlecontain2 = sprintf(__('%1$s <> %2$s'), $titlecontain2, Dropdown::getDropdownName($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["table"], $p['contains2'][$key]));
                                     } else {
                                         $titlecontain2 = sprintf(__('%1$s <> %2$s'), $titlecontain2, $p['contains2'][$key]);
                                     }
                                     break;
                                 case "lessthan":
                                     $titlecontain2 = sprintf(__('%1$s < %2$s'), $titlecontain2, $p['contains2'][$key]);
                                     break;
                                 case "morethan":
                                     $titlecontain2 = sprintf(__('%1$s > %2$s'), $titlecontain2, $p['contains2'][$key]);
                                     break;
                                 case "contains":
                                     $titlecontain2 = sprintf(__('%1$s = %2$s'), $titlecontain2, '%' . $p['contains2'][$key] . '%');
                                     break;
                                 case "under":
                                     $titlecontain2 = sprintf(__('%1$s %2$s'), $titlecontain2, sprintf(__('%1$s %2$s'), __('under'), Dropdown::getDropdownName($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["table"], $p['contains2'][$key])));
                                     break;
                                 case "notunder":
                                     $titlecontain2 = sprintf(__('%1$s %2$s'), $titlecontain2, sprintf(__('%1$s %2$s'), __('not under'), Dropdown::getDropdownName($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["table"], $p['contains2'][$key])));
                                     break;
                                 default:
                                     $titlecontain2 = sprintf(__('%1$s = %2$s'), $titlecontain2, $p['contains2'][$key]);
                                     break;
                             }
                         }
                         $title .= $titlecontain2;
                     }
                 }
             }
             if ($output_type == self::HTML_OUTPUT) {
                 echo $headers_line_bottom;
             }
             // Display footer
             echo self::showFooter($output_type, $title);
             // Delete selected item
             if ($output_type == self::HTML_OUTPUT) {
                 if ($showmassiveactions) {
                     $massiveactionparams['ontop'] = false;
                     Html::showMassiveActions($itemtype, $massiveactionparams);
                     // End form for delete item
                     Html::closeForm();
                 } else {
                     echo "<br>";
                 }
             }
             if ($output_type == self::HTML_OUTPUT) {
                 // In case of HTML display
                 Html::printPager($p['start'], $numrows, $target, $parameters, '', 0, $search_config);
             }
         } else {
             echo self::showError($output_type);
         }
     } else {
         echo $DBread->error();
     }
 }
 static function showList($itemtype, $params)
 {
     global $DB, $CFG_GLPI, $LANG, $PLUGIN_HOOKS;
     // Instanciate an object to access method
     $item = NULL;
     if ($itemtype != 'States' && class_exists($itemtype)) {
         $item = new $itemtype();
     }
     $_SESSION['plugin_mobile']['rows_limit'] = 10;
     // sdb38l
     $_SESSION['plugin_mobile']['cols_limit'] = 5;
     // sdb38l
     $LIST_LIMIT = $_SESSION['plugin_mobile']['rows_limit'];
     // Default values of parameters
     $p['link'] = array();
     //
     $p['field'] = array();
     //
     $p['contains'] = array();
     //
     $p['searchtype'] = array();
     //
     $p['sort'] = '1';
     //
     $p['order'] = 'ASC';
     //
     $p['start'] = 0;
     //
     $p['is_deleted'] = 0;
     $p['export_all'] = 0;
     $p['link2'] = '';
     //
     $p['contains2'] = '';
     //
     $p['field2'] = '';
     //
     $p['itemtype2'] = '';
     $p['searchtype2'] = '';
     $p['showheader'] = true;
     foreach ($params as $key => $val) {
         $p[$key] = $val;
     }
     if ($p['export_all']) {
         $p['start'] = 0;
     }
     // Manage defautll seachtype value : for bookmark compatibility
     if (count($p['contains'])) {
         foreach ($p['contains'] as $key => $val) {
             if (!isset($p['searchtype'][$key])) {
                 $p['searchtype'][$key] = 'contains';
             }
         }
     }
     if (is_array($p['contains2']) && count($p['contains2'])) {
         foreach ($p['contains2'] as $key => $val) {
             if (!isset($p['searchtype2'][$key])) {
                 $p['searchtype2'][$key] = 'contains';
             }
         }
     }
     $target = Toolbox::getItemTypeSearchURL($itemtype);
     $limitsearchopt = Search::getCleanedOptions($itemtype);
     if (isset($CFG_GLPI['union_search_type'][$itemtype])) {
         $itemtable = $CFG_GLPI['union_search_type'][$itemtype];
     } else {
         $itemtable = getTableForItemType($itemtype);
     }
     // Set display type for export if define
     $output_type = Search::HTML_OUTPUT;
     if (isset($_GET['display_type'])) {
         $output_type = $_GET['display_type'];
         // Limit to 10 element
         if ($_GET['display_type'] == Search::GLOBAL_SEARCH) {
             $LIST_LIMIT = Search::GLOBAL_SEARCH_DISPLAY_COUNT;
         }
     }
     // hack for States
     if (isset($CFG_GLPI['union_search_type'][$itemtype])) {
         $entity_restrict = true;
     } else {
         $entity_restrict = $item->isEntityAssign();
     }
     $metanames = array();
     // Get the items to display
     $toview = Search::addDefaultToView($itemtype);
     // Add items to display depending of personal prefs
     $displaypref = DisplayPreference::getForTypeUser($itemtype, Session::getLoginUserID());
     if (count($displaypref)) {
         foreach ($displaypref as $val) {
             array_push($toview, $val);
         }
     }
     // Add searched items
     if (count($p['field']) > 0) {
         foreach ($p['field'] as $key => $val) {
             if (!in_array($val, $toview) && $val != 'all' && $val != 'view') {
                 array_push($toview, $val);
             }
         }
     }
     // Add order item
     if (!in_array($p['sort'], $toview)) {
         array_push($toview, $p['sort']);
     }
     // Special case for Ticket : put ID in front
     if ($itemtype == 'Ticket') {
         array_unshift($toview, 2);
     }
     // Clean toview array
     $toview = array_unique($toview);
     foreach ($toview as $key => $val) {
         if (!isset($limitsearchopt[$val])) {
             unset($toview[$key]);
         }
     }
     // delete entities display
     //var_dump($toview);
     if (array_search('80', $toview) !== false) {
         unset($toview[array_search('80', $toview)]);
     }
     $toview_count = count($toview);
     // Construct the request
     //// 1 - SELECT
     //$SELECT = "SELECT ".PluginMobileSearch::addDefaultSelect($itemtype);
     $SELECT = "SELECT '" . $_SESSION['glpiname'] . "' AS currentuser, " . PluginMobileSearch::addDefaultSelect($itemtype);
     // Add select for all toview item
     foreach ($toview as $key => $val) {
         $SELECT .= Search::addSelect($itemtype, $val, $key, 0);
     }
     //// 2 - FROM AND LEFT JOIN
     // Set reference table
     $FROM = " FROM `{$itemtable}`";
     // Init already linked tables array in order not to link a table several times
     $already_link_tables = array();
     // Put reference table
     array_push($already_link_tables, $itemtable);
     // Add default join
     $COMMONLEFTJOIN = Search::addDefaultJoin($itemtype, $itemtable, $already_link_tables);
     $FROM .= $COMMONLEFTJOIN;
     $searchopt = array();
     $searchopt[$itemtype] =& Search::getOptions($itemtype);
     // Add all table for toview items
     //foreach ($toview as $key => $val) {
     //   $FROM .= Search::addLeftJoin($itemtype,$itemtable,$already_link_tables,
     //                        $searchopt[$itemtype][$val]["table"],
     //                        $searchopt[$itemtype][$val]["linkfield"]);
     //}
     foreach ($toview as $key => $val) {
         $FROM .= self::addLeftJoin($itemtype, $itemtable, $already_link_tables, $searchopt[$itemtype][$val]["table"], $searchopt[$itemtype][$val]["linkfield"], 0, 0, $searchopt[$itemtype][$val]["joinparams"]);
     }
     // Search all case :
     //if (in_array("all",$p['field'])) {
     //   foreach ($searchopt[$itemtype] as $key => $val) {
     //      // Do not search on Group Name
     //      if (is_array($val)) {
     //         $FROM .= Search::addLeftJoin($itemtype,$itemtable,$already_link_tables,
     //                              $searchopt[$itemtype][$key]["table"],
     //                              $searchopt[$itemtype][$key]["linkfield"]);
     //      }
     //   }
     //}
     // Search all case :
     if (in_array("all", $p['field'])) {
         foreach ($searchopt[$itemtype] as $key => $val) {
             // Do not search on Group Name
             if (is_array($val)) {
                 $FROM .= self::addLeftJoin($itemtype, $itemtable, $already_link_tables, $searchopt[$itemtype][$key]["table"], $searchopt[$itemtype][$key]["linkfield"], 0, 0, $searchopt[$itemtype][$key]["joinparams"]);
             }
         }
     }
     //// 3 - WHERE
     // default string
     $COMMONWHERE = self::addDefaultWhere($itemtype);
     $first = empty($COMMONWHERE);
     // Add deleted if item have it
     if ($item && $item->maybeDeleted()) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         $COMMONWHERE .= $LINK . "`{$itemtable}`.`is_deleted` = '" . $p['is_deleted'] . "' ";
     }
     // Remove template items
     if ($item && $item->maybeTemplate()) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         $COMMONWHERE .= $LINK . "`{$itemtable}`.`is_template` = '0' ";
     }
     // Add Restrict to current entities
     if ($entity_restrict) {
         $LINK = " AND ";
         if ($first) {
             $LINK = " ";
             $first = false;
         }
         if ($itemtype == 'Entity') {
             $COMMONWHERE .= getEntitiesRestrictRequest($LINK, $itemtable, 'id', '', true);
         } else {
             if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
                 // Will be replace below in Union/Recursivity Hack
                 $COMMONWHERE .= $LINK . " ENTITYRESTRICT ";
             } else {
                 $COMMONWHERE .= getEntitiesRestrictRequest($LINK, $itemtable, '', '', $item->maybeRecursive());
             }
         }
     }
     $WHERE = "";
     $HAVING = "";
     // Add search conditions
     // If there is search items
     if ($_SESSION["glpisearchcount"][$itemtype] > 0 && count($p['contains']) > 0) {
         for ($key = 0; $key < $_SESSION["glpisearchcount"][$itemtype]; $key++) {
             // if real search (strlen >0) and not all and view search
             if (isset($p['contains'][$key]) && strlen($p['contains'][$key]) > 0) {
                 // common search
                 if ($p['field'][$key] != "all" && $p['field'][$key] != "view") {
                     $LINK = " ";
                     $NOT = 0;
                     $tmplink = "";
                     if (is_array($p['link']) && isset($p['link'][$key])) {
                         if (strstr($p['link'][$key], "NOT")) {
                             $tmplink = " " . str_replace(" NOT", "", $p['link'][$key]);
                             $NOT = 1;
                         } else {
                             $tmplink = " " . $p['link'][$key];
                         }
                     } else {
                         $tmplink = " AND ";
                     }
                     if (isset($searchopt[$itemtype][$p['field'][$key]]["usehaving"])) {
                         // Manage Link if not first item
                         if (!empty($HAVING)) {
                             $LINK = $tmplink;
                         }
                         // Find key
                         $item_num = array_search($p['field'][$key], $toview);
                         $HAVING .= Search::addHaving($LINK, $NOT, $itemtype, $p['field'][$key], $p['searchtype'][$key], $p['contains'][$key], 0, $item_num);
                     } else {
                         // Manage Link if not first item
                         if (!empty($WHERE)) {
                             $LINK = $tmplink;
                         }
                         $WHERE .= self::addWhere($LINK, $NOT, $itemtype, $p['field'][$key], $p['searchtype'][$key], $p['contains'][$key]);
                     }
                     // view and all search
                 } else {
                     $LINK = " OR ";
                     $NOT = 0;
                     $globallink = " AND ";
                     if (is_array($p['link']) && isset($p['link'][$key])) {
                         switch ($p['link'][$key]) {
                             case "AND":
                                 $LINK = " OR ";
                                 $globallink = " AND ";
                                 break;
                             case "AND NOT":
                                 $LINK = " AND ";
                                 $NOT = 1;
                                 $globallink = " AND ";
                                 break;
                             case "OR":
                                 $LINK = " OR ";
                                 $globallink = " OR ";
                                 break;
                             case "OR NOT":
                                 $LINK = " AND ";
                                 $NOT = 1;
                                 $globallink = " OR ";
                                 break;
                         }
                     } else {
                         $tmplink = " AND ";
                     }
                     // Manage Link if not first item
                     if (!empty($WHERE)) {
                         $WHERE .= $globallink;
                     }
                     $WHERE .= " ( ";
                     $first2 = true;
                     $items = array();
                     if ($p['field'][$key] == "all") {
                         $items = $searchopt[$itemtype];
                     } else {
                         // toview case : populate toview
                         foreach ($toview as $key2 => $val2) {
                             $items[$val2] = $searchopt[$itemtype][$val2];
                         }
                     }
                     foreach ($items as $key2 => $val2) {
                         if (is_array($val2)) {
                             // Add Where clause if not to be done in HAVING CLAUSE
                             if (!isset($val2["usehaving"])) {
                                 $tmplink = $LINK;
                                 if ($first2) {
                                     $tmplink = " ";
                                     $first2 = false;
                                 }
                                 $WHERE .= self::addWhere($tmplink, $NOT, $itemtype, $key2, $p['searchtype'][$key], $p['contains'][$key]);
                             }
                         }
                     }
                     $WHERE .= " ) ";
                 }
             }
         }
     }
     //// 4 - ORDER
     $ORDER = " ORDER BY `id` ";
     foreach ($toview as $key => $val) {
         if ($p['sort'] == $val) {
             $ORDER = self::addOrderBy($itemtype, $p['sort'], $p['order'], $key);
         }
     }
     //// 5 - META SEARCH
     // Preprocessing
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
         // a - SELECT
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 $SELECT .= self::addSelect($p['itemtype2'][$i], $p['field2'][$i], $i, 1, $p['itemtype2'][$i]);
             }
         }
         // b - ADD LEFT JOIN
         // Already link meta table in order not to linked a table several times
         $already_link_tables2 = array();
         // Link reference tables
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 if (!in_array(getTableForItemType($p['itemtype2'][$i]), $already_link_tables2)) {
                     $FROM .= Search::addMetaLeftJoin($itemtype, $p['itemtype2'][$i], $already_link_tables2, $p['contains2'][$i] == "NULL" || strstr($p['link2'][$i], "NOT"));
                 }
             }
         }
         // Link items tables
         for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
             if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                 if (!isset($searchopt[$p['itemtype2'][$i]])) {
                     $searchopt[$p['itemtype2'][$i]] =& self::getOptions($p['itemtype2'][$i]);
                 }
                 if (!in_array($searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["table"] . "_" . $p['itemtype2'][$i], $already_link_tables2)) {
                     $FROM .= self::addLeftJoin($p['itemtype2'][$i], getTableForItemType($p['itemtype2'][$i]), $already_link_tables2, $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["table"], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["linkfield"], 1, $p['itemtype2'][$i], $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["joinparams"]);
                 }
             }
         }
     }
     //// 6 - Add item ID
     // Add ID to the select
     if (!empty($itemtable)) {
         $SELECT .= "`{$itemtable}`.`id` AS id ";
     }
     //// 7 - Manage GROUP BY
     $GROUPBY = "";
     // Meta Search / Search All / Count tickets
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0 || !empty($HAVING) || in_array('all', $p['field'])) {
         $GROUPBY = " GROUP BY `{$itemtable}`.`id`";
     }
     if (empty($GROUPBY)) {
         foreach ($toview as $key2 => $val2) {
             if (!empty($GROUPBY)) {
                 break;
             }
             if (isset($searchopt[$itemtype][$val2]["forcegroupby"])) {
                 $GROUPBY = " GROUP BY `{$itemtable}`.`id`";
             }
         }
     }
     // Specific search for others item linked  (META search)
     if (is_array($p['itemtype2'])) {
         for ($key = 0; $key < $_SESSION["glpisearchcount2"][$itemtype]; $key++) {
             if (isset($p['itemtype2'][$key]) && !empty($p['itemtype2'][$key]) && isset($p['contains2'][$key]) && strlen($p['contains2'][$key]) > 0) {
                 $LINK = "";
                 // For AND NOT statement need to take into account all the group by items
                 if (strstr($p['link2'][$key], "AND NOT") || isset($searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["usehaving"])) {
                     $NOT = 0;
                     if (strstr($p['link2'][$key], "NOT")) {
                         $tmplink = " " . str_replace(" NOT", "", $p['link2'][$key]);
                         $NOT = 1;
                     } else {
                         $tmplink = " " . $p['link2'][$key];
                     }
                     if (!empty($HAVING)) {
                         $LINK = $tmplink;
                     }
                     $HAVING .= self::addHaving($LINK, $NOT, $p['itemtype2'][$key], $p['field2'][$key], $p['searchtype2'][$key], $p['contains2'][$key], 1, $key);
                 } else {
                     // Meta Where Search
                     $LINK = " ";
                     $NOT = 0;
                     // Manage Link if not first item
                     if (is_array($p['link2']) && isset($p['link2'][$key]) && strstr($p['link2'][$key], "NOT")) {
                         $tmplink = " " . str_replace(" NOT", "", $p['link2'][$key]);
                         $NOT = 1;
                     } else {
                         if (is_array($p['link2']) && isset($p['link2'][$key])) {
                             $tmplink = " " . $p['link2'][$key];
                         } else {
                             $tmplink = " AND ";
                         }
                     }
                     if (!empty($WHERE)) {
                         $LINK = $tmplink;
                     }
                     $WHERE .= self::addWhere($LINK, $NOT, $p['itemtype2'][$key], $p['field2'][$key], $p['searchtype2'][$key], $p['contains2'][$key], 1);
                 }
             }
         }
     }
     // Use a ReadOnly connection if available and configured to be used
     $DBread = DBConnection::getReadConnection();
     // If no research limit research to display item and compute number of item using simple request
     $nosearch = true;
     for ($i = 0; $i < $_SESSION["glpisearchcount"][$itemtype]; $i++) {
         if (isset($p['contains'][$i]) && strlen($p['contains'][$i]) > 0) {
             $nosearch = false;
         }
     }
     if ($_SESSION["glpisearchcount2"][$itemtype] > 0) {
         $nosearch = false;
     }
     $LIMIT = "";
     $numrows = 0;
     //No search : count number of items using a simple count(ID) request and LIMIT search
     if ($nosearch) {
         $LIMIT = " LIMIT " . $p['start'] . ", " . $LIST_LIMIT;
         // Force group by for all the type -> need to count only on table ID
         if (!isset($searchopt[$itemtype][1]['forcegroupby'])) {
             $count = "count(*)";
         } else {
             $count = "count(DISTINCT `{$itemtable}`.`id`)";
         }
         // request currentuser for SQL supervision, not displayed
         $query_num = "SELECT {$count}, '" . $_SESSION['glpiname'] . "' AS currentuser\n                       FROM `{$itemtable}`" . $COMMONLEFTJOIN;
         $first = true;
         if (!empty($COMMONWHERE)) {
             $LINK = " AND ";
             if ($first) {
                 $LINK = " WHERE ";
                 $first = false;
             }
             $query_num .= $LINK . $COMMONWHERE;
         }
         // Union Search :
         if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
             $tmpquery = $query_num;
             $numrows = 0;
             foreach ($CFG_GLPI[$CFG_GLPI["union_search_type"][$itemtype]] as $ctype) {
                 $ctable = getTableForItemType($ctype);
                 $citem = new $ctype();
                 if ($citem->canView()) {
                     // State case
                     if ($itemtype == 'States') {
                         $query_num = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                         $query_num .= " AND {$ctable}.`states_id` > '0' ";
                         // Add deleted if item have it
                         if ($citem && $citem->maybeDeleted()) {
                             $query_num .= " AND `{$ctable}`.`is_deleted` = '0' ";
                         }
                         // Remove template items
                         if ($citem && $citem->maybeTemplate()) {
                             $query_num .= " AND `{$ctable}`.`is_template` = '0' ";
                         }
                     } else {
                         // Ref table case
                         $reftable = getTableForItemType($itemtype);
                         $replace = "FROM `{$reftable}`\n                                 INNER JOIN `{$ctable}`\n                                 ON (`{$reftable}`.`items_id`=`{$ctable}`.`id`\n                                    AND `{$reftable}`.`itemtype` = '{$ctype}')";
                         $query_num = str_replace("FROM `" . $CFG_GLPI["union_search_type"][$itemtype] . "`", $replace, $tmpquery);
                         $query_num = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $query_num);
                     }
                     $query_num = str_replace("ENTITYRESTRICT", getEntitiesRestrictRequest('', $ctable, '', '', $citem->maybeRecursive()), $query_num);
                     $result_num = $DBread->query($query_num);
                     $numrows += $DBread->result($result_num, 0, 0);
                 }
             }
         } else {
             $result_num = $DBread->query($query_num);
             $numrows = $DBread->result($result_num, 0, 0);
         }
     }
     // If export_all reset LIMIT condition
     if ($p['export_all']) {
         $LIMIT = "";
     }
     if (!empty($WHERE) || !empty($COMMONWHERE)) {
         if (!empty($COMMONWHERE)) {
             $WHERE = ' WHERE ' . $COMMONWHERE . (!empty($WHERE) ? ' AND ( ' . $WHERE . ' )' : '');
         } else {
             $WHERE = ' WHERE ' . $WHERE . ' ';
         }
         $first = false;
     }
     if (!empty($HAVING)) {
         $HAVING = ' HAVING ' . $HAVING;
     }
     $DB->query("SET SESSION group_concat_max_len = 9999999;");
     // Create QUERY
     if (isset($CFG_GLPI["union_search_type"][$itemtype])) {
         $first = true;
         $QUERY = "";
         foreach ($CFG_GLPI[$CFG_GLPI["union_search_type"][$itemtype]] as $ctype) {
             $ctable = getTableForItemType($ctype);
             $citem = new $ctype();
             if ($citem->canView()) {
                 if ($first) {
                     $first = false;
                 } else {
                     $QUERY .= " UNION ";
                 }
                 $tmpquery = "";
                 // State case
                 if ($itemtype == 'States') {
                     $tmpquery = $SELECT . ", '{$ctype}' AS TYPE " . $FROM . $WHERE;
                     $tmpquery = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                     $tmpquery .= " AND `{$ctable}`.`states_id` > '0' ";
                     // Add deleted if item have it
                     if ($citem && $citem->maybeDeleted()) {
                         $tmpquery .= " AND `{$ctable}`.`is_deleted` = '0' ";
                     }
                     // Remove template items
                     if ($citem && $citem->maybeTemplate()) {
                         $tmpquery .= " AND `{$ctable}`.`is_template` = '0' ";
                     }
                 } else {
                     // Ref table case
                     $reftable = getTableForItemType($itemtype);
                     $tmpquery = $SELECT . ", '{$ctype}' AS TYPE, `{$reftable}`.`id` AS refID, " . "`{$ctable}`.`entities_id` AS ENTITY " . $FROM . $WHERE;
                     $replace = "FROM `{$reftable}`" . " INNER JOIN `{$ctable}`" . " ON (`{$reftable}`.`items_id`=`{$ctable}`.`id`" . " AND `{$reftable}`.`itemtype` = '{$ctype}')";
                     $tmpquery = str_replace("FROM `" . $CFG_GLPI["union_search_type"][$itemtype] . "`", $replace, $tmpquery);
                     $tmpquery = str_replace($CFG_GLPI["union_search_type"][$itemtype], $ctable, $tmpquery);
                 }
                 $tmpquery = str_replace("ENTITYRESTRICT", getEntitiesRestrictRequest('', $ctable, '', '', $citem->maybeRecursive()), $tmpquery);
                 // SOFTWARE HACK
                 if ($ctype == 'Software') {
                     $tmpquery = str_replace("glpi_softwares.serial", "''", $tmpquery);
                     $tmpquery = str_replace("glpi_softwares.otherserial", "''", $tmpquery);
                 }
                 $QUERY .= $tmpquery;
             }
         }
         if (empty($QUERY)) {
             echo Search::showError($output_type);
             return;
         }
         $QUERY .= str_replace($CFG_GLPI["union_search_type"][$itemtype] . ".", "", $ORDER) . $LIMIT;
     } else {
         $QUERY = $SELECT . $FROM . $WHERE . $GROUPBY . $HAVING . $ORDER . $LIMIT;
     }
     $DBread->query("SET SESSION group_concat_max_len = 4096;");
     $result = $DBread->query($QUERY);
     if ($result2 = $DBread->query('SHOW WARNINGS')) {
         if ($DBread->numrows($result2) > 0) {
             $data = $DBread->fetch_assoc($result2);
             if ($data['Code'] == 1260) {
                 $DBread->query("SET SESSION group_concat_max_len = 4194304;");
                 $result = $DBread->query($QUERY);
             }
         }
     }
     if ($result) {
         // if real search or complete export : get numrows from request
         if (!$nosearch || $p['export_all']) {
             $numrows = $DBread->numrows($result);
         }
         // Contruct Pager parameters
         $globallinkto = "";
         if (count($p['field']) > 0) {
             $globallinkto .= self::getArrayUrlLink("field", $p['field']);
         }
         if ($p['link'] != '') {
             $globallinkto .= self::getArrayUrlLink("link", $p['link']);
         }
         if ($p['contains'] != array("")) {
             $globallinkto .= self::getArrayUrlLink("contains", $p['contains']);
         }
         if (count($p['field2']) > 0) {
             $globallinkto .= self::getArrayUrlLink("field2", $p['field2']);
         }
         if ($p['contains2'] != array("")) {
             $globallinkto .= self::getArrayUrlLink("contains2", $p['contains2']);
         }
         if ($p['itemtype2'] != '') {
             $globallinkto .= self::getArrayUrlLink("itemtype2", $p['itemtype2']);
         }
         if ($p['link2'] != '') {
             $globallinkto .= self::getArrayUrlLink("link2", $p['link2']);
         }
         $parameters = "sort=" . $p['sort'] . "&amp;order=" . $p['order'] . $globallinkto;
         if ($output_type == Search::GLOBAL_SEARCH) {
             if (class_exists($itemtype)) {
                 echo "<div class='center'><h2>" . $item->getTypeName();
                 // More items
                 if ($numrows > $p['start'] + Search::GLOBAL_SEARCH_DISPLAY_COUNT) {
                     echo " <a href='{$target}?{$parameters}' data-back='false'>" . $LANG['common'][66] . "</a>";
                 }
                 echo "</h2></div>\n";
             } else {
                 return false;
             }
         }
         // If the begin of the view is before the number of items
         if ($p['start'] < $numrows) {
             // Form to massive actions
             $isadmin = false;
             // Compute number of columns to display
             // Add toview elements
             $nbcols = $toview_count;
             $already_printed = array();
             // Add meta search elements if real search (strlen>0) or only NOT search
             if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
                 for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
                     if (isset($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0 && !empty($p['itemtype2'][$i]) && (!isset($p['link2'][$i]) || !strstr($p['link2'][$i], "NOT"))) {
                         if (!isset($already_printed[$p['itemtype2'][$i] . $p['field2'][$i]])) {
                             $nbcols++;
                             $already_printed[$p['itemtype2'][$i] . $p['field2'][$i]] = 1;
                         }
                     }
                 }
             }
             if ($output_type == Search::HTML_OUTPUT) {
                 // HTML display - massive modif
                 $nbcols++;
             }
             // Define begin and end var for loop
             // Search case
             $begin_display = $p['start'];
             $end_display = $p['start'] + $LIST_LIMIT;
             // No search Case
             if ($nosearch) {
                 $begin_display = 0;
                 $end_display = min($numrows - $p['start'], $LIST_LIMIT);
             }
             // Export All case
             if ($p['export_all']) {
                 $begin_display = 0;
                 $end_display = $numrows;
             }
             // Display List Header
             echo PluginMobileSearch::showHeader($output_type, $end_display - $begin_display + 1, $nbcols);
             // New Line for Header Items Line
             echo self::showNewLine($output_type);
             $header_num = 1;
             if ($output_type == Search::HTML_OUTPUT) {
                 // HTML display - massive modif
                 $search_config = "";
                 echo PluginMobileSearch::showHeaderItem($output_type, $search_config, $header_num, "", 0, $p['order']);
             }
             if ($p['showheader']) {
                 // Display column Headers for toview items
                 echo "<div data-type='horizontal' data-role='controlgroup' class='mobile_list_header'>";
                 $cpt = 0;
                 foreach ($toview as $key => $val) {
                     $linkto = '';
                     if (!isset($searchopt[$itemtype][$val]['nosort']) || !$searchopt[$itemtype][$val]['nosort']) {
                         /*$linkto = "$target?itemtype=$itemtype&amp;sort=".$val."&amp;order=".($p['order']=="ASC"?"DESC":"ASC").
                           "&amp;start=".$p['start'].$globallinkto;*/
                         $linkto = "search.php?itemtype={$itemtype}&amp;menu=" . $_GET['menu'] . "&amp;ssmenu=" . $_GET['ssmenu'] . "&amp;sort=" . $val . "&amp;order=" . ($p['order'] == "ASC" ? "DESC" : "ASC") . "&amp;start=" . $p['start'] . $globallinkto;
                     }
                     echo PluginMobileSearch::showHeaderItem($output_type, $searchopt[$itemtype][$val]["name"], $header_num, $linkto, $p['sort'] == $val, $p['order']);
                     $cpt++;
                     if ($cpt == $_SESSION['plugin_mobile']['cols_limit']) {
                         break;
                     }
                 }
                 echo "<a href='searchconfig.php?type=global&amp;itemtype={$itemtype}&amp;rand=" . mt_rand() . "' data-icon='plus'\n                  data-role='button' class='button-header'>&nbsp;</a>";
                 echo "</div>";
                 // Display columns Headers for meta items
                 $already_printed = array();
                 if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
                     for ($i = 0; $i < $_SESSION["glpisearchcount2"][$itemtype]; $i++) {
                         if (isset($p['itemtype2'][$i]) && !empty($p['itemtype2'][$i]) && isset($p['contains2'][$i]) && strlen($p['contains2'][$i]) > 0) {
                             if (!isset($already_printed[$p['itemtype2'][$i] . $p['field2'][$i]])) {
                                 if (!isset($metanames[$p['itemtype2'][$i]])) {
                                     $metaitem = new $p['itemtype2'][$i]();
                                     echo PluginMobileSearch::showHeaderItem($output_type, $metanames[$p['itemtype2'][$i]] . " - " . $searchopt[$p['itemtype2'][$i]][$p['field2'][$i]]["name"], $header_num);
                                     $already_printed[$p['itemtype2'][$i] . $p['field2'][$i]] = 1;
                                 }
                             }
                         }
                     }
                 }
                 // End Line for column headers
                 echo PluginMobileSearch::showEndLine($output_type);
             }
             // if real search seek to begin of items to display (because of complete search)
             if (!$nosearch) {
                 $DB->data_seek($result, $p['start']);
             }
             // Define begin and end var for loop
             // Search case
             $i = $begin_display;
             // Init list of items displayed
             if ($output_type == Search::HTML_OUTPUT) {
                 Session::initNavigateListItems($itemtype);
             }
             // Num of the row (1=header_line)
             $row_num = 1;
             // Display Loop
             while ($i < $numrows && $i < $end_display) {
                 // Column num
                 $item_num = 1;
                 // Get data and increment loop variables
                 $data = $DBread->fetch_assoc($result);
                 $i++;
                 $row_num++;
                 // New line
                 // Add item in item list
                 Session::addToNavigateListItems($itemtype, $data["id"]);
                 /*if ($output_type==Search::HTML_OUTPUT) { // HTML display - massive modif
                                   $tmpcheck="";
                                   if ($isadmin) {
                                      if ($itemtype == 'Entity'
                                         && !in_array($data["id"],$_SESSION["glpiactiveentities"])) {
                 
                                         $tmpcheck="&nbsp;";
                                      } else if ($item->maybeRecursive()
                                               && !in_array($data["entities_id"],$_SESSION["glpiactiveentities"])) {
                                         $tmpcheck="&nbsp;";
                                      } else {
                                         $sel="";
                                         if (isset($_GET["select"]) && $_GET["select"]=="all") {
                                            $sel="checked";
                                         }
                                         if (isset($_SESSION['glpimassiveactionselected'][$data["id"]])) {
                                            $sel="checked";
                                         }
                                         $tmpcheck="<input type='checkbox' name='item[".$data["id"]."]' value='1' $sel>";
                                      }
                                   }
                                   echo PluginMobileSearch::showItem($output_type,$tmpcheck,$item_num,$row_num,"width='10'");
                                }*/
                 // Print other toview items
                 $itemsToShow = array();
                 $cpt = 0;
                 foreach ($toview as $key => $val) {
                     $itemsToShow[] = PluginMobileSearch::showItem($output_type, PluginMobileSearch::giveItem($itemtype, $val, $data, $key), $item_num, $row_num, self::displayConfigItem($itemtype, $val, $data, $key));
                     $cpt++;
                     if ($cpt == $_SESSION['plugin_mobile']['cols_limit']) {
                         break;
                     }
                 }
                 // Print Meta Item
                 if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && is_array($p['itemtype2'])) {
                     for ($j = 0; $j < $_SESSION["glpisearchcount2"][$itemtype]; $j++) {
                         if (isset($p['itemtype2'][$j]) && !empty($p['itemtype2'][$j]) && isset($p['contains2'][$j]) && strlen($p['contains2'][$j]) > 0) {
                             // General case
                             if (strpos($data["META_{$j}"], "\$\$\$\$") === false) {
                                 $out = self::giveItem($p['itemtype2'][$j], $p['field2'][$j], $data, $j, 1);
                                 $itemsToShow[] = PluginMobileSearch::showItem($output_type, $out, $item_num, $row_num);
                                 // Case of GROUP_CONCAT item : split item and multilline display
                             } else {
                                 $split = explode("\$\$\$\$", $data["META_{$j}"]);
                                 $count_display = 0;
                                 $out = "";
                                 $unit = "";
                                 $separate = '<br>';
                                 if (isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['splititems']) && $searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['splititems']) {
                                     $separate = '<hr>';
                                 }
                                 if (isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['unit'])) {
                                     $unit = $searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['unit'];
                                 }
                                 for ($k = 0; $k < count($split); $k++) {
                                     if ($p['contains2'][$j] == "NULL" || strlen($p['contains2'][$j]) == 0 || preg_match('/' . $p['contains2'][$j] . '/i', $split[$k]) || isset($searchopt[$p['itemtype2'][$j]][$p['field2'][$j]]['forcegroupby'])) {
                                         if ($count_display) {
                                             $out .= $separate;
                                         }
                                         $count_display++;
                                         // Manage Link to item
                                         $split2 = explode("\$\$", $split[$k]);
                                         if (isset($split2[1])) {
                                             $out .= "<a href=\"" . getItemTypeFormURLMobile($p['itemtype2'][$j]) . "?id=" . $split2[1] . "\" data-back='false'>";
                                             $out .= $split2[0] . $unit;
                                             if ($_SESSION["glpiis_ids_visible"] || empty($split2[0])) {
                                                 $out .= " (" . $split2[1] . ")";
                                             }
                                             $out .= "</a>";
                                         } else {
                                             $out .= $split[$k] . $unit;
                                         }
                                     }
                                 }
                                 $itemsToShow[] = PluginMobileSearch::showItem($output_type, $out, $item_num, $row_num);
                             }
                         }
                     }
                 }
                 // Specific column display
                 if ($itemtype == 'CartridgeItem') {
                     $itemsToShow[] = PluginMobileSearch::showItem($output_type, Cartridge::getCount($data["id"], $data["ALARM"], $output_type), $item_num, $row_num);
                 }
                 if ($itemtype == 'ConsumableItem') {
                     $itemsToShow[] = PluginMobileSearch::showItem($output_type, Consumable::getCount($data["id"], $data["ALARM"], $output_type), $item_num, $row_num);
                 }
                 if ($itemtype == 'States' || $itemtype == 'ReservationItem') {
                     $typename = $data["TYPE"];
                     if (class_exists($data["TYPE"])) {
                         $itemtmp = new $data["TYPE"]();
                         $typename = $itemtmp->getTypeName();
                     }
                     $itemsToShow[] = PluginMobileSearch::showItem($output_type, $typename, $item_num, $row_num);
                 }
                 if ($itemtype == 'ReservationItem' && $output_type == Search::HTML_OUTPUT) {
                     if (Session::haveRight("reservation_central", UPDATE)) {
                         if (!haveAccessToEntity($data["ENTITY"])) {
                             $itemsToShow[] = PluginMobileSearch::showItem($output_type, "&nbsp;", $item_num, $row_num);
                             $itemsToShow[] = PluginMobileSearch::showItem($output_type, "&nbsp;", $item_num, $row_num);
                         } else {
                             $itemsToShow[] = PluginMobileSearch::showItem($output_type, "<a href=\"" . getItemTypeFormURLMobile($itemtype) . "?id=" . $data["refID"] . "&amp;is_active=" . ($data["ACTIVE"] ? 0 : 1) . "&amp;update=update\" " . "title='" . ($data["ACTIVE"] ? $LANG['buttons'][42] : $LANG['buttons'][41]) . "' data-back='false'><img src=\"" . $CFG_GLPI["root_doc"] . "/pics/" . ($data["ACTIVE"] ? "moins" : "plus") . ".png\" alt='' title=''></a>", $item_num, $row_num, "class='center'");
                             /*echo PluginMobileSearch::showItem($output_type,"<a href=\"javascript:confirmAction('".
                               addslashes($LANG['reservation'][38])."\\n".
                               addslashes($LANG['reservation'][39])."','".
                               Toolbox::getItemTypeFormURL($itemtype)."?id=".$data["refID"].
                               "&amp;delete=delete')\" title='".
                               $LANG['reservation'][6]."'><img src=\"".
                               $CFG_GLPI["root_doc"]."/pics/delete.png\" alt='' title=''></a>",
                               $item_num,$row_num,"class='center'");*/
                         }
                     }
                     if ($data["ACTIVE"]) {
                         $itemsToShow[] = PluginMobileSearch::showItem($output_type, "<a href='reservation.php?reservationitems_id=" . $data["refID"] . "' title='" . $LANG['reservation'][21] . "' data-back='false'><img src=\"" . $CFG_GLPI["root_doc"] . "/pics/reservation-3.png\" alt='' title=''></a>", $item_num, $row_num, "class='center'");
                     } else {
                         $itemsToShow[] = PluginMobileSearch::showItem($output_type, "&nbsp;", $item_num, $row_num);
                     }
                 }
                 echo PluginMobileSearch::showNewLine($output_type, $i % 2);
                 foreach ($itemsToShow as $item) {
                     echo $item;
                 }
                 // End Line
                 echo PluginMobileSearch::showEndLine($output_type);
             }
             $title = "";
             // Create title
             if ($output_type == Search::PDF_OUTPUT_LANDSCAPE || $output_type == Search::PDF_OUTPUT_PORTRAIT) {
                 if ($_SESSION["glpisearchcount"][$itemtype] > 0 && count($p['contains']) > 0) {
                     for ($key = 0; $key < $_SESSION["glpisearchcount"][$itemtype]; $key++) {
                         if (strlen($p['contains'][$key]) > 0) {
                             if (isset($p["link"][$key])) {
                                 $title .= " " . $p["link"][$key] . " ";
                             }
                             switch ($p['field'][$key]) {
                                 case "all":
                                     $title .= $LANG['common'][66];
                                     break;
                                 case "view":
                                     $title .= $LANG['search'][11];
                                     break;
                                 default:
                                     $title .= $searchopt[$itemtype][$p['field'][$key]]["name"];
                             }
                             $title .= " = " . $p['contains'][$key];
                         }
                     }
                 }
                 if ($_SESSION["glpisearchcount2"][$itemtype] > 0 && count($p['contains2']) > 0) {
                     for ($key = 0; $key < $_SESSION["glpisearchcount2"][$itemtype]; $key++) {
                         if (strlen($p['contains2'][$key]) > 0) {
                             if (isset($p['link2'][$key])) {
                                 $title .= " " . $p['link2'][$key] . " ";
                             }
                             $title .= $metanames[$p['itemtype2'][$key]] . "/";
                             $title .= $searchopt[$p['itemtype2'][$key]][$p['field2'][$key]]["name"];
                             $title .= " = " . $p['contains2'][$key];
                         }
                     }
                 }
             }
             // Display footer
             echo PluginMobileSearch::showFooter($output_type, $title);
             // Delete selected item
             if ($output_type == Search::HTML_OUTPUT) {
                 if ($isadmin) {
                     openArrowMassives("massiveaction_form");
                     Dropdown::showForMassiveAction($itemtype, $p['is_deleted']);
                     closeArrowMassives();
                     // End form for delete item
                     //echo "</form>\n";
                     Html::closeForm();
                 } else {
                     echo "<br>";
                 }
             }
         } else {
             echo Search::showError($output_type);
         }
     } else {
         echo $DBread > error();
     }
     // Clean selection
     $_SESSION['glpimassiveactionselected'] = array();
     //echo $QUERY;
     return $numrows;
 }
 static function isThisItemCheckRule($parm)
 {
     global $DB;
     $itemtype = get_class($parm);
     $items_id = $parm->fields['id'];
     $session_glpisearch = array();
     if (isset($_SESSION['glpisearch'])) {
         $session_glpisearch = $_SESSION['glpisearch'];
     }
     $session_glpisearchcount = array();
     if (isset($_SESSION['glpisearchcount'])) {
         $session_glpisearchcount = $_SESSION['glpisearchcount'];
     }
     $session_glpisearchcount2 = array();
     if (isset($_SESSION['glpisearchcount2'])) {
         $session_glpisearchcount2 = $_SESSION['glpisearchcount2'];
     }
     $a_find = array();
     $pmComponentscatalog_rule = new PluginMonitoringComponentscatalog_rule();
     $pmComponentscatalog = new PluginMonitoringComponentscatalog();
     $query = "SELECT * FROM `" . $pmComponentscatalog_rule->getTable() . "`\n         WHERE `itemtype`='" . $itemtype . "'";
     $result = $DB->query($query);
     $get_tmp = array();
     if (isset($_GET)) {
         $get_tmp = $_GET;
     }
     while ($data = $DB->fetch_array($result)) {
         if (!isset($_SESSION['glpiactiveentities_string'])) {
             $_SESSION['glpiactiveentities_string'] = $parm->fields['entities_id'];
         }
         // Load right entity
         $pmComponentscatalog->getFromDB($data['plugin_monitoring_componentscalalog_id']);
         $default_entity = 0;
         if (isset($_SESSION['glpiactive_entity'])) {
             $default_entity = $_SESSION['glpiactive_entity'];
         }
         $entities_isrecursive = 0;
         if (isset($_SESSION['glpiactiveentities']) and count($_SESSION['glpiactiveentities']) > 1) {
             $entities_isrecursive = 1;
         }
         if (!isset($_SESSION['glpiactiveprofile']['entities'])) {
             $_SESSION['glpiactiveprofile']['entities'] = array($pmComponentscatalog->fields['entities_id'] => array('id' => $pmComponentscatalog->fields['entities_id'], 'name' => '', 'is_recursive' => $pmComponentscatalog->fields['is_recursive']));
         }
         Session::changeActiveEntities($pmComponentscatalog->fields['entities_id'], $pmComponentscatalog->fields['is_recursive']);
         $itemtype = $data['itemtype'];
         $condition = importArrayFromDB($data['condition']);
         $params = Search::manageParams($itemtype, $condition, FALSE);
         $datar = Search::prepareDatasForSearch($itemtype, $params);
         Search::constructSQL($datar);
         $DBread = DBConnection::getReadConnection();
         $DBread->query("SET SESSION group_concat_max_len = 16384;");
         $resultr = $DBread->query($datar['sql']['search']);
         /// Check group concat limit : if warning : increase limit
         if ($result2 = $DBread->query('SHOW WARNINGS')) {
             if ($DBread->numrows($result2) > 0) {
                 $res = $DBread->fetch_assoc($result2);
                 if ($res['Code'] == 1260) {
                     $DBread->query("SET SESSION group_concat_max_len = 4194304;");
                     $resultr = $DBread->query($datar['sql']['search']);
                 }
             }
         }
         $find = 0;
         while ($datar = $DB->fetch_array($resultr)) {
             if ($datar['id'] == $items_id) {
                 $find = 1;
                 break;
             }
         }
         if ($find == 1) {
             $a_find[$data['plugin_monitoring_componentscalalog_id']] = 1;
         } else {
             if (!isset($a_find[$data['plugin_monitoring_componentscalalog_id']])) {
                 $a_find[$data['plugin_monitoring_componentscalalog_id']] = 0;
             }
         }
         // Reload current entity
         Session::changeActiveEntities($default_entity, $entities_isrecursive);
     }
     if (count($get_tmp) > 0) {
         $_GET = $get_tmp;
     }
     $pmComponentscatalog_Host = new PluginMonitoringComponentscatalog_Host();
     foreach ($a_find as $componentscalalog_id => $is_present) {
         if ($is_present == '0') {
             // * Remove from dynamic if present
             $query = "SELECT * FROM `glpi_plugin_monitoring_componentscatalogs_hosts`\n               WHERE `plugin_monitoring_componentscalalog_id`='" . $componentscalalog_id . "'\n                  AND `itemtype`='" . $itemtype . "'\n                  AND `items_id`='" . $items_id . "'\n                  AND`is_static`='0'";
             $result = $DB->query($query);
             while ($data = $DB->fetch_array($result)) {
                 $pmComponentscatalog_Host->delete(array('id' => $data['id']));
             }
         } else {
             //  add if not present
             $query = "SELECT * FROM `glpi_plugin_monitoring_componentscatalogs_hosts`\n               WHERE `plugin_monitoring_componentscalalog_id`='" . $componentscalalog_id . "'\n                  AND `itemtype`='" . $itemtype . "'\n                  AND `items_id`='" . $items_id . "'\n                     LIMIT 1";
             $result = $DB->query($query);
             if ($DB->numrows($result) == '0') {
                 $input = array();
                 $input['plugin_monitoring_componentscalalog_id'] = $componentscalalog_id;
                 $input['is_static'] = '0';
                 $input['items_id'] = $items_id;
                 $input['itemtype'] = $itemtype;
                 $pmComponentscatalog_Host->add($input);
             } else {
                 $data2 = $DB->fetch_assoc($result);
                 // modify entity of services (if entity of device is changed)
                 $item = new $itemtype();
                 $item->getFromDB($items_id);
                 $queryu = "UPDATE `glpi_plugin_monitoring_services`\n                     SET `entities_id`='" . $item->fields['entities_id'] . "'\n                        WHERE `plugin_monitoring_componentscatalogs_hosts_id`='" . $data2['id'] . "'";
                 $DB->query($queryu);
             }
         }
     }
     if ($itemtype == 'NetworkEquipment') {
         //Get networkports
         $pmComponentscatalog_rule->isThisItemCheckRuleNetworkport($parm);
     }
     $_SESSION['glpisearch'] = $session_glpisearch;
     $_SESSION['glpisearchcount'] = $session_glpisearchcount;
     $_SESSION['glpisearchcount2'] = $session_glpisearchcount2;
 }