KnowbaseItem::getListRequest PHP Method

getListRequest() static public method

Build request for showList
static public getListRequest ( array $params, $type = 'search' ) : String
$params array array (contains, knowbaseitemcategories_id, faq)
$type string search type : browse / search (default search)
return String : SQL request
    static function getListRequest(array $params, $type = 'search')
    {
        global $DB;
        // Lists kb Items
        $where = "";
        $order = "";
        $score = "";
        $addselect = "";
        $join = self::addVisibilityJoins(true);
        switch ($type) {
            case 'myunpublished':
                break;
            case 'allmy':
                break;
            case 'allunpublished':
                break;
            default:
                // Build query
                if (Session::getLoginUserID() && $type != 'myunpublished') {
                    $where = self::addVisibilityRestrict();
                } else {
                    // Anonymous access
                    if (Session::isMultiEntitiesMode()) {
                        $where = " (`glpi_entities_knowbaseitems`.`entities_id` = '0'\n                              AND `glpi_entities_knowbaseitems`.`is_recursive` = '1')";
                    }
                }
                break;
        }
        if (empty($where)) {
            $where = '1 = 1';
        }
        if ($params['faq']) {
            // helpdesk
            $where .= " AND (`glpi_knowbaseitems`.`is_faq` = '1')";
        }
        if (KnowbaseItemTranslation::isKbTranslationActive() && countElementsInTable('glpi_knowbaseitemtranslations') > 0) {
            $join .= "LEFT JOIN `glpi_knowbaseitemtranslations`\n                     ON (`glpi_knowbaseitems`.`id` = `glpi_knowbaseitemtranslations`.`knowbaseitems_id`\n                         AND `glpi_knowbaseitemtranslations`.`language` = '" . $_SESSION['glpilanguage'] . "')";
            $addselect .= ", `glpi_knowbaseitemtranslations`.`name` AS transname,\n                          `glpi_knowbaseitemtranslations`.`answer` AS transanswer ";
        }
        // a search with $contains
        switch ($type) {
            case 'allmy':
                $where .= " AND `glpi_knowbaseitems`.`users_id` = '" . Session::getLoginUserID() . "'";
                break;
            case 'myunpublished':
                $where .= " AND `glpi_knowbaseitems`.`users_id` = '" . Session::getLoginUserID() . "'\n                        AND (`glpi_entities_knowbaseitems`.`entities_id` IS NULL\n                              AND `glpi_knowbaseitems_profiles`.`profiles_id` IS NULL\n                              AND `glpi_groups_knowbaseitems`.`groups_id` IS NULL\n                              AND `glpi_knowbaseitems_users`.`users_id` IS NULL)";
                break;
            case 'allunpublished':
                // Only published
                $where .= " AND (`glpi_entities_knowbaseitems`.`entities_id` IS NULL\n                              AND `glpi_knowbaseitems_profiles`.`profiles_id` IS NULL\n                              AND `glpi_groups_knowbaseitems`.`groups_id` IS NULL\n                              AND `glpi_knowbaseitems_users`.`users_id` IS NULL)";
                break;
            case 'search':
                if (strlen($params["contains"]) > 0) {
                    $search = Toolbox::unclean_cross_side_scripting_deep($params["contains"]);
                    $search_wilcard = explode(' ', $search);
                    $search_wilcard = implode('* ', $search_wilcard) . '*';
                    $addscore = array();
                    if (KnowbaseItemTranslation::isKbTranslationActive() && countElementsInTable('glpi_knowbaseitemtranslations') > 0) {
                        $addscore = array('`glpi_knowbaseitemtranslations`.`name`', '`glpi_knowbaseitemtranslations`.`answer`');
                    }
                    $score = " ,(MATCH(`glpi_knowbaseitems`.`name`, `glpi_knowbaseitems`.`answer`)\n                           AGAINST('{$search_wilcard}' IN BOOLEAN MODE)";
                    if (!empty($addscore)) {
                        foreach ($addscore as $addscore_field) {
                            $score .= " + MATCH({$addscore_field})\n                                        AGAINST('{$search_wilcard}' IN BOOLEAN MODE)";
                        }
                    }
                    $score .= " ) AS SCORE ";
                    $where_1 = $where . " AND (MATCH(`glpi_knowbaseitems`.`name`,\n                                             `glpi_knowbaseitems`.`answer`)\n                          AGAINST('{$search_wilcard}' IN BOOLEAN MODE) ";
                    if (!empty($addscore)) {
                        foreach ($addscore as $addscore_field) {
                            $where_1 .= "OR {$addscore_field} IS NOT NULL\n                                    AND MATCH({$addscore_field})\n                                        AGAINST('{$search_wilcard}' IN BOOLEAN MODE)";
                        }
                    }
                    $where_1 .= ")";
                    // Add visibility date
                    $where_1 .= " AND (`glpi_knowbaseitems`.`begin_date` IS NULL\n                                   OR `glpi_knowbaseitems`.`begin_date` < NOW())\n                             AND (`glpi_knowbaseitems`.`end_date` IS NULL\n                                  OR `glpi_knowbaseitems`.`end_date` > NOW()) ";
                    $order = "ORDER BY `SCORE` DESC";
                    // preliminar query to allow alternate search if no result with fulltext
                    $query_1 = "SELECT COUNT(`glpi_knowbaseitems`.`id`)\n                             FROM `glpi_knowbaseitems`\n                             {$join}\n                             WHERE {$where_1}";
                    $result_1 = $DB->query($query_1);
                    $numrows_1 = $DB->result($result_1, 0, 0);
                    if ($numrows_1 <= 0) {
                        // not result this fulltext try with alternate search
                        $search1 = array('/\\\\"/', "/\\+/", "/\\*/", "/~/", "/</", "/>/", "/\\(/", "/\\)/", "/\\-/");
                        $contains = preg_replace($search1, "", $params["contains"]);
                        $addwhere = '';
                        if (KnowbaseItemTranslation::isKbTranslationActive() && countElementsInTable('glpi_knowbaseitemtranslations') > 0) {
                            $addwhere = " OR `glpi_knowbaseitemtranslations`.`name` " . Search::makeTextSearch($contains) . "\n                                    OR `glpi_knowbaseitemtranslations`.`answer` " . Search::makeTextSearch($contains);
                        }
                        $where .= " AND (`glpi_knowbaseitems`.`name` " . Search::makeTextSearch($contains) . "\n                                 OR `glpi_knowbaseitems`.`answer` " . Search::makeTextSearch($contains) . "\n                                 {$addwhere})";
                    } else {
                        $where = $where_1;
                    }
                }
                break;
            case 'browse':
                $where .= " AND (`glpi_knowbaseitems`.`knowbaseitemcategories_id`\n                           = '" . $params["knowbaseitemcategories_id"] . "')";
                // Add visibility date
                $where .= " AND (`glpi_knowbaseitems`.`begin_date` IS NULL\n                             OR `glpi_knowbaseitems`.`begin_date` < NOW())\n                        AND (`glpi_knowbaseitems`.`end_date` IS NULL\n                             OR `glpi_knowbaseitems`.`end_date` > NOW()) ";
                $order = " ORDER BY `glpi_knowbaseitems`.`name` ASC";
                break;
        }
        $query = "SELECT DISTINCT `glpi_knowbaseitems`.*,\n                       `glpi_knowbaseitemcategories`.`completename` AS category\n                       {$addselect}\n                       {$score}\n                FROM `glpi_knowbaseitems`\n                {$join}\n                LEFT JOIN `glpi_knowbaseitemcategories`\n                     ON (`glpi_knowbaseitemcategories`.`id`\n                           = `glpi_knowbaseitems`.`knowbaseitemcategories_id`)\n                WHERE {$where}\n                {$order}";
        return $query;
    }

Usage Example

示例#1
0
 /**
  * Get a list of KB/FAQ articles
  * for an authenticated user (or anonymous if allowed from config)
  *
  * @param $params array of options
  * @param $protocol the commonication protocol used
  **/
 static function methodListKnowBaseItems($params, $protocol)
 {
     global $DB, $CFG_GLPI;
     if (isset($params['help'])) {
         return array('start' => 'integer,optional', 'limit' => 'integer,optional', 'contains' => 'string,optional', 'category' => 'string,optional', 'faq' => 'bool,optional', 'type' => 'string,optionnal', 'help' => 'bool,optional');
     }
     if (!Session::getLoginUserID()) {
         $params['faq'] = 1;
     } else {
         if (!isset($params['faq'])) {
             $params['faq'] = 0;
         }
     }
     $kb = new KnowbaseItem();
     if (!$kb->canView()) {
         return self::Error($protocol, WEBSERVICES_ERROR_NOTALLOWED);
     }
     if (!isset($params['category'])) {
         $params['category'] = 0;
     } else {
         if (!is_numeric($params['category'])) {
             return self::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', 'category');
         }
     }
     if (!isset($params['contains'])) {
         $params['contains'] = '';
     }
     if (!isset($params['type'])) {
         $params['type'] == 'search';
     }
     $query = KnowbaseItem::getListRequest(array('faq' => $params['faq'], 'contains' => addslashes($params['contains']), 'knowbaseitemcategories_id' => $params['category']), $params['type']);
     $resp = array();
     if (isset($params['count'])) {
         $resp['count'] = $DB->numrows($DB->query($query));
     } else {
         $start = 0;
         $limit = $CFG_GLPI["list_limit_max"];
         if (isset($params['limit']) && is_numeric($params['limit'])) {
             $limit = $params['limit'];
         }
         if (isset($params['start']) && is_numeric($params['start'])) {
             $start = $params['start'];
         }
         $query .= " LIMIT {$start}, {$limit}";
         foreach ($DB->request($query) as $data) {
             $data['resume'] = Toolbox::unclean_cross_side_scripting_deep($data['answer']);
             $data['resume'] = Html::clean(Html::resume_text(Html::clean($data['resume']), 200));
             $data['resume'] = html_entity_decode($data['resume'], 0, 'UTF-8');
             unset($data['answer']);
             $resp[] = $data;
         }
     }
     return $resp;
 }