// Author $form->addElement('html_editor', 'lp_author', get_lang('Author'), array('size' => 80), array('ToolbarSet' => 'LearningPathAuthor', 'Width' => '100%', 'Height' => '150px')); $form->applyFilter('lp_author', 'html_filter'); // LP image $form->add_progress_bar(); if (strlen($_SESSION['oLP']->get_preview_image()) > 0) { $show_preview_image = '<img src=' . api_get_path(WEB_COURSE_PATH) . api_get_course_path() . '/upload/learning_path/images/' . $_SESSION['oLP']->get_preview_image() . '>'; $form->addElement('label', get_lang('ImagePreview'), $show_preview_image); $form->addElement('checkbox', 'remove_picture', null, get_lang('DelImage')); } $label = $_SESSION['oLP']->get_preview_image() != '' ? get_lang('UpdateImage') : get_lang('AddImage'); $form->addElement('file', 'lp_preview_image', array($label, get_lang('ImageWillResizeMsg'))); $form->addRule('lp_preview_image', get_lang('OnlyImagesAllowed'), 'filetype', array('jpg', 'jpeg', 'png', 'gif')); // Search terms (only if search is activated). if (api_get_setting('search_enabled') === 'true') { $specific_fields = get_specific_field_list(); foreach ($specific_fields as $specific_field) { $form->addElement('text', $specific_field['code'], $specific_field['name']); $filter = array('c_id' => "'" . api_get_course_int_id() . "'", 'field_id' => $specific_field['id'], 'ref_id' => $_SESSION['oLP']->lp_id, 'tool_id' => '\'' . TOOL_LEARNPATH . '\''); $values = get_specific_field_values_list($filter, array('value')); if (!empty($values)) { $arr_str_values = array(); foreach ($values as $value) { $arr_str_values[] = $value['value']; } $defaults[$specific_field['code']] = implode(', ', $arr_str_values); } } } $defaults['lp_encoding'] = Security::remove_XSS($_SESSION['oLP']->encoding); $defaults['lp_name'] = Security::remove_XSS($_SESSION['oLP']->get_name());
$tool_name = get_lang('EditSpecificSearchField'); } // Create the form $form = new FormValidator('specific_fields_add'); // Field variable name $form->addElement('hidden', 'field_id', (int) $_REQUEST['field_id']); $form->addElement('text', 'field_name', get_lang('FieldName')); $form->applyFilter('field_name', 'html_filter'); $form->applyFilter('field_name', 'trim'); $form->addRule('field_name', get_lang('ThisFieldIsRequired'), 'required'); $form->addRule('field_name', get_lang('OnlyLettersAndNumbersAllowed'), 'username'); $form->addRule('field_name', '', 'maxlength', 20); // Set default values (only not empty when editing) $defaults = array(); if (is_numeric($_REQUEST['field_id'])) { $form_information = get_specific_field_list(array('id' => (int) $_GET['field_id'])); $defaults['field_name'] = $form_information[0]['name']; } $form->setDefaults($defaults); // Submit button $form->addElement('style_submit_button', 'submit', get_lang('Add'), 'class="add"'); // Validate form if ($form->validate()) { $field = $form->exportValues(); $field_name = $field['field_name']; if (is_numeric($field['field_id']) && $field['field_id'] != 0 && !empty($field['field_id'])) { edit_specific_field($field['field_id'], $field['field_name']); $message = get_lang('FieldEdited'); } else { $field_id = add_specific_field($field_name); $message = get_lang('FieldAdded');
public function make_lp($files = array()) { global $_course; $previous = 0; $i = 0; if (!is_dir($this->base_work_dir.$this->created_dir)) return false; foreach ($files as $file) { /* '||' is used as separator between fields: slide name (with accents) || file name (without accents) || all slide text (to be indexed). */ list($slide_name, $file_name, $slide_body) = explode('||', $file); // Filename is utf8 encoded, but when we decode, some chars are not translated (like quote ’). // so we remove these chars by translating it in htmlentities and the reconvert it in want charset. $slide_name = api_htmlentities($slide_name, ENT_COMPAT, $this->original_charset); $slide_name = str_replace('’', '\'', $slide_name); $slide_name = api_convert_encoding($slide_name, api_get_system_encoding(), $this->original_charset); $slide_name = api_html_entity_decode($slide_name, ENT_COMPAT, api_get_system_encoding()); if ($this->take_slide_name === true) { $slide_name = str_replace('_', ' ', $slide_name); $slide_name = api_ucfirst($slide_name); } else { $slide_name = 'slide'.str_repeat('0', 2 - strlen($i)).$i; } $i++; // Add the png to documents. $document_id = add_document( $_course, $this->created_dir.'/'.urlencode($file_name), 'file', filesize($this->base_work_dir.$this->created_dir.'/'.$file_name), $slide_name ); api_item_property_update( $_course, TOOL_DOCUMENT, $document_id, 'DocumentAdded', api_get_user_id(), 0, 0, null, null, api_get_session_id() ); // Generating the thumbnail. $image = $this->base_work_dir.$this->created_dir .'/'. $file_name; $pattern = '/(\w+)\.png$/'; $replacement = '${1}_thumb.png'; $thumb_name = preg_replace($pattern, $replacement, $file_name); // Calculate thumbnail size. $image_size = api_getimagesize($image); $width = $image_size['width']; $height = $image_size['height']; $thumb_width = 300; $thumb_height = floor($height * ($thumb_width / $width)); $my_new_image = new Image($image); $my_new_image->resize($thumb_width, $thumb_height); $my_new_image->send_image($this->base_work_dir.$this->created_dir .'/'. $thumb_name, -1, 'png'); // Adding the thumbnail to documents. $document_id_thumb = add_document( $_course, $this->created_dir.'/'.urlencode($thumb_name), 'file', filesize($this->base_work_dir.$this->created_dir.'/'.$thumb_name), $slide_name ); api_item_property_update($_course, TOOL_THUMBNAIL, $document_id_thumb, 'DocumentAdded', api_get_user_id(), 0, 0); // Create an html file. $html_file = $file_name.'.html'; $fp = fopen($this->base_work_dir.$this->created_dir.'/'.$html_file, 'w+'); $slide_src = api_get_path(REL_COURSE_PATH).$_course['path'].'/document/'.$this->created_dir.'/'.utf8_encode($file_name); $slide_src = str_replace('//', '/', $slide_src); fwrite($fp, '<html> <head> </head> <body> <img src="'.$slide_src.'" /> </body> </html>'); // This indentation is to make the generated html files to look well. fclose($fp); $document_id = add_document( $_course, $this->created_dir.'/'.urlencode($html_file), 'file', filesize($this->base_work_dir.$this->created_dir.'/'.$html_file), $slide_name ); if ($document_id) { // Put the document in item_property update. api_item_property_update($_course, TOOL_DOCUMENT, $document_id, 'DocumentAdded', api_get_user_id(), 0, 0, null, null, api_get_session_id()); $previous = $this->add_item(0, $previous, 'document', $document_id, $slide_name, ''); if ($this->first_item == 0) { $this->first_item = $previous; } } // Code for text indexing. if (api_get_setting('search_enabled') == 'true') { if (isset($_POST['index_document']) && $_POST['index_document']) { $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : $lang = 'english'; $di->connectDb(NULL, NULL, $lang); $ic_slide = new IndexableChunk(); $ic_slide->addValue('title', $slide_name); $specific_fields = get_specific_field_list(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); $all_specific_terms .= ' '. $sterms; if (!empty($sterms)) { $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); } } } } $slide_body = $all_specific_terms .' '. $slide_body; $ic_slide->addValue('content', $slide_body); /* FIXME: cidReq:lp_id:doc_id al indexar */ // Add a comment to say terms separated by commas. $courseid = api_get_course_id(); $ic_slide->addCourseId($courseid); $ic_slide->addToolId(TOOL_LEARNPATH); $lp_id = $this->lp_id; $xapian_data = array( SE_COURSE_ID => $courseid, SE_TOOL_ID => TOOL_LEARNPATH, SE_DATA => array('lp_id' => $lp_id, 'lp_item' => $previous, 'document_id' => $document_id), SE_USER => (int)api_get_user_id(), ); $ic_slide->xapian_data = serialize($xapian_data); $di->addChunk($ic_slide); // Index and return search engine document id. $did = $di->index(); if ($did) { // Save it to db. $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'INSERT INTO %s (id, course_code, tool_id, ref_id_high_level, ref_id_second_level, search_did) VALUES (NULL , \'%s\', \'%s\', %s, %s, %s)'; $sql = sprintf($sql, $tbl_se_ref, api_get_course_id(), TOOL_LEARNPATH, $lp_id, $previous, $did); Database::query($sql); } } } } }
/** * @param int $linkId * @param $action * @param null $urlview * @param null $token * @return FormValidator */ public static function getLinkForm($linkId, $action, $token = null) { $course_id = api_get_course_int_id(); $session_id = api_get_session_id(); $linkInfo = Link::get_link_info($linkId); $categoryId = isset($linkInfo['category_id']) ? $linkInfo['category_id'] : ''; $lpId = isset($_GET['lp_id']) ? Security::remove_XSS($_GET['lp_id']) : null; $category = 0; $form = new FormValidator('link', 'post', api_get_self() . '?action=' . $action . '&category_id=' . $categoryId . '&' . api_get_cidreq() . '&id=' . $linkId . '&sec_token=' . $token); if ($action == 'addlink') { $form->addHeader(get_lang('LinkAdd')); } else { $form->addHeader(get_lang('LinkMod')); } $target_link = "_blank"; $title = ''; $category = ''; $onhomepage = ''; $description = ''; if (!empty($linkInfo)) { $urllink = $linkInfo['url']; $title = $linkInfo['title']; $description = $linkInfo['description']; $category = $linkInfo['category_id']; if ($linkInfo['on_homepage'] != 0) { $onhomepage = 1; } $target_link = $linkInfo['target']; } $form->addHidden('id', $linkId); $form->addText('url', 'URL'); $form->addRule('url', get_lang('GiveURL'), 'url'); $form->addText('title', get_lang('LinkName')); $form->addTextarea('description', get_lang('Description')); $resultcategories = Link::getLinkCategories($course_id, $session_id); $options = ['0' => '--']; if (!empty($resultcategories)) { foreach ($resultcategories as $myrow) { $options[$myrow['id']] = $myrow['category_title']; } } $form->addSelect('category_id', get_lang('Category'), $options); $form->addCheckBox('on_homepage', null, get_lang('OnHomepage')); $targets = array('_self' => get_lang('LinkOpenSelf'), '_blank' => get_lang('LinkOpenBlank'), '_parent' => get_lang('LinkOpenParent'), '_top' => get_lang('LinkOpenTop')); $form->addSelect('target', array(get_lang('LinkTarget'), get_lang('AddTargetOfLinkOnHomepage')), $targets); $defaults = array('url' => empty($urllink) ? 'http://' : Security::remove_XSS($urllink), 'title' => Security::remove_XSS($title), 'category_id' => $category, 'on_homepage' => $onhomepage, 'description' => $description, 'target' => $target_link); if (api_get_setting('search_enabled') == 'true') { require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $specific_fields = get_specific_field_list(); $form->addCheckBox('index_document', get_lang('SearchFeatureDoIndexLink'), get_lang('Yes')); foreach ($specific_fields as $specific_field) { $default_values = ''; if ($action == 'editlink') { $filter = array('field_id' => $specific_field['id'], 'ref_id' => intval($_GET['id']), 'tool_id' => '\'' . TOOL_LINK . '\''); $values = get_specific_field_values_list($filter, array('value')); if (!empty($values)) { $arr_str_values = array(); foreach ($values as $value) { $arr_str_values[] = $value['value']; } $default_values = implode(', ', $arr_str_values); } } $form->addText($specific_field['name'], $specific_field['code']); $defaults[$specific_field['name']] = $default_values; } } $form->addHidden('lp_id', $lpId); $form->addButtonSave(get_lang('SaveLink'), 'submitLink'); $form->setDefaults($defaults); return $form; }
/** * Manages page splitting * @param string Page header * @param string Page body * @return void */ function dealPerPage($header, $body) { $_course = api_get_course_info(); // Split document to pages. $pages = explode('||page_break||', $body); $first_item = 0; foreach ($pages as $key => $page_content) { // For every pages, we create a new file. $key += 1; $page_content = $this->format_page_content($header, $page_content, $this->base_work_dir . $this->created_dir); $html_file = $this->created_dir . '-' . $key . '.html'; $handle = fopen($this->base_work_dir . $this->created_dir . '/' . $html_file, 'w+'); fwrite($handle, $page_content); fclose($handle); $document_id = add_document($_course, $this->created_dir . $html_file, 'file', filesize($this->base_work_dir . $this->created_dir . $html_file), $html_file); $slide_name = ''; if ($document_id) { // Put the document in item_property update. api_item_property_update($_course, TOOL_DOCUMENT, $document_id, 'DocumentAdded', $_SESSION['_uid'], 0, 0, null, null, api_get_session_id()); $infos = pathinfo($this->filepath); $slide_name = 'Page ' . str_repeat('0', 2 - strlen($key)) . $key; $previous = learnpath::add_item(0, $previous, 'document', $document_id, $slide_name, ''); if ($this->first_item == 0) { $this->first_item = $previous; } // Code for text indexing. if (isset($_POST['index_document']) && $_POST['index_document']) { //Display::display_normal_message(print_r($_POST)); $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : ($lang = 'english'); $di->connectDb(NULL, NULL, $lang); $ic_slide = new IndexableChunk(); $ic_slide->addValue('title', $slide_name); $specific_fields = get_specific_field_list(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); $all_specific_terms .= ' ' . $sterms; if (!empty($sterms)) { $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); } } } } $page_content = $all_specific_terms . ' ' . $page_content; $ic_slide->addValue('content', $page_content); // Add a comment to say terms separated by commas. $courseid = api_get_course_id(); $ic_slide->addCourseId($courseid); $ic_slide->addToolId(TOOL_LEARNPATH); $lp_id = $this->lp_id; $xapian_data = array(SE_COURSE_ID => $courseid, SE_TOOL_ID => TOOL_LEARNPATH, SE_DATA => array('lp_id' => $lp_id, 'lp_item' => $previous, 'document_id' => $document_id), SE_USER => (int) api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $di->addChunk($ic_slide); // Index and return search engine document id. $did = $di->index(); if ($did) { // Save it to db. $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'INSERT INTO %s (id, course_code, tool_id, ref_id_high_level, ref_id_second_level, search_did) VALUES (NULL , \'%s\', \'%s\', %s, %s, %s)'; $sql = sprintf($sql, $tbl_se_ref, api_get_course_id(), TOOL_LEARNPATH, $lp_id, $previous, $did); Database::query($sql); } } } } }
/** * Index a given document. * @param int Document ID inside its corresponding course * @param string Course code * @param int Session ID (not used yet) * @param string Language of document's content (defaults to course language) * @param array Array of specific fields (['code'=>'value',...]) * @param string What to do if the file already exists (default or overwrite) * @param bool When set to true, this runs the indexer without actually saving anything to any database * @return bool Returns true on presumed success, false on failure */ public static function index_document($docid, $course_code, $session_id = 0, $lang = 'english', $specific_fields_values = array(), $if_exists = '', $simulation = false) { if (api_get_setting('search.search_enabled') !== 'true') { return false; } if (empty($docid) or $docid != intval($docid)) { return false; } if (empty($session_id)) { $session_id = api_get_session_id(); } $course_info = api_get_course_info($course_code); $course_dir = $course_info['path'] . '/document'; $sys_course_path = api_get_path(SYS_COURSE_PATH); $base_work_dir = $sys_course_path . $course_dir; $course_id = $course_info['real_id']; $table_document = Database::get_course_table(TABLE_DOCUMENT); $qry = "SELECT path, title FROM {$table_document} WHERE c_id = {$course_id} AND id = '{$docid}' LIMIT 1"; $result = Database::query($qry); if (Database::num_rows($result) == 1) { $row = Database::fetch_array($result); $doc_path = api_get_path(SYS_COURSE_PATH) . $course_dir . $row['path']; //TODO: mime_content_type is deprecated, fileinfo php extension is enabled by default as of PHP 5.3.0 // now versions of PHP on Debian testing(5.2.6-5) and Ubuntu(5.2.6-2ubuntu) are lower, so wait for a while $doc_mime = mime_content_type($doc_path); $allowed_mime_types = self::file_get_mime_type(true); // mime_content_type does not detect correctly some formats that are going to be supported for index, so an extensions array is used for the moment if (empty($doc_mime)) { $allowed_extensions = array('doc', 'docx', 'ppt', 'pptx', 'pps', 'ppsx', 'xls', 'xlsx', 'odt', 'odp', 'ods', 'pdf', 'txt', 'rtf', 'msg', 'csv', 'html', 'htm'); $extensions = preg_split("/[\\/\\.]/", $doc_path); $doc_ext = strtolower($extensions[count($extensions) - 1]); if (in_array($doc_ext, $allowed_extensions)) { switch ($doc_ext) { case 'ppt': case 'pps': $doc_mime = 'application/vnd.ms-powerpoint'; break; case 'xls': $doc_mime = 'application/vnd.ms-excel'; break; } } } //@todo move this nightmare in a search controller or something like that!!! J.M if (in_array($doc_mime, $allowed_mime_types)) { $file_title = $row['title']; $file_content = self::get_text_content($doc_path, $doc_mime); $course_code = Database::escape_string($course_code); require_once api_get_path(LIBRARY_PATH) . 'search/ChamiloIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; $ic_slide = new IndexableChunk(); $ic_slide->addValue('title', $file_title); $ic_slide->addCourseId($course_code); $ic_slide->addToolId(TOOL_DOCUMENT); $xapian_data = array(SE_COURSE_ID => $course_code, SE_TOOL_ID => TOOL_DOCUMENT, SE_DATA => array('doc_id' => $docid), SE_USER => api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $di = new ChamiloIndexer(); $return = $di->connectDb(null, null, $lang); require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $specific_fields = get_specific_field_list(); // process different depending on what to do if file exists /** * @TODO Find a way to really verify if the file had been * overwriten. Now all work is done at * handle_uploaded_document() and it's difficult to verify it */ if (!empty($if_exists) && $if_exists == 'overwrite') { // Overwrite the file on search engine // Actually, it consists on a delete of terms from db, // insert new ones, create a new search engine document, // and remove the old one // 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 LIMIT 1'; $sql = sprintf($sql, $tbl_se_ref, $course_code, TOOL_DOCUMENT, $docid); $res = Database::query($sql); if (Database::num_rows($res) > 0) { $se_ref = Database::fetch_array($res); if (!$simulation) { $di->remove_document($se_ref['search_did']); } $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { if (!$simulation) { delete_all_specific_field_value($course_code, $specific_field['id'], TOOL_DOCUMENT, $docid); } // Update search engine if (isset($specific_fields_values[$specific_field['code']])) { $sterms = trim($specific_fields_values[$specific_field['code']]); } else { //if the specific field is not defined, force an empty one $sterms = ''; } $all_specific_terms .= ' ' . $sterms; $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $sterm = trim($sterm); if (!empty($sterm)) { $ic_slide->addTerm($sterm, $specific_field['code']); // updated the last param here from $value to $sterm without being sure - see commit15464 if (!$simulation) { add_specific_field_value($specific_field['id'], $course_code, TOOL_DOCUMENT, $docid, $sterm); } } } } // Add terms also to content to make terms findable by probabilistic search $file_content = $all_specific_terms . ' ' . $file_content; if (!$simulation) { $ic_slide->addValue('content', $file_content); $di->addChunk($ic_slide); // Index and return a new search engine document id $did = $di->index(); if ($did) { // update the search_did on db $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'UPDATE %s SET search_did=%d WHERE id=%d LIMIT 1'; $sql = sprintf($sql, $tbl_se_ref, (int) $did, (int) $se_ref['id']); Database::query($sql); } } } } else { // Add all terms $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { if (isset($specific_fields_values[$specific_field['code']])) { $sterms = trim($specific_fields_values[$specific_field['code']]); } else { //if the specific field is not defined, force an empty one $sterms = ''; } $all_specific_terms .= ' ' . $sterms; if (!empty($sterms)) { $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { if (!$simulation) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); add_specific_field_value($specific_field['id'], $course_code, TOOL_DOCUMENT, $docid, $sterm); } } } } // Add terms also to content to make terms findable by probabilistic search $file_content = $all_specific_terms . ' ' . $file_content; if (!$simulation) { $ic_slide->addValue('content', $file_content); $di->addChunk($ic_slide); // Index and return search engine document id $did = $di->index(); if ($did) { // Save it to db $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'INSERT INTO %s (id, course_code, tool_id, ref_id_high_level, search_did) VALUES (NULL , \'%s\', \'%s\', %s, %s)'; $sql = sprintf($sql, $tbl_se_ref, $course_code, TOOL_DOCUMENT, $docid, $did); Database::query($sql); } else { return false; } } } } else { return false; } } return true; }
/** * Show the search widget * * The form will post to index.php by default, you can pass a value to * $action to use a custom action. * IMPORTANT: you have to call search_widget_prepare() before calling this * function or otherwise the form will not behave correctly. * * @param string $action Just in case your action is not * index.php */ function search_widget_show($action = 'index.php') { require_once api_get_path(LIBRARY_PATH) . 'search/ChamiloQuery.php'; // TODO: load images dinamically when they're avalaible from specific field ui to add $groupId = api_get_group_id(); $sf_terms = array(); $specific_fields = get_specific_field_list(); $url_params = array(); if (($cid = api_get_course_id()) != -1) { // with cid // get search engine terms $course_filter = chamilo_get_boolean_query(XAPIAN_PREFIX_COURSEID . $cid); $dkterms = chamilo_query_simple_query('', 0, 1000, array($course_filter)); //prepare specific fields names (and also get possible URL param names) foreach ($specific_fields as $specific_field) { $temp = array(); if (is_array($dkterms) && count($dkterms) > 0) { foreach ($dkterms[1] as $obj) { $temp = array_merge($obj['sf-' . $specific_field['code']], $temp); } } $sf_terms[$specific_field['code']] = $temp; $url_params[] = 'sf_' . $specific_field['code']; unset($temp); } } else { // without cid // prepare specific fields names (and also get possible URL param names) foreach ($specific_fields as $specific_field) { //get Xapian terms for a specific term prefix, in ISO, apparently $sf_terms[$specific_field['code']] = xapian_get_all_terms(1000, $specific_field['code']); $url_params[] = 'sf_' . $specific_field['code']; } } echo '<h2>' . get_lang('Search') . '</h2>'; // Tool introduction // TODO: Settings for the online editor to be checked (insert an image for example). Probably this is a special case here. if (api_get_course_id() !== -1) { if (!empty($groupId)) { Display::display_introduction_section(TOOL_SEARCH . $groupId); } else { Display::display_introduction_section(TOOL_SEARCH); } } $op = 'or'; if (!empty($_REQUEST['operator']) && in_array($op, array('or', 'and'))) { $op = $_REQUEST['operator']; } //check if URL params are defined (to see if we show the thesaurus or not) $show_thesaurus = false; foreach ($url_params as $param) { if (isset($_REQUEST[$param]) && is_array($_REQUEST[$param])) { $thesaurus_decided = FALSE; foreach ($_REQUEST[$param] as $term) { if (!empty($term)) { $show_thesaurus = true; $thesaurus_decided = TRUE; break; } } if ($thesaurus_decided) { break; } } } // create the form // TODO: use FormValidator display_search_form($action, $show_thesaurus, $sf_terms, $op); }
/** * Import the scorm object (as a result from the parse_manifest function) into the database structure * @param string Unique course code * @return bool Returns -1 on error */ function import_manifest($course_code, $use_max_score = 1) { if ($this->debug > 0) { error_log('New LP - Entered import_manifest(' . $course_code . ')', 0); } $course_info = api_get_course_info($course_code); $course_id = $course_info['real_id']; // Get table names. $new_lp = Database::get_course_table(TABLE_LP_MAIN); $new_lp_item = Database::get_course_table(TABLE_LP_ITEM); $use_max_score = intval($use_max_score); foreach ($this->organizations as $id => $dummy) { $is_session = api_get_session_id(); $is_session != 0 ? $session_id = $is_session : ($session_id = 0); $oOrganization =& $this->organizations[$id]; // Prepare and execute insert queries: // -for learnpath // -for items // -for views? $get_max = "SELECT MAX(display_order) FROM {$new_lp} WHERE c_id = {$course_id} "; $res_max = Database::query($get_max); $dsp = 1; if (Database::num_rows($res_max) > 0) { $row = Database::fetch_array($res_max); $dsp = $row[0] + 1; } $myname = $oOrganization->get_name(); $myname = api_utf8_decode($myname); $sql = "INSERT INTO {$new_lp} (c_id, lp_type, name, ref, description, path, force_commit, default_view_mod, default_encoding, js_lib,display_order, session_id, use_max_score)" . "VALUES ({$course_id} , 2,'" . $myname . "', '" . $oOrganization->get_ref() . "','','" . $this->subdir . "', 0, 'embedded', '" . $this->manifest_encoding . "', 'scorm_api.php', {$dsp}, {$session_id}, {$use_max_score})"; if ($this->debug > 1) { error_log('New LP - In import_manifest(), inserting path: ' . $sql, 0); } $res = Database::query($sql); $lp_id = Database::insert_id(); $this->lp_id = $lp_id; // Insert into item_property. api_item_property_update(api_get_course_info($course_code), TOOL_LEARNPATH, $this->lp_id, 'LearnpathAdded', api_get_user_id()); api_item_property_update(api_get_course_info($course_code), TOOL_LEARNPATH, $this->lp_id, 'visible', api_get_user_id()); // Now insert all elements from inside that learning path. // Make sure we also get the href and sco/asset from the resources. $list = $oOrganization->get_flat_items_list(); $parents_stack = array(0); $parent = 0; $previous = 0; $level = 0; foreach ($list as $item) { if ($item['level'] > $level) { // Push something into the parents array. array_push($parents_stack, $previous); $parent = $previous; } elseif ($item['level'] < $level) { $diff = $level - $item['level']; // Pop something out of the parents array. for ($j = 1; $j <= $diff; $j++) { $outdated_parent = array_pop($parents_stack); } $parent = array_pop($parents_stack); // Just save that value, then add it back. array_push($parents_stack, $parent); } $path = ''; $type = 'dir'; if (isset($this->resources[$item['identifierref']])) { $oRes =& $this->resources[$item['identifierref']]; $path = @$oRes->get_path(); if (!empty($path)) { $temptype = $oRes->get_scorm_type(); if (!empty($temptype)) { $type = $temptype; } } } $level = $item['level']; $field_add = ''; $value_add = ''; if (!empty($item['masteryscore'])) { $field_add .= 'mastery_score, '; $value_add .= $item['masteryscore'] . ','; } if (!empty($item['maxtimeallowed'])) { $field_add .= 'max_time_allowed, '; $value_add .= "'" . $item['maxtimeallowed'] . "',"; } $title = Database::escape_string($item['title']); $title = api_utf8_decode($title); $max_score = Database::escape_string($item['max_score']); if ($max_score == 0 || is_null($max_score) || $max_score == '') { //If max score is not set The use_max_score parameter is check in order to use 100 (chamilo style) or '' (strict scorm) if ($use_max_score) { $max_score = "'100'"; } else { $max_score = "NULL"; } } else { //Otherwise save the max score $max_score = "'{$max_score}'"; } $identifier = Database::escape_string($item['identifier']); if (empty($title)) { $title = get_lang('Untitled'); } $prereq = Database::escape_string($item['prerequisites']); $sql_item = "INSERT INTO {$new_lp_item} (c_id, lp_id,item_type,ref,title, path,min_score,max_score, {$field_add} parent_item_id,previous_item_id,next_item_id, prerequisite,display_order,launch_data, parameters) VALUES " . "({$course_id}, {$lp_id}, '{$type}','{$identifier}', '{$title}', '{$path}' , 0, {$max_score}, {$value_add}" . "{$parent}, {$previous}, 0, " . "'{$prereq}', " . $item['rel_order'] . ", '" . $item['datafromlms'] . "'," . "'" . $item['parameters'] . "'" . ")"; $res_item = Database::query($sql_item); if ($this->debug > 1) { error_log('New LP - In import_manifest(), inserting item : ' . $sql_item . ' : ' . Database::error(), 0); } $item_id = Database::insert_id(); // Now update previous item to change next_item_id. $upd = "UPDATE {$new_lp_item} SET next_item_id = {$item_id} WHERE c_id = {$course_id} AND id = {$previous}"; $upd_res = Database::query($upd); // Update previous item id. $previous = $item_id; // Code for indexing, now only index specific fields like terms and the title. if (!empty($_POST['index_document'])) { require_once api_get_path(LIBRARY_PATH) . 'search/ChamiloIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : ($lang = 'english'); $di->connectDb(null, null, $lang); $ic_slide = new IndexableChunk(); $ic_slide->addValue('title', $title); $specific_fields = get_specific_field_list(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); $all_specific_terms .= ' ' . $sterms; if (!empty($sterms)) { $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); } } } } $body_to_index = $all_specific_terms . ' ' . $title; $ic_slide->addValue("content", $body_to_index); // TODO: Add a comment to say terms separated by commas. $courseid = api_get_course_id(); $ic_slide->addCourseId($courseid); $ic_slide->addToolId(TOOL_LEARNPATH); $xapian_data = array(SE_COURSE_ID => $courseid, SE_TOOL_ID => TOOL_LEARNPATH, SE_DATA => array('lp_id' => $lp_id, 'lp_item' => $previous, 'document_id' => ''), SE_USER => (int) api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $di->addChunk($ic_slide); // Index and return search engine document id. $did = $di->index(); if ($did) { // Save it to db. $tbl_se_ref = Database::get_main_table(TABLE_MAIN_SEARCH_ENGINE_REF); $sql = 'INSERT INTO %s (id, course_code, tool_id, ref_id_high_level, ref_id_second_level, search_did) VALUES (NULL , \'%s\', \'%s\', %s, %s, %s)'; $sql = sprintf($sql, $tbl_se_ref, api_get_course_id(), TOOL_LEARNPATH, $lp_id, $previous, $did); Database::query($sql); } } } } }
function search_engine_edit() { // update search enchine and its values table if enabled if (api_get_setting('search.search_enabled') == 'true' && extension_loaded('xapian')) { $course_id = api_get_course_id(); // actually, it consists on delete terms from db, // insert new ones, create a new search engine document, and remove the old one // 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 LIMIT 1'; $sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->id); $res = Database::query($sql); if (Database::num_rows($res) > 0) { require_once api_get_path(LIBRARY_PATH) . 'search/ChamiloIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $se_ref = Database::fetch_array($res); $specific_fields = get_specific_field_list(); $ic_slide = new IndexableChunk(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { delete_all_specific_field_value($course_id, $specific_field['id'], TOOL_QUIZ, $this->id); if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); $all_specific_terms .= ' ' . $sterms; $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); add_specific_field_value($specific_field['id'], $course_id, TOOL_QUIZ, $this->id, $sterm); } } } // build the chunk to index $ic_slide->addValue("title", $this->exercise); $ic_slide->addCourseId($course_id); $ic_slide->addToolId(TOOL_QUIZ); $xapian_data = array(SE_COURSE_ID => $course_id, SE_TOOL_ID => TOOL_QUIZ, SE_DATA => array('type' => SE_DOCTYPE_EXERCISE_EXERCISE, 'exercise_id' => (int) $this->id), SE_USER => (int) api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $exercise_description = $all_specific_terms . ' ' . $this->description; $ic_slide->addValue("content", $exercise_description); $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : ($lang = 'english'); $di->connectDb(NULL, NULL, $lang); $di->remove_document((int) $se_ref['search_did']); $di->addChunk($ic_slide); //index and return search engine document id $did = $di->index(); if ($did) { // save it to db $sql = 'DELETE FROM %s WHERE course_code=\'%s\' AND tool_id=\'%s\' AND ref_id_high_level=\'%s\''; $sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->id); Database::query($sql); $sql = 'INSERT INTO %s (id, course_code, tool_id, ref_id_high_level, search_did) VALUES (NULL , \'%s\', \'%s\', %s, %s)'; $sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_QUIZ, $this->id, $did); Database::query($sql); } } else { $this->search_engine_save(); } } }
/** * Used to edit a link or a category * @todo Rewrite the whole links tool because it is becoming completely cluttered, * code does not follow the coding conventions, does not use html_quickform, ... * Some features were patched in. * @author Patrick Cool <*****@*****.**>, Ghent University * @todo replace the globals with the appropriate $_POST or $_GET values */ function editlinkcategory($type) { global $catlinkstatus; global $id; global $submit_link; global $submit_category; global $_user; global $_course; global $nameTools; global $urllink; global $title; global $description; global $category; global $selectcategory; global $description; global $category_title; global $onhomepage; global $target_link; $tbl_link = Database::get_course_table(TABLE_LINK); $tbl_categories = Database::get_course_table(TABLE_LINK_CATEGORY); $course_id = api_get_course_int_id(); if ($type == 'link') { // This is used to populate the link-form with the info found in the database. if (!empty($_GET['id'])) { $sql = "SELECT * FROM " . $tbl_link . "\n WHERE c_id = {$course_id} AND id='" . intval($_GET['id']) . "'"; $result = Database::query($sql); if ($myrow = Database::fetch_array($result)) { $urllink = $myrow['url']; $title = $myrow['title']; $description = $myrow['description']; $category = $myrow['category_id']; if ($myrow['on_homepage'] != 0) { $onhomepage = 'checked'; } $target_link = $myrow['target']; } } // This is used to put the modified info of the link-form into the database. if ($_POST['submitLink']) { // Ivan, 13-OCT-2010: It is a litle bit messy code below, just in case I added some extra-security checks here. $_POST['urllink'] = trim($_POST['urllink']); $_POST['title'] = trim(Security::remove_XSS($_POST['title'])); $_POST['description'] = trim(Security::remove_XSS($_POST['description'])); $_POST['selectcategory'] = intval($_POST['selectcategory']); $_POST['id'] = intval($_POST['id']); // We ensure URL to be absolute. if (strpos($_POST['urllink'], '://') === false) { $_POST['urllink'] = 'http://' . $_POST['urllink']; } // If the title is empty, we use the URL as title. if ($_POST['title'] == '') { $_POST['title'] = $_POST['urllink']; } // If the URL is invalid, an error occurs. if (!api_valid_url($urllink, true)) { // A check against an absolute URL. $msgErr = get_lang('GiveURL'); Display::display_error_message(get_lang('GiveURL')); return false; } $onhomepage = Security::remove_XSS($_POST['onhomepage']); $target = Database::escape_string($_POST['target_link']); if (empty($mytarget)) { $mytarget = '_self'; } $mytarget = ", target='" . $target . "'"; // Finding the old category_id. $sql = "SELECT * FROM " . $tbl_link . "\n WHERE c_id = {$course_id} AND id='" . intval($_POST['id']) . "'"; $result = Database::query($sql); $row = Database::fetch_array($result); $category_id = $row['category_id']; if ($category_id != $_POST['selectcategory']) { $sql = "SELECT MAX(display_order)\n FROM " . $tbl_link . "\n WHERE c_id = {$course_id}\n AND category_id='" . intval($_POST['selectcategory']) . "'"; $result = Database::query($sql); list($max_display_order) = Database::fetch_row($result); $max_display_order++; } else { $max_display_order = $row['display_order']; } $sql = "UPDATE " . $tbl_link . " SET " . "url='" . Database::escape_string($_POST['urllink']) . "', " . "title='" . Database::escape_string($_POST['title']) . "', " . "description='" . Database::escape_string($_POST['description']) . "', " . "category_id='" . Database::escape_string($_POST['selectcategory']) . "', " . "display_order='" . $max_display_order . "', " . "on_homepage= '" . Database::escape_string($onhomepage) . "' {$mytarget} " . " WHERE c_id = {$course_id} AND id='" . intval($_POST['id']) . "'"; Database::query($sql); // Update search enchine and its values table if enabled. if (api_get_setting('search_enabled') == 'true') { $link_id = intval($_POST['id']); $course_int_id = api_get_course_int_id(); $course_id = api_get_course_id(); $link_url = Database::escape_string($_POST['urllink']); $link_title = Database::escape_string($_POST['title']); $link_description = Database::escape_string($_POST['description']); // Actually, it consists on delete terms from db, insert new ones, create a new search engine document, and remove the old one. // 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 LIMIT 1'; $sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_LINK, $link_id); $res = Database::query($sql); if (Database::num_rows($res) > 0) { require_once api_get_path(LIBRARY_PATH) . 'search/ChamiloIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $se_ref = Database::fetch_array($res); $specific_fields = get_specific_field_list(); $ic_slide = new IndexableChunk(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { delete_all_specific_field_value($course_id, $specific_field['id'], TOOL_LINK, $link_id); if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); if (!empty($sterms)) { $all_specific_terms .= ' ' . $sterms; $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); add_specific_field_value($specific_field['id'], $course_id, TOOL_LINK, $link_id, $sterm); } } } } // Build the chunk to index. $ic_slide->addValue("title", $link_title); $ic_slide->addCourseId($course_id); $ic_slide->addToolId(TOOL_LINK); $xapian_data = array(SE_COURSE_ID => $course_id, SE_TOOL_ID => TOOL_LINK, SE_DATA => array('link_id' => (int) $link_id), SE_USER => (int) api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $link_description = $all_specific_terms . ' ' . $link_description; $ic_slide->addValue('content', $link_description); // Add category name if set. if (isset($_POST['selectcategory']) && $selectcategory > 0) { $table_link_category = Database::get_course_table(TABLE_LINK_CATEGORY); $sql_cat = 'SELECT * FROM %s WHERE id=%d and c_id = %d LIMIT 1'; $sql_cat = sprintf($sql_cat, $table_link_category, (int) $selectcategory, $course_int_id); $result = Database::query($sql_cat); if (Database::num_rows($result) == 1) { $row = Database::fetch_array($result); $ic_slide->addValue('category', $row['category_title']); } } $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : ($lang = 'english'); $di->connectDb(null, null, $lang); $di->remove_document((int) $se_ref['search_did']); $di->addChunk($ic_slide); // Index and return search engine document id. $did = $di->index(); if ($did) { // Save it to db. $sql = 'DELETE FROM %s WHERE course_code=\'%s\' AND tool_id=\'%s\' AND ref_id_high_level=\'%s\''; $sql = sprintf($sql, $tbl_se_ref, $course_id, TOOL_LINK, $link_id); Database::query($sql); $sql = 'INSERT INTO %s (c_id, id, course_code, tool_id, ref_id_high_level, search_did) VALUES (NULL , \'%s\', \'%s\', %s, %s)'; $sql = sprintf($sql, $tbl_se_ref, $course_int_id, $course_id, TOOL_LINK, $link_id, $did); Database::query($sql); } } } // "WHAT'S NEW" notification: update table last_toolEdit. api_item_property_update($_course, TOOL_LINK, $_POST['id'], 'LinkUpdated', $_user['user_id']); Display::display_confirmation_message(get_lang('LinkModded')); } } if ($type == 'category') { // This is used to populate the category-form with the info found in the database. if (!$submit_category) { $sql = "SELECT * FROM " . $tbl_categories . "\n WHERE c_id = {$course_id} AND id='" . intval($_GET['id']) . "'"; $result = Database::query($sql); if ($myrow = Database::fetch_array($result)) { $category_title = $myrow['category_title']; $description = $myrow['description']; } } // This is used to put the modified info of the category-form into the database. if ($submit_category) { $sql = "UPDATE " . $tbl_categories . "\n SET category_title='" . Database::escape_string($_POST['category_title']) . "',\n description='" . Database::escape_string($_POST['description']) . "'\n WHERE c_id = {$course_id} AND id='" . Database::escape_string($_POST['id']) . "'"; Database::query($sql); Display::display_confirmation_message(get_lang('CategoryModded')); } } return true; // On errors before this statement, exit from this function by returning false value. }
function search_engine_edit() { // update search enchine and its values table if enabled if (api_get_setting('search.search_enabled') == 'true' && extension_loaded('xapian')) { $em = Database::getManager(); $course = $em->find('ChamiloCoreBundle:Course', api_get_course_int_id()); // actually, it consists on delete terms from db, // insert new ones, create a new search engine document, and remove the old one // get search_did $se_ref = $em->getRepository('ChamiloCoreBundle:SearchEngineRef')->findOneBy(['course' => $course, 'toolId' => TOOL_QUIZ, 'refIdHighLevel' => $this->id]); if ($se_ref) { require_once api_get_path(LIBRARY_PATH) . 'search/ChamiloIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $specific_fields = get_specific_field_list(); $ic_slide = new IndexableChunk(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { delete_all_specific_field_value($course->getCode(), $specific_field['id'], TOOL_QUIZ, $this->id); if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); $all_specific_terms .= ' ' . $sterms; $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); add_specific_field_value($specific_field['id'], $course->getCode(), TOOL_QUIZ, $this->id, $sterm); } } } // build the chunk to index $ic_slide->addValue("title", $this->exercise); $ic_slide->addCourseId($course->getCode()); $ic_slide->addToolId(TOOL_QUIZ); $xapian_data = array(SE_COURSE_ID => $course->getCode(), SE_TOOL_ID => TOOL_QUIZ, SE_DATA => array('type' => SE_DOCTYPE_EXERCISE_EXERCISE, 'exercise_id' => (int) $this->id), SE_USER => (int) api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $exercise_description = $all_specific_terms . ' ' . $this->description; $ic_slide->addValue("content", $exercise_description); $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : ($lang = 'english'); $di->connectDb(NULL, NULL, $lang); $di->remove_document($se_ref->getSearchDid()); $di->addChunk($ic_slide); //index and return search engine document id $did = $di->index(); if ($did) { // save it to db $em->createQuery(' delete from ChamiloCoreBundle:SearchEngineRef ser where ser.course = ?1 and ser.toolId = ?2 and ser.refIdHighLevel = ?3 ')->execute([1 => $course, 2 => TOOL_QUIZ, 3 => $this->id]); $searchEngineRef = new \Chamilo\CoreBundle\Entity\SearchEngineRef(); $searchEngineRef->setCourse($course)->setToolId(TOOL_QUIZ)->setRefIdHighLevel($this->id)->setSearchDid($did); $em->persist($searchEngineRef); $em->flush(); } } else { $this->search_engine_save(); } } }
/** * Search options * TODO: support for multiple site. aka $_configuration['access_url'] == 1 * @author Marco Villegas <*****@*****.**> */ function handle_search() { global $SettingsStored, $_configuration; require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $search_enabled = api_get_setting('search.search_enabled'); $form = new FormValidator('search-options', 'post', api_get_self() . '?category=Search'); $values = api_get_settings_options('search_enabled'); $form->addElement('header', null, get_lang('SearchEnabledTitle')); $group = array(); if (is_array($values)) { foreach ($values as $key => $value) { $element =& $form->createElement('radio', 'search_enabled', '', get_lang($value['display_text']), $value['value']); $group[] = $element; } } //SearchEnabledComment $form->addGroup($group, 'search_enabled', array(get_lang('SearchEnabledTitle'), get_lang('SearchEnabledComment')), '<br />', false); $search_enabled = api_get_setting('search.search_enabled'); if ($form->validate()) { $formvalues = $form->exportValues(); $r = api_set_settings_category('Search', 'false', $_configuration['access_url']); // Save the settings. foreach ($formvalues as $key => $value) { $result = api_set_setting($key, $value, null, null); } $search_enabled = $formvalues['search_enabled']; Display::display_confirmation_message($SettingsStored); } $specific_fields = get_specific_field_list(); if ($search_enabled == 'true') { $values = api_get_settings_options('search_show_unlinked_results'); $group = array(); foreach ($values as $key => $value) { $element =& $form->createElement('radio', 'search_show_unlinked_results', '', get_lang($value['display_text']), $value['value']); $group[] = $element; } $form->addGroup($group, 'search_show_unlinked_results', array(get_lang('SearchShowUnlinkedResultsTitle'), get_lang('SearchShowUnlinkedResultsComment')), '', false); $default_values['search_show_unlinked_results'] = api_get_setting('search_show_unlinked_results'); $sf_values = array(); foreach ($specific_fields as $sf) { $sf_values[$sf['code']] = $sf['name']; } $group = array(); $url = Display::div(Display::url(get_lang('AddSpecificSearchField'), 'specific_fields.php'), array('class' => 'sectioncomment')); if (empty($sf_values)) { $form->addElement('html', get_lang('SearchPrefilterPrefix') . $url); } else { $form->addElement('select', 'search_prefilter_prefix', array(get_lang('SearchPrefilterPrefix'), $url), $sf_values, ''); $default_values['search_prefilter_prefix'] = api_get_setting('search_prefilter_prefix'); } } $default_values['search_enabled'] = $search_enabled; $form->addButtonSave(get_lang('Save')); $form->setDefaults($default_values); echo '<div id="search-options-form">'; $form->display(); echo '</div>'; if ($search_enabled == 'true') { $xapian_path = api_get_path(SYS_UPLOAD_PATH) . 'plugins/xapian/searchdb'; /* @todo Test the Xapian connection if (extension_loaded('xapian')) { require_once 'xapian.php'; try { $db = new XapianDatabase($xapian_path.'/'); } catch (Exception $e) { var_dump($e->getMessage()); } require_once api_get_path(LIBRARY_PATH) . 'search/DokeosIndexer.class.php'; require_once api_get_path(LIBRARY_PATH) . 'search/IndexableChunk.class.php'; require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $indexable = new IndexableChunk(); $indexable->addValue("content", 'Test'); $di = new DokeosIndexer(); $di->connectDb(NULL, NULL, 'english'); $di->addChunk($indexable); $did = $di->index(); } */ $xapian_loaded = Display::return_icon('bullet_green.gif', get_lang('Ok')); $dir_exists = Display::return_icon('bullet_green.gif', get_lang('Ok')); $dir_is_writable = Display::return_icon('bullet_green.gif', get_lang('Ok')); $specific_fields_exists = Display::return_icon('bullet_green.gif', get_lang('Ok')); //Testing specific fields if (empty($specific_fields)) { $specific_fields_exists = Display::return_icon('bullet_red.gif', get_lang('AddSpecificSearchField')); } //Testing xapian extension if (!extension_loaded('xapian')) { $xapian_loaded = Display::return_icon('bullet_red.gif', get_lang('Error')); } //Testing xapian searchdb path if (!is_dir($xapian_path)) { $dir_exists = Display::return_icon('bullet_red.gif', get_lang('Error')); } //Testing xapian searchdb path is writable if (!is_writable($xapian_path)) { $dir_is_writable = Display::return_icon('bullet_red.gif', get_lang('Error')); } $data[] = array(get_lang('XapianModuleInstalled'), $xapian_loaded); $data[] = array(get_lang('DirectoryExists') . ' - ' . $xapian_path, $dir_exists); $data[] = array(get_lang('IsWritable') . ' - ' . $xapian_path, $dir_is_writable); $data[] = array(get_lang('SpecificSearchFieldsAvailable'), $specific_fields_exists); echo Display::tag('h3', get_lang('Settings')); $table = new SortableTableFromArray($data); $table->set_header(0, get_lang('Setting'), false); $table->set_header(1, get_lang('Status'), false); echo $table->display(); //@todo windows support if (api_is_windows_os() == false) { $list_of_programs = array('pdftotext', 'ps2pdf', 'catdoc', 'html2text', 'unrtf', 'catppt', 'xls2csv'); foreach ($list_of_programs as $program) { $output = $ret_val = null; exec("which {$program}", $output, $ret_val); $icon = Display::return_icon('bullet_red.gif', get_lang('NotInstalled')); if (!empty($output[0])) { $icon = Display::return_icon('bullet_green.gif', get_lang('Installed')); } $data2[] = array($program, $output[0], $icon); } echo Display::tag('h3', get_lang('ProgramsNeededToConvertFiles')); $table = new SortableTableFromArray($data2); $table->set_header(0, get_lang('Program'), false); $table->set_header(1, get_lang('Path'), false); $table->set_header(2, get_lang('Status'), false); echo $table->display(); } else { Display::display_warning_message(get_lang('YouAreUsingChamiloInAWindowsPlatformSadlyYouCantConvertDocumentsInOrderToSearchTheContentUsingThisTool')); } } }
/** * Manages page splitting * @param string Page header * @param string Page body * @return void */ function dealPerPage($header, $body) { $em = Database::getManager(); $_course = api_get_course_info(); // Split document to pages. $pages = explode('||page_break||', $body); $first_item = 0; foreach ($pages as $key => $page_content) { // For every pages, we create a new file. $key += 1; $page_content = $this->format_page_content($header, $page_content, $this->base_work_dir . $this->created_dir); $html_file = $this->created_dir . '-' . $key . '.html'; $handle = fopen($this->base_work_dir . $this->created_dir . '/' . $html_file, 'w+'); fwrite($handle, $page_content); fclose($handle); $document_id = add_document($_course, $this->created_dir . $html_file, 'file', filesize($this->base_work_dir . $this->created_dir . $html_file), $html_file); $slide_name = ''; if ($document_id) { // Put the document in item_property update. api_item_property_update($_course, TOOL_DOCUMENT, $document_id, 'DocumentAdded', api_get_user_id(), 0, 0, null, null, api_get_session_id()); $infos = pathinfo($this->filepath); $slide_name = 'Page ' . str_repeat('0', 2 - strlen($key)) . $key; $previous = learnpath::add_item(0, $previous, 'document', $document_id, $slide_name, ''); if ($this->first_item == 0) { $this->first_item = $previous; } // Code for text indexing. if (api_get_setting('search.search_enabled') == 'true') { if (isset($_POST['index_document']) && $_POST['index_document']) { //Display::display_normal_message(print_r($_POST)); $di = new ChamiloIndexer(); isset($_POST['language']) ? $lang = Database::escape_string($_POST['language']) : ($lang = 'english'); $di->connectDb(NULL, NULL, $lang); $ic_slide = new IndexableChunk(); $ic_slide->addValue('title', $slide_name); $specific_fields = get_specific_field_list(); $all_specific_terms = ''; foreach ($specific_fields as $specific_field) { if (isset($_REQUEST[$specific_field['code']])) { $sterms = trim($_REQUEST[$specific_field['code']]); $all_specific_terms .= ' ' . $sterms; if (!empty($sterms)) { $sterms = explode(',', $sterms); foreach ($sterms as $sterm) { $ic_slide->addTerm(trim($sterm), $specific_field['code']); } } } } $page_content = $all_specific_terms . ' ' . $page_content; $ic_slide->addValue('content', $page_content); // Add a comment to say terms separated by commas. $courseid = api_get_course_id(); $ic_slide->addCourseId($courseid); $ic_slide->addToolId(TOOL_LEARNPATH); $lp_id = $this->lp_id; $xapian_data = array(SE_COURSE_ID => $courseid, SE_TOOL_ID => TOOL_LEARNPATH, SE_DATA => array('lp_id' => $lp_id, 'lp_item' => $previous, 'document_id' => $document_id), SE_USER => (int) api_get_user_id()); $ic_slide->xapian_data = serialize($xapian_data); $di->addChunk($ic_slide); // Index and return search engine document id. $did = $di->index(); if ($did) { $course = $em->find('ChamiloCoreBundle:Course', api_get_course_int_id()); // Save it to db. $searchEngineRef = new \Chamilo\CoreBundle\Entity\SearchEngineRef(); $searchEngineRef->setCourse($course)->setToolId(TOOL_LEARNPATH)->setRefIdHighLevel($lp_id)->setRefIdSecondLevel($previous)->setSearchDid($did); $em->persist($searchEngineRef); $em->flush(); } } } } } }
/** * Queries the database. * The xapian_query function queries the database using both a query string * and application-defined terms. Based on drupal-xapian * * @param string $query_string The search string. This string will * be parsed and stemmed automatically. * @param XapianDatabase $db Xapian database to connect * @param int $start An integer defining the first * document to return * @param int $length The number of results to return. * @param array $extra An array containing arrays of * extra terms to search for. * @param int $count_type Number of items to retrieve * @return array An array of nids corresponding to the results. */ function xapian_query($query_string, $db = NULL, $start = 0, $length = 10, $extra = array(), $count_type = 0) { try { if (!is_object($db)) { $db = new XapianDatabase(XAPIAN_DB); } // Build subqueries from $extra array. Now only used by tags search filter on search widget $subqueries = array(); foreach ($extra as $subquery) { if (!empty($subquery)) { $subqueries[] = new XapianQuery($subquery); } } $query = NULL; $enquire = new XapianEnquire($db); if (!empty($query_string)) { $query_parser = new XapianQueryParser(); //TODO: choose stemmer $stemmer = new XapianStem("english"); $query_parser->set_stemmer($stemmer); $query_parser->set_database($db); $query_parser->set_stemming_strategy(XapianQueryParser::STEM_SOME); $query_parser->add_boolean_prefix('courseid', XAPIAN_PREFIX_COURSEID); $query_parser->add_boolean_prefix('toolid', XAPIAN_PREFIX_TOOLID); $query = $query_parser->parse_query($query_string); $final_array = array_merge($subqueries, array($query)); $query = new XapianQuery(XapianQuery::OP_AND, $final_array); } else { $query = new XapianQuery(XapianQuery::OP_OR, $subqueries); } $enquire->set_query($query); $matches = $enquire->get_mset((int) $start, (int) $length); $specific_fields = get_specific_field_list(); $results = array(); $i = $matches->begin(); // Display the results. //echo $matches->get_matches_estimated().'results found'; $count = 0; while (!$i->equals($matches->end())) { $count++; $document = $i->get_document(); if (is_object($document)) { // process one item terms $courseid_terms = xapian_get_doc_terms($document, XAPIAN_PREFIX_COURSEID); $results[$count]['courseid'] = substr($courseid_terms[0]['name'], 1); $toolid_terms = xapian_get_doc_terms($document, XAPIAN_PREFIX_TOOLID); $results[$count]['toolid'] = substr($toolid_terms[0]['name'], 1); // process each specific field prefix foreach ($specific_fields as $specific_field) { $results[$count]['sf-' . $specific_field['code']] = xapian_get_doc_terms($document, $specific_field['code']); } // rest of data $results[$count]['xapian_data'] = unserialize($document->get_data()); $results[$count]['score'] = $i->get_percent(); } $i->next(); } switch ($count_type) { case 1: // Lower bound $count = $matches->get_matches_lower_bound(); break; case 2: // Upper bound $count = $matches->get_matches_upper_bound(); break; case 0: // Best estimate // Best estimate default: $count = $matches->get_matches_estimated(); break; } return array($count, $results); } catch (Exception $e) { display_xapian_error($e->getMessage()); return NULL; } }
/** * Search options * TODO: support for multiple site. aka $_configuration['access_url'] == 1 * @author Marco Villegas <*****@*****.**> */ function handle_search() { global $SettingsStored, $_configuration; $search_enabled = api_get_setting('search_enabled'); $settings = api_get_settings('Search'); if ($search_enabled !== 'true' || count($settings) < 1) { Display::display_error_message(get_lang('SearchFeatureNotEnabledComment')); return; } require_once api_get_path(LIBRARY_PATH) . 'specific_fields_manager.lib.php'; $form = new FormValidator('search-options', 'post', api_get_self() . '?category=Search'); $renderer =& $form->defaultRenderer(); $renderer->setHeaderTemplate('<div class="sectiontitle">{header}</div>' . "\n"); $renderer->setElementTemplate('<div class="sectioncomment">{label}</div>' . "\n" . '<div class="sectionvalue">{element}</div>' . "\n"); //search_show_unlinked_results $form->addElement('header', null, get_lang('SearchShowUnlinkedResultsTitle')); $form->addElement('label', null, get_lang('SearchShowUnlinkedResultsComment')); $values = get_settings_options('search_show_unlinked_results'); $group = array(); foreach ($values as $key => $value) { $element =& $form->createElement('radio', 'search_show_unlinked_results', '', get_lang($value['display_text']), $value['value']); $group[] = $element; } $form->addGroup($group, 'search_show_unlinked_results', get_lang('SearchShowUnlinkedResultsComment'), '<br />', false); $default_values['search_show_unlinked_results'] = api_get_setting('search_show_unlinked_results'); //search_prefilter_prefix $form->addElement('header', null, get_lang('SearchPrefilterPrefix')); $form->addElement('label', null, get_lang('SearchPrefilterPrefixComment')); $specific_fields = get_specific_field_list(); $sf_values = array(); foreach ($specific_fields as $sf) { $sf_values[$sf['code']] = $sf['name']; } $group = array(); $form->addElement('select', 'search_prefilter_prefix', get_lang('SearchPrefilterPrefix'), $sf_values, ''); $default_values['search_prefilter_prefix'] = api_get_setting('search_prefilter_prefix'); //$form->addRule('search_show_unlinked_results', get_lang('ThisFieldIsRequired'), 'required'); $form->addElement('style_submit_button', 'search-options-save', get_lang('Ok')); $form->setDefaults($default_values); if ($form->validate()) { $formvalues = $form->exportValues(); $r = api_set_settings_category('Search', 'false', $_configuration['access_url']); // Save the settings foreach ($formvalues as $key => $value) { $result = api_set_setting($key, $value, null, null); } Display::display_normal_message($SettingsStored); } else { echo '<div id="search-options-form">'; $form->display(); echo '</div>'; } }
$tool_name = get_lang('EditSpecificSearchField'); } // Create the form $form = new FormValidator('specific_fields_add'); // Field variable name $form->addElement('hidden', 'field_id', $fieldId); $form->addElement('text', 'field_name', get_lang('FieldName')); $form->applyFilter('field_name', 'html_filter'); $form->applyFilter('field_name', 'trim'); $form->addRule('field_name', get_lang('ThisFieldIsRequired'), 'required'); $form->addRule('field_name', get_lang('OnlyLettersAndNumbersAllowed'), 'username'); $form->addRule('field_name', '', 'maxlength', 20); // Set default values (only not empty when editing) $defaults = array(); if ($fieldId) { $form_information = get_specific_field_list(array('id' => $fieldId)); $defaults['field_name'] = $form_information[0]['name']; } $form->setDefaults($defaults); // Submit button $form->addButtonCreate(get_lang('Add'), 'submit'); // Validate form if ($form->validate()) { $field = $form->exportValues(); $field_name = $field['field_name']; if (is_numeric($field['field_id']) && $field['field_id'] != 0 && !empty($field['field_id'])) { edit_specific_field($field['field_id'], $field['field_name']); $message = get_lang('FieldEdited'); } else { $field_id = add_specific_field($field_name); $message = get_lang('FieldAdded');