lp_list_search.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * Script to draw the results from a query.
  5. *
  6. * @package chamilo.learnpath
  7. *
  8. * @author Diego Escalante Urrelo <diegoe@gmail.com>
  9. * @author Marco Antonio Villegas Vega <marvil07@gmail.com>
  10. * @author Julio Montoya <gugli100@gmail.com> bug fixing
  11. */
  12. require api_get_path(LIBRARY_PATH).'search/search_widget.php';
  13. require api_get_path(LIBRARY_PATH).'search/ChamiloQuery.php';
  14. require_once api_get_path(LIBRARY_PATH).'specific_fields_manager.lib.php';
  15. Event::event_access_tool(TOOL_SEARCH);
  16. if (api_is_in_gradebook()) {
  17. $interbreadcrumb[] = [
  18. 'url' => Category::getUrl(),
  19. 'name' => get_lang('Assessments'),
  20. ];
  21. }
  22. $interbreadcrumb[] = ['url' => './index.php', 'name' => get_lang(ucfirst(TOOL_SEARCH))];
  23. search_widget_prepare($htmlHeadXtra);
  24. Display::display_header(null, 'Path');
  25. if (api_get_setting('search_enabled') !== 'true') {
  26. echo Display::return_message(get_lang('The full-text search feature is not enabled in Chamilo. Please contact the Chamilo administrator.'), 'error');
  27. } else {
  28. if (!empty($_GET['action'])) {
  29. search_widget_show($_GET['action']);
  30. } else {
  31. search_widget_show();
  32. }
  33. }
  34. // Initialize.
  35. $op = 'or';
  36. if (!empty($_REQUEST['operator']) && in_array($op, ['or', 'and'])) {
  37. $op = $_REQUEST['operator'];
  38. }
  39. $query = null;
  40. if (isset($_REQUEST['query'])) {
  41. $query = stripslashes(htmlspecialchars_decode($_REQUEST['query'], ENT_QUOTES));
  42. }
  43. $mode = 'default';
  44. if (isset($_GET['mode']) && in_array($_GET['mode'], ['gallery', 'default'])) {
  45. $mode = $_GET['mode'];
  46. }
  47. $term_array = [];
  48. $specific_fields = get_specific_field_list();
  49. foreach ($specific_fields as $specific_field) {
  50. if (!empty($_REQUEST['sf_'.$specific_field['code']])) {
  51. $values = $_REQUEST['sf_'.$specific_field['code']];
  52. if (in_array('__all__', $values)) {
  53. $sf_terms_for_code = xapian_get_all_terms(
  54. 1000,
  55. $specific_field['code']
  56. );
  57. foreach ($sf_terms_for_code as $term) {
  58. if (!empty($term)) {
  59. $term_array[] = chamilo_get_boolean_query($term['name']); // Here name includes prefix.
  60. }
  61. }
  62. } else {
  63. foreach ($values as $term) {
  64. if (!empty($term)) {
  65. $prefix = $specific_field['code'];
  66. $term_array[] = chamilo_get_boolean_query($prefix.$term);
  67. }
  68. }
  69. }
  70. } else {
  71. $sf_terms_for_code = xapian_get_all_terms(1000, $specific_field['code']);
  72. foreach ($sf_terms_for_code as $term) {
  73. if (!empty($term)) {
  74. // Here name includes prefix.
  75. $term_array[] = chamilo_get_boolean_query($term['name']);
  76. }
  77. }
  78. }
  79. }
  80. // Get right group of terms to show on multiple select.
  81. $fixed_queries = [];
  82. $course_filter = null;
  83. if (($cid = api_get_course_id()) != -1) {
  84. // Results only from actual course.
  85. $course_filter = chamilo_get_boolean_query(XAPIAN_PREFIX_COURSEID.$cid);
  86. }
  87. if (count($term_array)) {
  88. $fixed_queries = chamilo_join_queries($term_array, null, $op);
  89. if ($course_filter != null) {
  90. $fixed_queries = chamilo_join_queries(
  91. $fixed_queries,
  92. $course_filter,
  93. 'and'
  94. );
  95. }
  96. } else {
  97. if (!empty($query)) {
  98. $fixed_queries = [$course_filter];
  99. }
  100. }
  101. if ($query) {
  102. list($count, $results) = chamilo_query_query(
  103. api_convert_encoding($query, 'UTF-8', $charset),
  104. 0,
  105. 1000,
  106. $fixed_queries
  107. );
  108. } else {
  109. $count = 0;
  110. $results = [];
  111. }
  112. // Prepare blocks to show.
  113. $blocks = [];
  114. if ($count > 0) {
  115. foreach ($results as $result) {
  116. // Fill the result array.
  117. if (empty($result['thumbnail'])) {
  118. $result['thumbnail'] = Display::returnIconPath('no_document_thumb.jpg');
  119. }
  120. if (!empty($result['url'])) {
  121. $a_prefix = '<a href="'.$result['url'].'">';
  122. $a_suffix = '</a>';
  123. } else {
  124. $a_prefix = '';
  125. $a_suffix = '';
  126. }
  127. if ($mode == 'gallery') {
  128. $title = $a_prefix.str_replace('_', ' ', $result['title']).$a_suffix;
  129. $blocks[] = [1 => $a_prefix.'<img src="'.$result['thumbnail'].'" />'.$a_suffix.'<br />'.$title.'<br />'.$result['author'],
  130. ];
  131. } else {
  132. $title = '<div style="text-align:left;">'.$a_prefix.$result['title'].$a_suffix.(!empty($result['author']) ? ' '.$result['author'] : '').'<div>';
  133. $blocks[] = [1 => $title];
  134. }
  135. }
  136. }
  137. // Show results.
  138. if (count($blocks) > 0) {
  139. $s = new SortableTableFromArray($blocks);
  140. $s->display_mode = $mode; // default
  141. $s->display_mode_params = 3;
  142. $s->per_page = 9;
  143. $additional_parameters = [
  144. 'mode' => $mode,
  145. 'action' => 'search',
  146. 'query' => Security::remove_XSS($_REQUEST['query']),
  147. ];
  148. $get_params = '';
  149. foreach ($specific_fields as $specific_field) {
  150. if (isset($_REQUEST['sf_'.$specific_field['code']])) {
  151. $values = $_REQUEST['sf_'.$specific_field['code']];
  152. //Sortable additional_parameters doesn't accept multi dimensional arrays
  153. //$additional_parameters[ 'sf_'. $specific_field['code'] ] = $values;
  154. foreach ($values as $value) {
  155. $get_params .= '&sf_'.$specific_field['code'].'[]='.$value;
  156. }
  157. $get_params .= '&';
  158. }
  159. }
  160. $additional_parameters['operator'] = $op;
  161. $s->additional_parameters = $additional_parameters;
  162. if ($mode == 'default') {
  163. $s->set_header(0, get_lang(ucfirst(TOOL_SEARCH)), false);
  164. }
  165. $search_link = '<a href="%ssearch/index.php?mode=%s&action=search&query=%s%s">';
  166. $iconGallery = (($mode == 'gallery') ? 'ButtonGallOn' : 'ButtonGallOff').'.png';
  167. $iconDefault = (($mode == 'default') ? 'ButtonListOn' : 'ButtonListOff').'.png';
  168. $mode_selector = '<div id="mode-selector">';
  169. $mode_selector .= sprintf($search_link, api_get_path(WEB_CODE_PATH), 'gallery', $_REQUEST['query'], $get_params);
  170. $mode_selector .= Display::return_icon($iconGallery).'</a>';
  171. $mode_selector .= sprintf($search_link, api_get_path(WEB_CODE_PATH), 'default', $_REQUEST['query'], $get_params);
  172. $mode_selector .= Display::return_icon($iconDefault).'</a>';
  173. $mode_selector .= '</div>';
  174. echo '<div id="search-results-container">';
  175. echo $mode_selector;
  176. $s->display();
  177. echo '</div>';
  178. }
  179. Display::display_footer();