MDL-60917 core_search: add top result section

This commit is contained in:
Nathan Nguyen
2021-10-12 14:49:36 +11:00
parent e746dc75af
commit 089ebc85b1
8 changed files with 545 additions and 0 deletions
+62
View File
@@ -1056,6 +1056,68 @@ class manager {
return $docs;
}
/**
* Search for top ranked result.
* @param \stdClass $formdata search query data
* @return array|document[]
*/
public function search_top(\stdClass $formdata): array {
global $USER;
// Return if the config value is set to 0.
$maxtopresult = get_config('core', 'searchmaxtopresults');
if (empty($maxtopresult)) {
return [];
}
// Only process if 'searchenablecategories' is set.
if (self::is_search_area_categories_enabled() && !empty($formdata->cat)) {
$cat = self::get_search_area_category_by_name($formdata->cat);
$formdata->areaids = array_keys($cat->get_areas());
} else {
return [];
}
$docs = $this->search($formdata);
// Look for course, teacher and course content.
$coursedocs = [];
$courseteacherdocs = [];
$coursecontentdocs = [];
$otherdocs = [];
foreach ($docs as $doc) {
if ($doc->get('areaid') === 'core_course-course' && stripos($doc->get('title'), $formdata->q) !== false) {
$coursedocs[] = $doc;
} else if (strpos($doc->get('areaid'), 'course_teacher') !== false
&& stripos($doc->get('content'), $formdata->q) !== false) {
$courseteacherdocs[] = $doc;
} else if (strpos($doc->get('areaid'), 'mod_') !== false) {
$coursecontentdocs[] = $doc;
} else {
$otherdocs[] = $doc;
}
}
// Swap current courses to top.
$enroledcourses = $this->get_my_courses(false);
// Move current courses of the user to top.
foreach ($enroledcourses as $course) {
$completion = new \completion_info($course);
if (!$completion->is_course_complete($USER->id)) {
foreach ($coursedocs as $index => $doc) {
$areaid = $doc->get('areaid');
if ($areaid == 'core_course-course' && $course->id == $doc->get('courseid')) {
unset($coursedocs[$index]);
array_unshift($coursedocs, $doc);
}
}
}
}
$maxtopresult = get_config('core', 'searchmaxtopresults');
$result = array_merge($coursedocs, $courseteacherdocs, $coursecontentdocs, $otherdocs);
return array_slice($result, 0, $maxtopresult);
}
/**
* Build a list of course ids to limit the search based on submitted form data.
*