diff --git a/lang/en/admin.php b/lang/en/admin.php
index 588002efffe..589b2dc2620 100644
--- a/lang/en/admin.php
+++ b/lang/en/admin.php
@@ -1088,6 +1088,7 @@ $string['rememberuserlicensepref'] = 'Remember user licence preference';
$string['rememberuserlicensepref_help'] = 'If enabled, the last licence selected by the user is preselected when uploading a file in the file picker. Otherwise, the default site licence is preselected.';
$string['rememberusername'] = 'Remember username';
$string['rememberusername_desc'] = 'Enable if you want to store permanent cookies with usernames during user login. Permanent cookies may be considered a privacy issue if used without consent.';
+$string['replacefrontsearch'] = 'Used for front page course search';
$string['reportsmanage'] = 'Manage reports';
$string['requiredentrieschanged'] = 'Note: After upgrading, the setting \'Required entries before viewing\' is now enforced in the following database activities:
{$a->text}
';
$string['requiremodintro'] = 'Require activity description';
diff --git a/lib/adminlib.php b/lib/adminlib.php
index 9f13db277ca..09bed520984 100644
--- a/lib/adminlib.php
+++ b/lib/adminlib.php
@@ -11316,6 +11316,18 @@ class admin_setting_searchsetupinfo extends admin_setting {
$row[1] = $status;
$table->data[] = $row;
+ // Replace front page search.
+ $row = array();
+ $url = new moodle_url("/admin/search.php?query=searchincludeallcourses");
+ $row[0] = '6. ' . html_writer::tag('a', get_string('replacefrontsearch', 'admin'),
+ array('href' => $url));
+ $status = html_writer::tag('span', get_string('no'), array('class' => 'badge badge-danger'));
+ if (\core_search\manager::can_replace_course_search()) {
+ $status = html_writer::tag('span', get_string('yes'), array('class' => 'badge badge-success'));
+ }
+ $row[1] = $status;
+ $table->data[] = $row;
+
$return .= html_writer::table($table);
return highlight($query, $return);
diff --git a/search/classes/manager.php b/search/classes/manager.php
index fe6386326ea..b2354d4a77c 100644
--- a/search/classes/manager.php
+++ b/search/classes/manager.php
@@ -263,13 +263,45 @@ class manager {
return !empty($CFG->enableglobalsearch);
}
+ /**
+ * Tests if global search is configured to be equivalent to the front page course search.
+ *
+ * @return bool
+ */
+ public static function can_replace_course_search(): bool {
+ global $CFG;
+
+ // Assume we can replace front page search.
+ $canreplace = true;
+
+ // Global search must be enabled.
+ if (!static::is_global_search_enabled()) {
+ $canreplace = false;
+ }
+
+ // Users must be able to search the details of all courses that they can see,
+ // even if they do not have access to them.
+ if (empty($CFG->searchincludeallcourses)) {
+ $canreplace = false;
+ }
+
+ // Course search must be enabled.
+ if ($canreplace) {
+ $areaid = static::generate_areaid('core_course', 'course');
+ $enabledareas = static::get_search_areas_list(true);
+ $canreplace = isset($enabledareas[$areaid]);
+ }
+
+ return $canreplace;
+ }
+
/**
* Returns the search URL for course search
*
* @return moodle_url
*/
public static function get_course_search_url() {
- if (self::is_global_search_enabled()) {
+ if (self::can_replace_course_search()) {
$searchurl = '/search/index.php';
} else {
$searchurl = '/course/search.php';
diff --git a/search/tests/manager_test.php b/search/tests/manager_test.php
index 217dcb4ac23..50cdcb6d0d9 100644
--- a/search/tests/manager_test.php
+++ b/search/tests/manager_test.php
@@ -78,18 +78,102 @@ class search_manager_testcase extends advanced_testcase {
$this->assertFalse(\core_search\manager::is_global_search_enabled());
}
- public function test_course_search_url() {
-
+ /**
+ * Tests the course search url is correct.
+ *
+ * @param bool|null $gsenabled Enable global search (null to leave as the default).
+ * @param bool|null $allcourses Enable searching all courses (null to leave as the default).
+ * @param bool|null $enablearea Enable the course search area (null to leave as the default).
+ * @param string $expected The expected course search url.
+ * @dataProvider data_course_search_url
+ */
+ public function test_course_search_url(?bool $gsenabled, ?bool $allcourses, ?bool $enablearea, string $expected) {
$this->resetAfterTest();
- // URL is course/search.php by default.
- $this->assertEquals(new moodle_url("/course/search.php"), \core_search\manager::get_course_search_url());
+ if (!is_null($gsenabled)) {
+ set_config('enableglobalsearch', $gsenabled);
+ }
- set_config('enableglobalsearch', true);
- $this->assertEquals(new moodle_url("/search/index.php"), \core_search\manager::get_course_search_url());
+ if (!is_null($allcourses)) {
+ set_config('searchincludeallcourses', $allcourses);
+ }
- set_config('enableglobalsearch', false);
- $this->assertEquals(new moodle_url("/course/search.php"), \core_search\manager::get_course_search_url());
+ if (!is_null($enablearea)) {
+ // Setup the course search area.
+ $areaid = \core_search\manager::generate_areaid('core_course', 'course');
+ $area = \core_search\manager::get_search_area($areaid);
+ $area->set_enabled($enablearea);
+ }
+
+ $this->assertEquals(new moodle_url($expected), \core_search\manager::get_course_search_url());
+ }
+
+ /**
+ * Data for the test_course_search_url test.
+ *
+ * @return array[]
+ */
+ public function data_course_search_url(): array {
+ return [
+ 'defaults' => [null, null, null, '/course/search.php'],
+ 'enabled' => [true, true, true, '/search/index.php'],
+ 'no all courses, no search area' => [true, false, false, '/course/search.php'],
+ 'no search area' => [true, true, false, '/course/search.php'],
+ 'no all courses' => [true, false, true, '/course/search.php'],
+ 'disabled' => [false, false, false, '/course/search.php'],
+ 'no global search' => [false, true, false, '/course/search.php'],
+ 'no global search, no all courses' => [false, false, true, '/course/search.php'],
+ 'no global search, no search area' => [false, true, false, '/course/search.php'],
+ ];
+ }
+
+ /**
+ * Tests that we detect that global search can replace frontpage course search.
+ *
+ * @param bool|null $gsenabled Enable global search (null to leave as the default).
+ * @param bool|null $allcourses Enable searching all courses (null to leave as the default).
+ * @param bool|null $enablearea Enable the course search area (null to leave as the default).
+ * @param bool $expected The expected result.
+ * @dataProvider data_can_replace_course_search
+ */
+ public function test_can_replace_course_search(?bool $gsenabled, ?bool $allcourses, ?bool $enablearea, bool $expected) {
+ $this->resetAfterTest();
+
+ if (!is_null($gsenabled)) {
+ set_config('enableglobalsearch', $gsenabled);
+ }
+
+ if (!is_null($allcourses)) {
+ set_config('searchincludeallcourses', $allcourses);
+ }
+
+ if (!is_null($enablearea)) {
+ // Setup the course search area.
+ $areaid = \core_search\manager::generate_areaid('core_course', 'course');
+ $area = \core_search\manager::get_search_area($areaid);
+ $area->set_enabled($enablearea);
+ }
+
+ $this->assertEquals($expected, \core_search\manager::can_replace_course_search());
+ }
+
+ /**
+ * Data for the test_can_replace_course_search test.
+ *
+ * @return array[]
+ */
+ public function data_can_replace_course_search(): array {
+ return [
+ 'defaults' => [null, null, null, false],
+ 'enabled' => [true, true, true, true],
+ 'no all courses, no search area' => [true, false, false, false],
+ 'no search area' => [true, true, false, false],
+ 'no all courses' => [true, false, true, false],
+ 'disabled' => [false, false, false, false],
+ 'no global search' => [false, true, false, false],
+ 'no global search, no all courses' => [false, false, true, false],
+ 'no global search, no search area' => [false, true, false, false],
+ ];
}
public function test_search_areas() {