<?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * Course list block. * Original: block_course_list * * @package block_hshcourselist * @copyright 1999 onwards Martin Dougiamas (http://dougiamas.com), Edited by Tobias Baden, Hochschule Hannover * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); class block_hshcourselist extends block_base { private $globalconf; public function init() { $this->globalconf = get_config('block_hshcourselist'); $this->title = get_string('default_blocktitle', 'block_hshcourselist'); } // Stop it showing up on any add block lists. public function applicable_formats() { return (array( 'all' => false, 'site' => true, 'my' => true, 'course-index' => true )); } public function has_config() { return true; } public function get_content() { global $CFG, $DB, $OUTPUT; $this->page->requires->css('/blocks/hshcourselist/style.css'); if ($this->content !== null) { return $this->content; } $this->content = new stdClass(); $contextblock = context_block::instance($this->instance->id); $search = optional_param('hshcoursesearch', '', PARAM_TEXT); $hshcoursesubmit = optional_param('hshcoursesubmit', false, PARAM_TEXT); // Set placeholder. if ($this->config->placeholder) { $placeholder = $this->config->placeholder; } else { $placeholder = ""; } $listcontents = ''; $anchor = html_writer::tag('a', '', array('name' => 'hshcourselistanchor')); $ordercheckbox = html_writer::empty_tag('input', array('type' => 'checkbox', 'name' => 'orderbysemestercheckbox', 'id' => 'orderbysemestercheckbox_id', 'checked' => 'true')); $ordercheckbox .= html_writer::start_tag('label', array('for' => 'orderbysemestercheckbox_id')); $ordercheckbox .= get_string('orderbysemester', 'block_hshcourselist'); $ordercheckbox .= html_writer::end_tag('label'); $idsearchinglabel = html_writer::empty_tag('p', array('class' => 'idSarchingLabel')); $idsearchinglabel .= get_string('idsearchinglabel', 'block_hshcourselist'); $idsearchinglabel .= html_writer::end_tag('p'); $inputattrs = array( 'autocomplete' => 'off', 'name' => 'hshcourselistsearch', 'id' => 'hshcourselistsearch', 'class' => 'form-control', 'value' => $search, 'placeholder' => $placeholder ); $input = html_writer::empty_tag('input', $inputattrs); $questionattrs = array( 'class' => 'icon fa fa-question-circle text-info fa-fw', 'title' => 'Hilfe für HsH Kurssuche', 'aria-label' => 'Hilfe für HsH Kurssuche', 'aria-hidden' => 'true' ); $atagparams = array( 'class' => 'btn btn-link p-0', 'role' => 'button', 'data-container' => 'body', 'data-toggle' => 'popover', 'data-placement' => 'right', 'data-content' => "<div class='no-overflow'><p>Die Kurssuche ist eine Volltextsuche in der Sie auch mehrere Suchbegriffe (mit Leerzeichen getrennt) eingeben können.<br/> Verschiedene Suchbegriffe werden einzeln in den Kursnamen gesucht und dann eine vollständige Liste angezeigt.<br/> Bsp: WiSe Programmieren => zeigt Ihnen alle Kurse, dessen Kursname oder Kurskurzname 'WiSe' <i>UND</i> 'Programmieren' enthalten.</p> <p>Kurzsuche: Möchten Sie einen Kurs schnell über die <i>'id'</i> finden, so können Sie dies durch das Voranstellen einer Raute <i>'#'</i> erreichen.<br/> Bsp: <i>#3303</i> zeigt Ihnen den Kurs <i>'Moodle Demo-Kurs, ELC'</i></p>", 'data-html' => 'true', 'tabindex' => '0', 'data-trigger' => 'focus', 'data-original-title' => '', 'title' => '' ); $questionhsh = html_writer::start_span("helpbutton"); $questionhsh .= html_writer::start_tag('a', $atagparams); $questionhsh .= html_writer::start_tag('i', $questionattrs); $questionhsh .= html_writer::end_tag('i'); $questionhsh .= html_writer::end_tag('a'); $questionhsh .= html_writer::end_span(); $progressattrs = array( 'src' => $OUTPUT->image_url('i/loading_small', 'moodle'), 'class' => 'hshcourseprogress', 'id' => 'hshcourseprogress', 'alt' => get_string('loading', 'block_hshcourselist') ); $progress = html_writer::empty_tag('img', $progressattrs); $formattrs = array( 'id' => 'hshcourseform', 'method' => 'post', 'name' => 'hshcourselistform', 'action' => new moodle_url('/') ); $form = html_writer::tag('form', $idsearchinglabel.$ordercheckbox.$input.$questionhsh.$progress, $formattrs); if (!empty($hshcoursesubmit)) { $courses = self::get_courses($search, $contextblock, $this->globalconf->splitterms, $this->globalconf->restrictcontext, $this->page->context, $this->globalconf->idsearching, $this->config->orderbysemester); if (!empty($courses)) { foreach ($courses as $course) { $url = new moodle_url('/course/view.php', array('id' => $course->id)); $resultstr = null; if (!empty($this->config->displaymode)) { $displaymode = $this->config->displaymode; } else { $displaymode = 2; } switch ($displaymode): case 1: $resultstr = $course->shortname; break; case 2: $resultstr = $course->fullname; break; default: $resultstr = $course->shortname.': '.$course->fullname; break; endswitch; $link = html_writer::tag('a', $resultstr, array('href' => $url->out())); $li = html_writer::tag('li', $link); $listcontents .= $li; } } } if (!isset($this->config->orderbysemester)) { $orderbysemester = false; } else { $orderbysemester = $this->config->orderbysemester; } if (!isset($this->config->displaymode)) { $displaymode = 2; } else { $displaymode = $this->config->displaymode; } $list = html_writer::tag('ul', $listcontents, array('id' => 'hshcourselistul')); $this->content->text = $anchor.$form.$list; $jsdata = array( 'instanceid' => $this->instance->id, 'sesskey' => sesskey(), 'displaymode' => $displaymode, 'orderbysemester' => $orderbysemester, 'contextid' => $this->page->context->id ); $this->page->requires->js_call_amd('block_hshcourselist/jmodule', 'init', array($jsdata, $CFG->wwwroot)); // Einstellungen für den Custom-Footer. if (!empty($this->config->footer) && $this->config->enablefooter) { $this->content->footer = $this->config->footer; } // Einstellungen für den Custom-Header. if (!empty($this->config->title) && $this->config->enablecustomheader) { $this->title = $this->config->title; } $this->page->requires->js_call_amd('block_hshcourselist/listselect', 'init', array($CFG->wwwroot)); return $this->content; } public static function get_courses($search, $blockcontext, $splitterms = false, $restrictcontext = false, $pagecontext = null, $idsearch, $orderbysemester) { global $DB; $params = array(SITEID); $keywordarray = explode(" ", $search); $paramscount = count($keywordarray); $duplicatedkeywordarray = array(); for ($x = 0; $x <= $paramscount - 1; $x++) { $actuallength = count($duplicatedkeywordarray); $duplicatedkeywordarray[$actuallength] = "%".$keywordarray[$x]."%"; $duplicatedkeywordarray[$actuallength + 1] = "%".$keywordarray[$x]."%"; } $where = 'id != ? AND ('; if ($splitterms) { $terms = explode(' ', $search); $like = '%1$s LIKE'; foreach ($terms as $key => $term) { $like .= ' ?'; if ($key < count($terms) - 1) { $like .= ' AND %1$s LIKE'; } $terms[$key] = '%'.$term.'%'; } $params = array_merge($params, $terms, $terms); $where .= sprintf($like, 'shortname').' OR '.sprintf($like, 'fullname'); } else { if ($idsearch) { $params = array_merge($params, array($search)); $where .= 'id = ?'; } else { $params = array_merge($params, $duplicatedkeywordarray); $where .= '(fullname ILIKE ? OR shortname ILIKE ?)'; for ($i = 1; $i <= $paramscount - 1; $i++) { $where .= ' AND (fullname ILIKE ? OR shortname ILIKE ?)'; } } } $where .= ')'; if (!has_capability('moodle/course:viewhiddencourses', $blockcontext)) { $where .= ' AND visible=1'; } if ($restrictcontext) { if ($pagecontext && $pagecontext->get_level_name() == get_string('category')) { $where .= ' AND category = ?'; $params[] = $pagecontext->instanceid; } } if ($orderbysemester) { $order = 'startdate DESC'; } else if ($idsearch) { $order = 'idnumber'; } else { $order = 'fullname'; } $fields = 'id, idnumber, shortname, fullname'; $courses = $DB->get_recordset_select('course', $where, $params, $order, $fields); return $courses; } }