Ejemplo n.º 1
0
 /**
  * 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;
 }
Ejemplo n.º 2
0
 /**
  * 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;
 }