aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/StudipSemSearchHelper.php
diff options
context:
space:
mode:
authorPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
committerPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
commit4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch)
tree5c07151ae61276d334e88f6309c30d439a85c12e /lib/classes/StudipSemSearchHelper.php
parentda0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff)
parent97a188592c679890a25c37ab78463add76a52ff7 (diff)
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/classes/StudipSemSearchHelper.php')
-rw-r--r--lib/classes/StudipSemSearchHelper.php239
1 files changed, 239 insertions, 0 deletions
diff --git a/lib/classes/StudipSemSearchHelper.php b/lib/classes/StudipSemSearchHelper.php
new file mode 100644
index 0000000..d221869
--- /dev/null
+++ b/lib/classes/StudipSemSearchHelper.php
@@ -0,0 +1,239 @@
+<?php
+# Lifter002: TODO
+# Lifter007: TODO
+# Lifter003: TODO
+# Lifter010: TODO
+// +---------------------------------------------------------------------------+
+// This file is part of Stud.IP
+// StudipSemSearchHelper.php
+//
+//
+// Copyright (c) 2003 André Noack <noack@data-quest.de>
+// +---------------------------------------------------------------------------+
+// This program 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 2
+// of the License, or any later version.
+// +---------------------------------------------------------------------------+
+// This program 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 this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+// +---------------------------------------------------------------------------+
+
+class StudipSemSearchHelper {
+
+ public static function GetQuickSearchFields(){
+ return [ 'all' =>_("alles"),
+ 'title_lecturer_number' => _("Titel") . ', ' . _("Lehrende") . ', ' . _("Nummer"),
+ 'title' => _("Titel"),
+ 'sub_title' => _("Untertitel"),
+ 'lecturer' => _("Lehrende"),
+ 'number' => _("Nummer"),
+ 'comment' => _("Kommentar"),
+ 'scope' => _("Bereich")];
+ }
+
+ private $search_result;
+ private $found_rows = false;
+ private $params = [];
+ private $visible_only;
+
+ function __construct($form = null, $visible_only = null){
+ $params = [];
+ if($form instanceof StudipForm){
+ foreach($form->getFormFieldsByName(true) as $name){
+ $params[$name] = $form->getFormFieldValue($name);
+ }
+ }
+ $this->setParams($params, $visible_only);
+ }
+
+ public function setParams($params, $visible_only = null)
+ {
+ if(isset($params['quick_search']) && isset($params['qs_choose'])){
+ if($params['qs_choose'] == 'all'){
+ foreach (self::GetQuickSearchFields() as $key => $value){
+ $params[$key] = $this->trim($params['quick_search']);
+ }
+ $params['combination'] = 'OR';
+ } elseif($params['qs_choose'] == 'title_lecturer_number') {
+ foreach (explode('_', 'title_lecturer_number') as $key){
+ $params[$key] = $this->trim($params['quick_search']);
+ }
+ $params['combination'] = 'OR';
+ } else {
+ $params[$params['qs_choose']] = $this->trim($params['quick_search']);
+ }
+ }
+ if(!isset($params['combination'])) $params['combination'] = 'AND';
+ $this->params = $params;
+ $this->visible_only = $visible_only;
+ }
+
+ public function doSearch()
+ {
+ if (count($this->params) === 0) {
+ return false;
+ }
+ $this->params = array_map('addslashes', $this->params);
+ $clause = "";
+ $and_clause = "";
+ $this->search_result = new DbSnapshot();
+ $combination = $this->params['combination'];
+
+ $view = DbView::getView('sem_tree');
+
+ if (isset($this->params['sem']) && $this->params['sem'] !== 'all'){
+ $sem_number = (int)$this->params['sem'];
+ $clause = " HAVING (sem_number <= $sem_number AND (sem_number_end >= $sem_number OR sem_number_end = -1)) ";
+ }
+
+ $sem_types = [];
+ if (isset($this->params['category']) && $this->params['category'] !== 'all') {
+ foreach ($GLOBALS['SEM_TYPE'] as $type_key => $type_value) {
+ if ($type_value['class'] == $this->params['category']) {
+ $sem_types[] = $type_key;
+ }
+ }
+ }
+
+ if (isset($this->params['type']) && $this->params['type'] != 'all'){
+ $sem_types = [$this->params['type']];
+ }
+ if ($sem_types) {
+ $clause = " AND c.status IN('" . join("','",$sem_types) . "') " . $clause;
+ }
+
+ $view->params = [];
+
+ if ($this->params['scope_choose'] && $this->params['scope_choose'] != 'root'){
+ $sem_tree = TreeAbstract::GetInstance("StudipSemTree", false);
+ $view->params[0] = $sem_types ?: $sem_tree->sem_status;
+ $view->params[1] = $this->visible_only ? "c.visible=1" : "1";
+
+ $view->params[2] = $sem_tree->getKidsKids($this->params['scope_choose']);
+ $view->params[2][] = $this->params['scope_choose'];
+ $view->params[3] = $clause;
+ $snap = new DbSnapshot($view->get_query("view:SEM_TREE_GET_SEMIDS"));
+ if ($snap->numRows){
+ $clause = " AND c.seminar_id IN('" . join("','",$snap->getRows("seminar_id")) ."')" . $clause;
+ } else {
+ return 0;
+ }
+ unset($snap);
+ }
+
+ if ($this->params['range_choose'] && $this->params['range_choose'] != 'root'){
+ $range_object = RangeTreeObject::GetInstance($this->params['range_choose']);
+ $view->params[0] = $range_object->getAllObjectKids();
+ $view->params[0][] = $range_object->item_data['studip_object_id'];
+ $view->params[1] = ($this->visible_only ? " AND c.visible=1 " : "");
+ $view->params[2] = $clause;
+ $snap = new DbSnapshot($view->get_query("view:SEM_INST_GET_SEM"));
+ if ($snap->numRows){
+ $clause = " AND c.seminar_id IN('" . join("','",$snap->getRows("Seminar_id")) ."')" . $clause;
+ } else {
+ return 0;
+ }
+ unset($snap);
+ }
+
+
+ if (isset($this->params['lecturer']) && mb_strlen($this->params['lecturer']) > 2){
+ $view->params[0] = "%" . $this->trim($this->params['lecturer']) . "%";
+ $view->params[1] = "%" . $this->trim($this->params['lecturer']) . "%";
+ $view->params[2] = "%" . $this->trim($this->params['lecturer']) . "%";
+ $view->params[3] = "%" . $this->trim($this->params['lecturer']) . "%";
+ $view->params[4] = "%" . $this->trim($this->params['lecturer']) . "%";
+ $result = $view->get_query("view:SEM_SEARCH_LECTURER");
+
+ $lecturers = [];
+ while ($result->next_record()) {
+ $lecturers[] = $result->f('user_id');
+ }
+
+ if (count($lecturers)) {
+ $view->params[0] = $this->visible_only ? "c.visible=1" : "1";
+ $view->params[1] = $lecturers;
+ $view->params[2] = $clause;
+ $snap = new DbSnapshot($view->get_query("view:SEM_SEARCH_LECTURER_ID"));
+ $this->search_result = $snap;
+ $this->found_rows = $this->search_result->numRows;
+ }
+ }
+
+
+ if ($combination == "AND" && $this->search_result->numRows){
+ $and_clause = " AND c.seminar_id IN('" . join("','",$this->search_result->getRows("seminar_id")) ."')";
+ }
+
+ if ((isset($this->params['title']) && mb_strlen($this->params['title']) > 2) ||
+ (isset($this->params['sub_title']) && mb_strlen($this->params['sub_title']) > 2) ||
+ (isset($this->params['number']) && mb_strlen($this->params['number']) > 2) ||
+ (isset($this->params['comment']) && mb_strlen($this->params['comment']) > 2)){
+
+ $toFilter = explode(" ", $this->params['title']);
+ $search_for = "(Name LIKE '%" . implode("%' AND Name LIKE '%", $toFilter) . "%')";
+ if (!array_key_exists(0, $view->params)) {
+ $view->params[0] = '';
+ }
+ $view->params[0] .= ($this->params['title']) ? $search_for . " " : " ";
+ $view->params[0] .= ($this->params['title'] && !empty($this->params['sub_title'])) ? $combination : " ";
+ $view->params[0] .= (!empty($this->params['sub_title'])) ? " Untertitel LIKE '%" . $this->trim($this->params['sub_title']) . "%' " : " ";
+ $view->params[0] .= (($this->params['title'] || !empty($this->params['sub_title'])) && !empty($this->params['comment'])) ? $combination : " ";
+ $view->params[0] .= (!empty($this->params['comment'])) ? " Beschreibung LIKE '%" . $this->trim($this->params['comment']) . "%' " : " ";
+ $view->params[0] .= (($this->params['title'] || !empty($this->params['sub_title']) || empty($this->params['comment'])) && $this->params['number']) ? $combination : " ";
+ $view->params[0] .= ($this->params['number']) ? " VeranstaltungsNummer LIKE '%" . $this->trim($this->params['number']) . "%' " : " ";
+ $view->params[0] = ($this->visible_only ? " c.visible=1 AND " : "") . "(" . $view->params[0] .")";
+ $view->params[1] = $and_clause . $clause;
+ $snap = new DbSnapshot($view->get_query("view:SEM_SEARCH_SEM"));
+ if ($this->found_rows === false){
+ $this->search_result = $snap;
+ } else {
+ $this->search_result->mergeSnapshot($snap,"seminar_id",$combination);
+ }
+ $this->found_rows = $this->search_result->numRows;
+ }
+
+ if ($combination == "AND" && $this->search_result->numRows){
+ $and_clause = " AND c.seminar_id IN('" . join("','",$this->search_result->getRows("seminar_id")) ."')";
+ }
+
+ if (isset($this->params['scope']) && mb_strlen($this->params['scope']) > 2){
+ $view->params[0] = $this->visible_only ? "c.visible=1" : "1";
+ $view->params[1] = "%" . $this->trim($this->params['scope']) . "%";
+ $view->params[2] = $and_clause . $clause;
+ $snap = new DbSnapshot($view->get_query("view:SEM_TREE_SEARCH_SEM"));
+ if ($this->found_rows === false){
+ $this->search_result = $snap;
+ } else {
+ $this->search_result->mergeSnapshot($snap,"seminar_id",$combination);
+ }
+ $this->found_rows = $this->search_result->numRows;
+ }
+ return $this->found_rows;
+ }
+
+ public function getSearchResultAsSnapshot(){
+ return $this->search_result;
+ }
+
+ public function getSearchResultAsArray(){
+ if($this->search_result instanceof DBSnapshot && $this->search_result->numRows){
+ return array_unique($this->search_result->getRows('seminar_id'));
+ } else {
+ return [];
+ }
+ }
+
+ private function trim($what)
+ {
+ $what = trim($what);
+ $what = preg_replace("/^\x{00A0}+|\x{00A0}+$/Su", '', $what);
+ return $what;
+ }
+}