* @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 * @category Stud.IP * @since 4.3 */ class Search_GlobalsearchController extends AuthenticatedController { /** * This action displays the main page of the global search. * It is also responsible for handling search requests and showing * search results. * * @return null This method does not return any value. */ public function index_action() { PageLayout::setTitle(_('Globale Suche')); if (Navigation::hasItem('/search/globalsearch')) { Navigation::activateItem('/search/globalsearch'); } PageLayout::addHeadElement('meta', [ 'name' => 'studip-cache-prefix', 'content' => md5($_COOKIE[sess()->getName()] . '-' . $GLOBALS['user']->id), ]); PageLayout::setBodyElementId('globalsearch-page'); $this->addInfoText(); $this->addSidebar(); } /** * Add the sidebar to the search page including the searchable categories * and their filters. */ private function addSidebar() { $sidebar = Sidebar::get(); $links_widget = $sidebar->addWidget(new ViewsWidget()); $links_widget->setTitle(_('Ergebnis-Anzeige')); $links_widget->id = 'category_widget'; $links_widget->addLink( _('Alle Ergebnisse'), '#', null, ['id' => 'show_all_categories'] )->setActive(); $modules = GlobalSearchModule::getActiveSearchModules(); $this->filters['show_all_categories'] = ['semester']; foreach ($modules as $class_name) { if (is_a($class_name, 'GlobalSearchModule', true)) { $this->filters[$class_name] = $class_name::getFilters(); $links_widget->addLink( $class_name::getName(), '#' . $class_name, null, ['id' => "search_category_{$class_name}"] ); } } $filter_widget = $sidebar->addWidget(new OptionsWidget(_('Filter'))); $filter_widget->id = 'filter_widget'; $filter_widget->addElement( new SelectListElement( _('Semester'), 'semester', $this->getSemesters(), 'future', ['id' => 'semester_select'] ), 'semester_filter' ); $filter_widget->addElement( new SelectListElement( _('Typ der Veranstaltung'), 'seminar_type', $this->getSemClasses(), '', ['id' => 'seminar_type_select'] ), 'seminar_type_filter' ); $filter_widget->addElement( new SelectListElement( _('Einrichtung'), 'institute', $this->getInstitutes(), '', ['id' => 'institute_select'] ), 'institute_filter' ); $filter_widget->addElement( new SelectListElement( _('Studiengang'), 'study_course', $this->getStudyCourses(), '', ['id' => 'study_course_select'] ), 'study_course_filter' ); } /** * Get semesters for the semester-select-filter (dropdown). * The semester filter shows all available semesters * and sets the current semester as the selected default. * * @return array with key => value pairs like: array('semester_beginn' => 'semester_name') */ private function getSemesters() { $semesters = []; $semesters['future'] = _('Aktuelles und nächstes Semester'); $semesters[''] = _('Alle Semester'); $sems = array_reverse(Semester::getAll()); foreach ($sems as $semester) { $semesters[$semester['beginn']] = $semester['name']; } return $semesters; } /** * Get institutes for the institute-select-filter (dropdown). * The institute filter shows all available institutes and presents the 2-level hierarchy with indented names. * * @return array with key => value pairs like: array('institute_id' => 'institute_name') */ private function getInstitutes() { $institutes = []; $institutes[''] = _('Alle Einrichtungen'); $insts = Institute::getInstitutes(); foreach ($insts as $institute) { $institutes[$institute['Institut_id']] = ($institute['is_fak'] ? '' : ' ') . $institute['Name']; } return $institutes; } /** * Get seminar types for the seminar-type-select-filter (dropdown). * The seminar type filter shows all available seminar types and * seminar type classes which are presented as a 2-level hierarchy with indented names. * * @return array with key => value pairs like: array('seminar_type_id' => 'seminar_type_name') */ private function getSemClasses() { $sem_classes = []; $sem_classes[''] = _('Alle Veranstaltungsarten'); foreach ($GLOBALS['SEM_CLASS'] as $class_id => $class) { $sem_classes[$class_id] = $class['name']; if (!$class['studygroup_mode']) { foreach ($class->getSemTypes() as $type_id => $type) { $sem_classes["{$class_id}_{$type_id}"] = " {$type['name']}"; } } } return $sem_classes; } /** * @return array */ private function getStudyCourses() { $this->user = User::findCurrent(); $study_courses = []; foreach ($this->user->studycourses as $usc) { $study_courses[] = $usc->studycourse->name; } return $study_courses; } /** * Add some information on how to use the search. */ private function addInfoText() { Helpbar::get()->addPlainText(_('Platzhalter'), _('_ ist Platzhalter für ein beliebiges Zeichen. % ist Platzhalter für beliebig viele Zeichen. Me_er findet Treffer für Meyer und Meier. M__er findet zusätzlich auch Mayer und Maier. M%er findet alle vorherigen Treffer aber auch Münchner.')); Helpbar::get()->addPlainText(_('Klick auf Überschrift'), _('Erweitert die ausgewählte Suchkategorie, um mehr Suchergebnisse aus dieser Kategorie anzuzeigen. Ein weiterer Klick zeigt wieder Ergebnisse aus allen Kategorien an.')); Helpbar::get()->addPlainText(_('Dateisuche'), _('Die Dateisuche kann über einen Schrägstrich (/) verfeinert werden. Beispiel: "Meine Veranstaltung/Datei" zeigt alle Dateien, die das Wort "Datei" enthalten und in "Meine Veranstaltung" sind, an. Die Veranstaltung kann auch auf einen Teil (z.B. Veran/Datei) oder auf die Großbuchstaben bzw. auch deren Abkürzung (z.B. MV/Datei oder V/Datei) beschränkt werden.')); } }