From 22474bc481ad73f925fe8af5e3cbba225dfecf77 Mon Sep 17 00:00:00 2001 From: Ron Lucke Date: Thu, 24 Aug 2023 14:43:31 +0200 Subject: fix #2813 --- app/controllers/courseware/local_search.php | 90 ++++++++++++++++++++++ .../globalsearch/GlobalSearchCourseware.php | 2 +- .../courseware/widgets/CoursewareSearchWidget.vue | 10 +-- 3 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 app/controllers/courseware/local_search.php diff --git a/app/controllers/courseware/local_search.php b/app/controllers/courseware/local_search.php new file mode 100644 index 0000000..6d6cfb4 --- /dev/null +++ b/app/controllers/courseware/local_search.php @@ -0,0 +1,90 @@ +rangeId; + $search = Request::get('search'); + $payload_search = str_replace('"', '', json_encode($search, true)); + + $query = DBManager::get()->quote("%{$search}%"); + $payload_query = DBManager::get()->quote("%{$payload_search}%"); + + $sql = "(SELECT `cw_structural_elements` . `id` AS id, CONCAT('', 'cw_structural_elements') AS type + FROM `cw_structural_elements` + WHERE (`title` LIKE {$query} OR `payload` LIKE {$payload_query}) + AND `range_id` = '{$range_id}' + ORDER BY `cw_structural_elements`.`mkdate` DESC) + UNION ( + SELECT se . `id` AS id, CONCAT('', 'cw_containers') AS type + FROM `cw_containers` c + JOIN cw_structural_elements se + ON se . `id` = c . `structural_element_id` + WHERE c. `payload` LIKE {$payload_query} + AND `container_type` != 'list' + AND se . `range_id` = '{$range_id}' + ORDER BY c . `mkdate` DESC) + UNION ( + SELECT se . `id` AS id, CONCAT('', 'cw_blocks') AS type + FROM `cw_blocks` b + JOIN cw_containers c + ON c.id = b.container_id + JOIN cw_structural_elements se + ON se . `id` = c . `structural_element_id` + WHERE b.payload LIKE {$payload_query} + AND se . `range_id` = '{$range_id}' + ORDER BY b . `mkdate` DESC + )"; + + $results = DBManager::get()->fetchAll($sql); + $data = []; + foreach ($results as $object) { + $structural_element = StructuralElement::find($object['id']); + $unit = $structural_element->findUnit(); + if ($unit && $unit->id === $filters->unitId && $structural_element->canRead($user)) { + $description = ''; + if ($object['type'] === 'cw_structural_elements') { + $description = GlobalSearchModule::mark($structural_element->payload['description'], $search, true); + } + if ($object['type'] === 'cw_containers') { + $description = _('Suchbegriff wurde in einem Abschnitt gefunden'); + } + if ($object['type'] === 'cw_blocks') { + $description = _('Suchbegriff wurde in einem Block gefunden'); + } + $pageData = GlobalSearchCourseware::getPageData($structural_element, $unit); + $date = new DateTime(); + $date->setTimestamp($structural_element->chdate); + + $name = $unit->structural_element->id === $structural_element->id + ? $structural_element->title + : $unit->structural_element->title . ': ' . $structural_element->title; + + array_push($data, [ + 'name' => GlobalSearchModule::mark($name, $search, true), + 'description' => $description, + 'url' => $pageData['url'], + 'img' => $structural_element->image ? $structural_element->getImageUrl() : Icon::create('courseware')->asImagePath(), + 'additional' => '' . $pageData['originName'] . '', + 'date' => $date->format('d.m.Y H:i'), + 'structural-element-id' => $structural_element->id, + 'expand' => null + ]); + } + } + $this->render_json($data); + } +} \ No newline at end of file diff --git a/lib/classes/globalsearch/GlobalSearchCourseware.php b/lib/classes/globalsearch/GlobalSearchCourseware.php index 27389c3..7226e92 100644 --- a/lib/classes/globalsearch/GlobalSearchCourseware.php +++ b/lib/classes/globalsearch/GlobalSearchCourseware.php @@ -152,7 +152,7 @@ class GlobalSearchCourseware extends GlobalSearchModule implements GlobalSearchF return []; } - private static function getPageData(StructuralElement $structural_element, Unit $unit): Array + public static function getPageData(StructuralElement $structural_element, Unit $unit): Array { $url = ''; $originUrl = ''; diff --git a/resources/vue/components/courseware/widgets/CoursewareSearchWidget.vue b/resources/vue/components/courseware/widgets/CoursewareSearchWidget.vue index fdc239d..b653434 100644 --- a/resources/vue/components/courseware/widgets/CoursewareSearchWidget.vue +++ b/resources/vue/components/courseware/widgets/CoursewareSearchWidget.vue @@ -53,7 +53,7 @@ export default { ...mapGetters({ courseware: 'courseware', context: 'context', - showSearchResults: 'showSearchResults' + showSearchResults: 'showSearchResults', }), }, methods: { @@ -71,17 +71,17 @@ export default { const limit = 100; let params = { search: this.searchTerm, - filters: { category: 'GlobalSearchCourseware', contextType: this.context.type, rangeId: this.context.id} + filters: { unitId: this.context.unit, contextType: this.context.type, rangeId: this.context.id } }; axios({ method: 'get', - url: STUDIP.URLHelper.getURL('dispatch.php/globalsearch/find/' + limit), + url: STUDIP.URLHelper.getURL('dispatch.php/courseware/local_search/'), params: params, }).then( result => { this.setShowSearchResults(true); - if (result.data.GlobalSearchCourseware) { - this.setSearchResults((result.data.GlobalSearchCourseware.content)); + if (result.data?.length > 0) { + this.setSearchResults(result.data); } else { this.setSearchResults([]); } -- cgit v1.0