diff --git a/admin/searchareas.php b/admin/searchareas.php
index bf178b55b41..911a86bf94b 100644
--- a/admin/searchareas.php
+++ b/admin/searchareas.php
@@ -28,113 +28,139 @@ admin_externalpage_setup('searchareas');
$areaid = optional_param('areaid', null, PARAM_ALPHAEXT);
$action = optional_param('action', null, PARAM_ALPHA);
+$indexingenabled = \core_search\manager::is_indexing_enabled(); // This restricts many of the actions on this page.
+// Get a search manager instance, which we'll need for display and to handle some actions.
try {
$searchmanager = \core_search\manager::instance();
} catch (core_search\engine_exception $searchmanagererror) {
- // Continue, we return an error later depending on the requested action.
+ // In action cases, we'll throw this exception below. In non-action cases, we produce a lang string error.
}
+// Handle all the actions.
if ($action) {
-
+ // If dealing with an areaid, we need to check that the area exists.
if ($areaid) {
- // We need to check that the area exists.
$area = \core_search\manager::get_search_area($areaid);
if ($area === false) {
throw new moodle_exception('invalidrequest');
}
}
- if ($action !== 'enable' && $action !== 'disable') {
- // All actions but enable/disable need the search engine to be ready.
- if (!empty($searchmanagererror)) {
- throw $searchmanagererror;
- }
+ // All the indexing actions.
+ if (in_array($action, ['delete', 'indexall', 'reindexall', 'deleteall'])) {
- // Show confirm prompt for all these actions as they may be inadvisable, or may cause
- // an interruption in search functionality, on production systems.
- if (!optional_param('confirm', 0, PARAM_INT)) {
- // Display confirmation prompt.
- $a = null;
- if ($areaid) {
- $a = html_writer::tag('strong', $area->get_visible_name());
+ // All of these actions require that indexing is enabled.
+ if ($indexingenabled) {
+
+ // For all of these actions, we strictly need a manager instance.
+ if (isset($searchmanagererror)) {
+ throw $searchmanagererror;
}
- $actionparams = ['sesskey' => sesskey(), 'action' => $action, 'confirm' => 1];
- if ($areaid) {
- $actionparams['areaid'] = $areaid;
- }
- $actionurl = new moodle_url('/admin/searchareas.php', $actionparams);
- $cancelurl = new moodle_url('/admin/searchareas.php');
- echo $OUTPUT->header();
- echo $OUTPUT->confirm(get_string('confirm_' . $action, 'search', $a),
+ // Show confirm prompt for all these actions as they may be inadvisable, or may cause
+ // an interruption in search functionality, on production systems.
+ if (!optional_param('confirm', 0, PARAM_INT)) {
+ // Display confirmation prompt.
+ $a = null;
+ if ($areaid) {
+ $a = html_writer::tag('strong', $area->get_visible_name());
+ }
+
+ $actionparams = ['sesskey' => sesskey(), 'action' => $action, 'confirm' => 1];
+ if ($areaid) {
+ $actionparams['areaid'] = $areaid;
+ }
+ $actionurl = new moodle_url('/admin/searchareas.php', $actionparams);
+ $cancelurl = new moodle_url('/admin/searchareas.php');
+ echo $OUTPUT->header();
+ echo $OUTPUT->confirm(get_string('confirm_' . $action, 'search', $a),
new single_button($actionurl, get_string('continue'), 'post', true),
new single_button($cancelurl, get_string('cancel'), 'get'));
- echo $OUTPUT->footer();
- exit;
+ echo $OUTPUT->footer();
+ exit;
+ } else {
+ // Confirmed, so run the required action.
+ require_sesskey();
+
+ switch ($action) {
+ case 'delete':
+ $searchmanager->delete_index($areaid);
+ \core\notification::success(get_string('searchindexdeleted', 'admin'));
+ break;
+ case 'indexall':
+ $searchmanager->index();
+ \core\notification::success(get_string('searchindexupdated', 'admin'));
+ break;
+ case 'reindexall':
+ $searchmanager->index(true);
+ \core\notification::success(get_string('searchreindexed', 'admin'));
+ break;
+ case 'deleteall':
+ $searchmanager->delete_index();
+ \core\notification::success(get_string('searchalldeleted', 'admin'));
+ break;
+ default:
+ break;
+ }
+
+ // Redirect back to the main page after taking action.
+ redirect(new moodle_url('/admin/searchareas.php'));
+ }
}
+ } else if (in_array($action, ['enable', 'disable'])) {
+ // Toggling search areas requires no confirmation.
+ require_sesskey();
+
+ switch ($action) {
+ case 'enable':
+ $area->set_enabled(true);
+ \core\notification::success(get_string('searchareaenabled', 'admin'));
+ break;
+ case 'disable':
+ $area->set_enabled(false);
+ core\notification::success(get_string('searchareadisabled', 'admin'));
+ break;
+ default:
+ break;
+ }
+
+ redirect(new moodle_url('/admin/searchareas.php'));
+ } else {
+ // Invalid action.
+ throw new moodle_exception('invalidaction');
}
+}
- // We are now taking an actual action, so require sesskey.
- require_sesskey();
- switch ($action) {
- case 'enable':
- $area->set_enabled(true);
- \core\notification::add(get_string('searchareaenabled', 'admin'), \core\output\notification::NOTIFY_SUCCESS);
- break;
- case 'disable':
- $area->set_enabled(false);
- \core\notification::add(get_string('searchareadisabled', 'admin'), \core\output\notification::NOTIFY_SUCCESS);
- break;
- case 'delete':
- $search = \core_search\manager::instance();
- $search->delete_index($areaid);
- \core\notification::add(get_string('searchindexdeleted', 'admin'), \core\output\notification::NOTIFY_SUCCESS);
- break;
- case 'indexall':
- $searchmanager->index();
- \core\notification::add(get_string('searchindexupdated', 'admin'), \core\output\notification::NOTIFY_SUCCESS);
- break;
- case 'reindexall':
- $searchmanager->index(true);
- \core\notification::add(get_string('searchreindexed', 'admin'), \core\output\notification::NOTIFY_SUCCESS);
- break;
- case 'deleteall':
- $searchmanager->delete_index();
- \core\notification::add(get_string('searchalldeleted', 'admin'), \core\output\notification::NOTIFY_SUCCESS);
- break;
- default:
- throw new moodle_exception('invalidaction');
- break;
- }
-
- // Redirect back to the main page after taking action.
- redirect(new moodle_url('/admin/searchareas.php'));
+// Display.
+if (isset($searchmanager) && $indexingenabled) {
+ \core\notification::info(get_string('indexinginfo', 'admin'));
+} else if (isset($searchmanager)) {
+ $params = (object) [
+ 'url' => (new moodle_url("/admin/settings.php?section=manageglobalsearch#admin-searchindexwhendisabled"))->out(false)
+ ];
+ \core\notification::error(get_string('indexwhendisabledfullnotice', 'search', $params));
+} else {
+ // In non-action cases, init errors are translated and displayed to the user as error notifications.
+ $errorstr = get_string($searchmanagererror->errorcode, $searchmanagererror->module, $searchmanagererror->a);
+ \core\notification::error($errorstr);
}
echo $OUTPUT->header();
-$searchareas = \core_search\manager::get_search_areas_list();
-if (empty($searchmanagererror)) {
- $areasconfig = $searchmanager->get_areas_config($searchareas);
-} else {
- $areasconfig = false;
-}
-
-if (!empty($searchmanagererror)) {
- $errorstr = get_string($searchmanagererror->errorcode, $searchmanagererror->module, $searchmanagererror->a);
- echo $OUTPUT->notification($errorstr, \core\output\notification::NOTIFY_ERROR);
-} else {
- echo $OUTPUT->notification(get_string('indexinginfo', 'admin'), \core\output\notification::NOTIFY_INFO);
-}
-
$table = new html_table();
$table->id = 'core-search-areas';
+$table->head = [
+ get_string('searcharea', 'search'),
+ get_string('enable'),
+ get_string('newestdocindexed', 'admin'),
+ get_string('searchlastrun', 'admin'),
+ get_string('searchindexactions', 'admin')
+];
-$table->head = array(get_string('searcharea', 'search'), get_string('enable'), get_string('newestdocindexed', 'admin'),
- get_string('searchlastrun', 'admin'), get_string('searchindexactions', 'admin'));
-
+$searchareas = \core_search\manager::get_search_areas_list();
+$areasconfig = isset($searchmanager) ? $searchmanager->get_areas_config($searchareas) : false;
foreach ($searchareas as $area) {
$areaid = $area->get_area_id();
$columns = array(new html_table_cell($area->get_visible_name()));
@@ -144,7 +170,7 @@ foreach ($searchareas as $area) {
new pix_icon('t/hide', get_string('disable'), 'moodle', array('title' => '', 'class' => 'iconsmall')),
null, array('title' => get_string('disable')));
- if ($areasconfig) {
+ if ($areasconfig && $indexingenabled) {
$columns[] = $areasconfig[$areaid]->lastindexrun;
if ($areasconfig[$areaid]->indexingstart) {
@@ -173,7 +199,11 @@ foreach ($searchareas as $area) {
$columns[] = html_writer::alist($actions, ['class' => 'unstyled list-unstyled']);
} else {
- $blankrow = new html_table_cell(get_string('searchnotavailable', 'admin'));
+ if (!$areasconfig) {
+ $blankrow = new html_table_cell(get_string('searchnotavailable', 'admin'));
+ } else {
+ $blankrow = new html_table_cell(get_string('indexwhendisabledshortnotice', 'search'));
+ }
$blankrow->colspan = 3;
$columns[] = $blankrow;
}
@@ -192,10 +222,7 @@ foreach ($searchareas as $area) {
}
// Cross-search area tasks.
-$options = array();
-if (!empty($searchmanagererror)) {
- $options['disabled'] = true;
-}
+$options = (isset($searchmanager) && $indexingenabled) ? [] : ['disabled' => true];
echo $OUTPUT->box_start('search-areas-actions');
echo $OUTPUT->single_button(admin_searcharea_action_url('indexall'), get_string('searchupdateindex', 'admin'), 'get', $options);
echo $OUTPUT->single_button(admin_searcharea_action_url('reindexall'), get_string('searchreindexindex', 'admin'), 'get', $options);
@@ -204,7 +231,7 @@ echo $OUTPUT->box_end();
echo html_writer::table($table);
-if (empty($searchmanagererror)) {
+if (isset($searchmanager)) {
// Show information about queued index requests for specific contexts.
$searchrenderer = $PAGE->get_renderer('core_search');
echo $searchrenderer->render_index_requests_info($searchmanager->get_index_requests_info());
diff --git a/lang/en/search.php b/lang/en/search.php
index db7c5d6a91e..09917b689f6 100644
--- a/lang/en/search.php
+++ b/lang/en/search.php
@@ -75,6 +75,8 @@ $string['checkdir'] = 'Check dir';
$string['checkdiradvice'] = 'Ensure the data directory exists and is writable.';
$string['incourse'] = 'in course {$a}';
$string['index'] = 'Index';
+$string['indexwhendisabledfullnotice'] = 'Indexing is currently not permitted when search is disabled. To enable this, please see the searchindexwhendisabled setting.';
+$string['indexwhendisabledshortnotice'] = 'Indexing is not available.';
$string['invalidindexerror'] = 'Index directory either contains an invalid index, or nothing at all.';
$string['ittook'] = 'It took';
$string['matchingfile'] = 'Matched from file {$a}';