/** * Set index specified prefix terms for all items in this path * @param string Comma-separated list of terms * @param char Xapian term prefix * @return boolean False on error, true otherwise */ function set_terms_by_prefix($terms_string, $prefix) { if (api_get_setting('search_enabled') !== 'true') { return FALSE; } $terms_string = trim($terms_string); $terms = explode(',', $terms_string); array_walk($terms, 'trim_value'); $stored_terms = $this->get_common_index_terms_by_prefix($prefix); //var_dump($stored_terms); //var_dump($terms); // don't do anything if no change, verify only at DB, not the search engine if (count(array_diff($terms, $stored_terms)) == 0 && count(array_diff($stored_terms, $terms)) == 0) { return FALSE; } require_once 'xapian.php'; //TODO try catch every xapian use or make wrappers on api require_once api_get_path(LIBRARY_PATH) . 'search/DokeosIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/xapian/XapianQuery.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; $items_table = Database::get_course_table(TABLE_LP_ITEM); //TODO: make query secure agains XSS : use member attr instead of post var $lp_id = intval($_POST['lp_id']); $sql = "SELECT * FROM {$items_table} WHERE lp_id = {$lp_id}"; $result = Database::query($sql); $di = new DokeosIndexer(); while ($lp_item = Database::fetch_array($result)) { // get search_did $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'SELECT * FROM %s WHERE course_code=\'%s\' AND tool_id=\'%s\' AND ref_id_high_level=%s AND ref_id_second_level=%d LIMIT 1'; $sql = sprintf($sql, $tbl_se_ref, $this->cc, TOOL_LEARNPATH, $lp_id, $lp_item['id']); $res = Database::query($sql, __FILE__, __LINE__); if (Database::num_rows($res) > 0) { $se_ref = Database::fetch_array($res); // compare terms $doc = $di->get_document($se_ref['search_did']); $xapian_terms = xapian_get_doc_terms($doc, $prefix); //var_dump($xapian_terms); $xterms = array(); foreach ($xapian_terms as $xapian_term) { $xterms[] = substr($xapian_term['name'], 1); } $dterms = $terms; //var_dump($xterms); //var_dump($dterms); $missing_terms = array_diff($dterms, $xterms); $deprecated_terms = array_diff($xterms, $dterms); // save it to search engine foreach ($missing_terms as $term) { $doc->add_term($prefix . $term, 1); } foreach ($deprecated_terms as $term) { $doc->remove_term($prefix . $term); } $di->getDb()->replace_document((int) $se_ref['search_did'], $doc); $di->getDb()->flush(); } } return true; }
/** * Set the terms for this learnpath item * @param string Terms, as a comma-split list * @return boolean Always return true */ function set_terms($terms) { global $charset; $lp_item = Database::get_course_table(TABLE_LP_ITEM); require_once api_get_path(LIBRARY_PATH) . 'search/DokeosIndexer.class.php'; $a_terms = split(',', $terms); $i_terms = split(',', $this->get_terms()); foreach ($i_terms as $term) { if (!in_array($term, $a_terms)) { array_push($a_terms, $term); } } $new_terms = $a_terms; $new_terms_string = implode(',', $new_terms); $terms_update_sql = ''; //TODO: validate csv string $terms_update_sql = "UPDATE {$lp_item} SET terms = '" . Database::escape_string(api_htmlentities($new_terms_string, ENT_QUOTES, $charset)) . "' WHERE id=" . $this->get_id(); $res = Database::query($terms_update_sql, __FILE__, __LINE__); // save it to search engine if (api_get_setting('search_enabled') == 'true' && extension_loaded('xapian')) { $di = new DokeosIndexer(); $di->update_terms($this->get_search_did(), $new_terms); } return true; }