<?php 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->js('/blocks/hshcourselist/javascript/jquery-3.2.0.min.js'); $this->page->requires->css('/blocks/hshcourselist/style.css'); if ($this->content !== null) { return $this->content; } $this->content = new stdClass(); $context_block = 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 = ""; } $list_contents = ''; $anchor = html_writer::tag('a', '', array('name' => 'hshcourselistanchor')); $ordercheckbox = html_writer::empty_tag('input', array('type' => 'checkbox', 'name' => 'orderbysemestercheckbox', 'id' => 'orderbysemestercheckbox_id')); $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.$questionhsh.$input.$progress, $formattrs); if (!empty($hshcoursesubmit)) { $courses = self::get_courses($search, $context_block, $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); $list_contents .= $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', $list_contents, 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); foreach($keywordArray as $key => $value) { $keywordArray[$key] = "%".$keywordArray[$key]."%"; } $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, $keywordArray); $where .= 'fullname ILIKE ?'; for ($i = 0; $i <= count($keywordArray)-2; $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; } }