* @author Marco Antonio Villegas Vega * @author Julio Montoya bug fixing */ require api_get_path(LIBRARY_PATH).'search/search_widget.php'; require api_get_path(LIBRARY_PATH).'search/ChamiloQuery.php'; require_once api_get_path(LIBRARY_PATH).'specific_fields_manager.lib.php'; Event::event_access_tool(TOOL_SEARCH); if (api_is_in_gradebook()) { $interbreadcrumb[] = [ 'url' => Category::getUrl(), 'name' => get_lang('Assessments'), ]; } $interbreadcrumb[] = ['url' => './index.php', 'name' => get_lang(ucfirst(TOOL_SEARCH))]; search_widget_prepare($htmlHeadXtra); Display::display_header(null, 'Path'); if (api_get_setting('search_enabled') !== 'true') { echo Display::return_message(get_lang('The full-text search feature is not enabled in Chamilo. Please contact the Chamilo administrator.'), 'error'); } else { if (!empty($_GET['action'])) { search_widget_show($_GET['action']); } else { search_widget_show(); } } // Initialize. $op = 'or'; if (!empty($_REQUEST['operator']) && in_array($op, ['or', 'and'])) { $op = $_REQUEST['operator']; } $query = null; if (isset($_REQUEST['query'])) { $query = stripslashes(htmlspecialchars_decode($_REQUEST['query'], ENT_QUOTES)); } $mode = 'default'; if (isset($_GET['mode']) && in_array($_GET['mode'], ['gallery', 'default'])) { $mode = $_GET['mode']; } $term_array = []; $specific_fields = get_specific_field_list(); foreach ($specific_fields as $specific_field) { if (!empty($_REQUEST['sf_'.$specific_field['code']])) { $values = $_REQUEST['sf_'.$specific_field['code']]; if (in_array('__all__', $values)) { $sf_terms_for_code = xapian_get_all_terms( 1000, $specific_field['code'] ); foreach ($sf_terms_for_code as $term) { if (!empty($term)) { $term_array[] = chamilo_get_boolean_query($term['name']); // Here name includes prefix. } } } else { foreach ($values as $term) { if (!empty($term)) { $prefix = $specific_field['code']; $term_array[] = chamilo_get_boolean_query($prefix.$term); } } } } else { $sf_terms_for_code = xapian_get_all_terms(1000, $specific_field['code']); foreach ($sf_terms_for_code as $term) { if (!empty($term)) { // Here name includes prefix. $term_array[] = chamilo_get_boolean_query($term['name']); } } } } // Get right group of terms to show on multiple select. $fixed_queries = []; $course_filter = null; if (($cid = api_get_course_id()) != -1) { // Results only from actual course. $course_filter = chamilo_get_boolean_query(XAPIAN_PREFIX_COURSEID.$cid); } if (count($term_array)) { $fixed_queries = chamilo_join_queries($term_array, null, $op); if ($course_filter != null) { $fixed_queries = chamilo_join_queries( $fixed_queries, $course_filter, 'and' ); } } else { if (!empty($query)) { $fixed_queries = [$course_filter]; } } if ($query) { list($count, $results) = chamilo_query_query( api_convert_encoding($query, 'UTF-8', $charset), 0, 1000, $fixed_queries ); } else { $count = 0; $results = []; } // Prepare blocks to show. $blocks = []; if ($count > 0) { foreach ($results as $result) { // Fill the result array. if (empty($result['thumbnail'])) { $result['thumbnail'] = Display::returnIconPath('no_document_thumb.jpg'); } if (!empty($result['url'])) { $a_prefix = ''; $a_suffix = ''; } else { $a_prefix = ''; $a_suffix = ''; } if ($mode == 'gallery') { $title = $a_prefix.str_replace('_', ' ', $result['title']).$a_suffix; $blocks[] = [1 => $a_prefix.''.$a_suffix.'
'.$title.'
'.$result['author'], ]; } else { $title = '
'.$a_prefix.$result['title'].$a_suffix.(!empty($result['author']) ? ' '.$result['author'] : '').'
'; $blocks[] = [1 => $title]; } } } // Show results. if (count($blocks) > 0) { $s = new SortableTableFromArray($blocks); $s->display_mode = $mode; // default $s->display_mode_params = 3; $s->per_page = 9; $additional_parameters = [ 'mode' => $mode, 'action' => 'search', 'query' => Security::remove_XSS($_REQUEST['query']), ]; $get_params = ''; foreach ($specific_fields as $specific_field) { if (isset($_REQUEST['sf_'.$specific_field['code']])) { $values = $_REQUEST['sf_'.$specific_field['code']]; //Sortable additional_parameters doesn't accept multi dimensional arrays //$additional_parameters[ 'sf_'. $specific_field['code'] ] = $values; foreach ($values as $value) { $get_params .= '&sf_'.$specific_field['code'].'[]='.$value; } $get_params .= '&'; } } $additional_parameters['operator'] = $op; $s->additional_parameters = $additional_parameters; if ($mode == 'default') { $s->set_header(0, get_lang(ucfirst(TOOL_SEARCH)), false); } $search_link = ''; $iconGallery = (($mode == 'gallery') ? 'ButtonGallOn' : 'ButtonGallOff').'.png'; $iconDefault = (($mode == 'default') ? 'ButtonListOn' : 'ButtonListOff').'.png'; $mode_selector = '
'; $mode_selector .= sprintf($search_link, api_get_path(WEB_CODE_PATH), 'gallery', $_REQUEST['query'], $get_params); $mode_selector .= Display::return_icon($iconGallery).''; $mode_selector .= sprintf($search_link, api_get_path(WEB_CODE_PATH), 'default', $_REQUEST['query'], $get_params); $mode_selector .= Display::return_icon($iconDefault).''; $mode_selector .= '
'; echo '
'; echo $mode_selector; $s->display(); echo '
'; } Display::display_footer();