From 692e22f9edc18bb192c20cafa6e0a22fd9dea9f0 Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Tue, 19 Jun 2018 09:20:39 +0800 Subject: [PATCH] MDL-62735 core_search: searchareas page now respects indexing support --- admin/searchareas.php | 195 ++++++++++++++++++++++++------------------ lang/en/search.php | 2 + 2 files changed, 113 insertions(+), 84 deletions(-) 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}';