chamilo/chamilo-lms

View on GitHub
public/main/lp/lp_list_search.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/* For licensing terms, see /license.txt */

/**
 * Script to draw the results from a query.
 *
 * @author Diego Escalante Urrelo <diegoe@gmail.com>
 * @author Marco Antonio Villegas Vega <marvil07@gmail.com>
 * @author Julio Montoya <gugli100@gmail.com> bug fixing
 */
require api_get_path(LIBRARY_PATH).'search/search_widget.php';
require api_get_path(LIBRARY_PATH).'search/ChamiloQuery.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 ('true' !== api_get_setting('search_enabled')) {
    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 (-1 != ($cid = api_get_course_id())) {
    // 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 (null != $course_filter) {
        $fixed_queries = chamilo_join_queries(
            $fixed_queries,
            $course_filter,
            'and'
        );
    }
} else {
    if (!empty($query)) {
        $fixed_queries = [$course_filter];
    }
}

if ($query) {
    [$count, $results] = chamilo_query_query(
        $query,
        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 href="'.$result['url'].'">';
            $a_suffix = '</a>';
        } else {
            $a_prefix = '';
            $a_suffix = '';
        }

        if ('gallery' == $mode) {
            $title = $a_prefix.str_replace('_', ' ', $result['title']).$a_suffix;
            $blocks[] = [1 => $a_prefix.'<img src="'.$result['thumbnail'].'" />'.$a_suffix.'<br />'.$title.'<br />'.$result['author'],
            ];
        } else {
            $title = '<div style="text-align:left;">'.$a_prefix.$result['title'].$a_suffix.(!empty($result['author']) ? ' '.$result['author'] : '').'<div>';
            $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 ('default' == $mode) {
        $s->set_header(0, get_lang(ucfirst(TOOL_SEARCH)), false);
    }

    $search_link = '<a href="%ssearch/index.php?mode=%s&action=search&query=%s%s">';

    $mode_selector = '<div id="mode-selector">';
    $mode_selector .= sprintf($search_link, api_get_path(WEB_CODE_PATH), 'gallery', $_REQUEST['query'], $get_params);
    $mode_selector .= ('gallery' == $mode) ? getMdiIcon(ObjectIcon::GALLERY, 'ch-tool-icon') : getMdiIcon(ObjectIcon::GALLERY, 'ch-tool-icon-disabled');
    $mode_selector .= sprintf($search_link, api_get_path(WEB_CODE_PATH), 'default', $_REQUEST['query'], $get_params);
    $mode_selector .= ('default' == $mode) ? getMdiIcon(ObjectIcon::LIST, 'ch-tool-icon') : getMdiIcon(ObjectIcon::LIST, 'ch-tool-icon-disabled');
    $mode_selector .= '</div>';

    echo '<div id="search-results-container">';
    echo $mode_selector;
    $s->display();
    echo '</div>';
}

Display::display_footer();