diff --git a/phpBB/adm/style/acp_search.html b/phpBB/adm/style/acp_search.html deleted file mode 100644 index af7bb86be5..0000000000 --- a/phpBB/adm/style/acp_search.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -

{L_ACP_SEARCH_SETTINGS}

- -

{L_ACP_SEARCH_SETTINGS_EXPLAIN}

- - - - - - - -

{L_ACP_SEARCH_INDEX}

- - -

{L_CONTINUE_EXPLAIN}

- -
-
- {L_ACP_SUBMIT_CHANGES} -

-   - -

- {S_FORM_TOKEN} -
-
- - -

{L_ACP_SEARCH_INDEX_EXPLAIN}

- - - - - -
- -
- - {backend.S_HIDDEN_FIELDS} - - {L_INDEX_STATS}{L_COLON} {backend.L_NAME} ({L_ACTIVE}) - - - - - - - - - - - - - - - - - - - - - - -
{backend.L_NAME} ({L_ACTIVE})
{L_STATISTIC}{L_VALUE}{L_STATISTIC}{L_VALUE}
{backend.data.STATISTIC_1}{L_COLON}{backend.data.VALUE_1}{backend.data.STATISTIC_2}{L_COLON}{backend.data.VALUE_2}
- - - -

- - - - - - - -

- {S_FORM_TOKEN} -
- -
- - - - - - - diff --git a/phpBB/adm/style/acp_search_index.html b/phpBB/adm/style/acp_search_index.html new file mode 100644 index 0000000000..61ffb68d1d --- /dev/null +++ b/phpBB/adm/style/acp_search_index.html @@ -0,0 +1,80 @@ +{% include 'overall_header.html' %} + + + + + +

{{ lang('ACP_SEARCH_INDEX') }}

+ +

{{ lang('ACP_SEARCH_INDEX_EXPLAIN') }}

+ +{% for backend in backends %} + + {% if backend.S_STATS is not empty %} + +
+ +
+ + {{ backend.S_HIDDEN_FIELDS }} + + {{ lang('INDEX_STATS') ~ lang('COLON') }} {{ backend.NAME }} {% if backend.S_ACTIVE %}({{ lang('ACTIVE') }}) {% endif %} + + + + + + + + + + + + + + {% for stat in backend.S_STATS | batch(2, '') %} + + {% for key, value in stat %} + {% if value is not empty %} + + + {% else %} + + + {% endif %} + {% endfor %} + + {% endfor %} + +
{{ backend.NAME }} {% if backend.S_ACTIVE %}({{ lang('ACTIVE') }}) {% endif %}
{{ lang('STATISTIC') }}{{ lang('VALUE') }}{{ lang('STATISTIC') }}{{ lang('VALUE') }}
{{ key ~ lang('COLON') }}{{ value }}
+ + {% endif %} + +

+ {% if backend.S_INDEXED %} + + + {% else %} + + + {% endif %} +

+ {{ S_FORM_TOKEN }} +
+ +
+{% endfor %} + +{% include 'overall_footer.html' %} diff --git a/phpBB/adm/style/acp_search_index_inprogress.html b/phpBB/adm/style/acp_search_index_inprogress.html new file mode 100644 index 0000000000..3d9111192a --- /dev/null +++ b/phpBB/adm/style/acp_search_index_inprogress.html @@ -0,0 +1,34 @@ +{% include 'overall_header.html' %} + + + + + +

{{ lang('CONTINUE') }}

+ +

{{ lang('CONTINUE_EXPLAIN') }}

+ +
+
+ {{ lang('ACP_SUBMIT_CHANGES') }} +

+   + +

+ {{ S_FORM_TOKEN }} +
+
+ +{% include 'overall_footer.html' %} diff --git a/phpBB/adm/style/acp_search_settings.html b/phpBB/adm/style/acp_search_settings.html new file mode 100644 index 0000000000..fe899ec207 --- /dev/null +++ b/phpBB/adm/style/acp_search_settings.html @@ -0,0 +1,78 @@ +{% include 'overall_header.html' %} + + + +

{{ lang('ACP_SEARCH_SETTINGS') }}

+ +

{{ lang('ACP_SEARCH_SETTINGS_EXPLAIN') }}

+ + + +{% include 'overall_footer.html' %} diff --git a/phpBB/includes/acp/acp_search.php b/phpBB/includes/acp/acp_search.php index a5a89d62e8..e2cbea4956 100644 --- a/phpBB/includes/acp/acp_search.php +++ b/phpBB/includes/acp/acp_search.php @@ -14,6 +14,16 @@ /** * @ignore */ + +use phpbb\config\config; +use phpbb\di\service_collection; +use phpbb\language\language; +use phpbb\log\log; +use phpbb\request\request; +use phpbb\search\search_backend_factory; +use phpbb\template\template; +use phpbb\user; + if (!defined('IN_PHPBB')) { exit; @@ -21,22 +31,69 @@ if (!defined('IN_PHPBB')) class acp_search { - var $u_action; - var $state; - var $search; + public $u_action; + public $tpl_name; + public $page_title; protected const STATE_SEARCH_TYPE = 0; protected const STATE_ACTION = 1; protected const STATE_POST_COUNTER = 2; - function main($id, $mode) + /** @var config */ + protected $config; + + /** @var language */ + protected $language; + + /** @var log */ + protected $log; + + /** @var request */ + protected $request; + + /** @var service_collection */ + protected $search_backend_collection; + + /** @var search_backend_factory */ + protected $search_backend_factory; + + /** @var template */ + protected $template; + + /** @var user */ + protected $user; + + /** @var string */ + protected $phpbb_admin_path; + + /** @var string */ + protected $php_ex; + + public function __construct($p_master) { - global $user; + global $config, $phpbb_container, $language, $phpbb_log, $request, $template, $user, $phpbb_admin_path, $phpEx; - $user->add_lang('acp/search'); + $this->config = $config; + $this->language = $language; + $this->log = $phpbb_log; + $this->request = $request; + $this->search_backend_collection = $phpbb_container->get('search.backend_collection'); + $this->search_backend_factory = $phpbb_container->get('search.backend_factory'); + $this->template = $template; + $this->user = $user; + $this->phpbb_admin_path = $phpbb_admin_path; + $this->php_ex = $phpEx; + } - // For some this may be of help... - @ini_set('memory_limit', '128M'); + /** + * @param string $id + * @param string $mode + * @throws Exception + * @return void + */ + public function main(string $id, string $mode): void + { + $this->language->add_lang('acp/search'); switch ($mode) { @@ -50,21 +107,21 @@ class acp_search } } - function settings($id, $mode) + /** + * Settings page + * + * @param string $id + * @param string $mode + */ + public function settings(string $id, string $mode): void { - global $user, $template, $phpbb_log, $request; - global $config, $phpbb_admin_path, $phpEx; - global $phpbb_container; + $submit = $this->request->is_set_post('submit'); - $submit = $request->is_set_post('submit'); - - if ($submit && !check_link_hash($request->variable('hash', ''), 'acp_search')) + if ($submit && !check_link_hash($this->request->variable('hash', ''), 'acp_search')) { - trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); + trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->u_action), E_USER_WARNING); } - $search_types = $phpbb_container->get('search.backend_collection'); - $settings = [ 'search_interval' => 'float', 'search_anonymous_interval' => 'float', @@ -76,18 +133,17 @@ class acp_search 'search_store_results' => 'integer', ]; - $search = null; $search_options = ''; - foreach ($search_types as $search) + foreach ($this->search_backend_collection as $search) { // Only show available search backends if ($search->is_available()) { $name = $search->get_name(); - $type = get_class($search); + $type = $search->get_type(); - $selected = ($config['search_type'] == $type) ? ' selected="selected"' : ''; + $selected = ($this->config['search_type'] === $type) ? ' selected="selected"' : ''; $identifier = substr($type, strrpos($type, '\\') + 1); $search_options .= ""; @@ -95,11 +151,11 @@ class acp_search if (!$submit) { - $template->assign_block_vars('backend', array( + $this->template->assign_block_vars('backend', [ 'NAME' => $name, 'SETTINGS' => $vars['tpl'], 'IDENTIFIER' => $identifier, - )); + ]); } else if (is_array($vars['config'])) { @@ -107,10 +163,9 @@ class acp_search } } } - unset($search); - $cfg_array = (isset($_REQUEST['config'])) ? $request->variable('config', array('' => ''), true) : array(); - $updated = $request->variable('updated', false); + $cfg_array = (isset($_REQUEST['config'])) ? $this->request->variable('config', ['' => ''], true) : []; + $updated = $this->request->variable('updated', false); foreach ($settings as $config_name => $var_type) { @@ -136,9 +191,9 @@ class acp_search } // only change config if anything was actually changed - if ($submit && ($config[$config_name] != $config_value)) + if ($submit && ($this->config[$config_name] !== $config_value)) { - $config->set($config_name, $config_value); + $this->config->set($config_name, $config_value); $updated = true; } } @@ -148,25 +203,24 @@ class acp_search $extra_message = ''; if ($updated) { - $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_SEARCH'); + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_CONFIG_SEARCH'); } - if (isset($cfg_array['search_type']) && ($cfg_array['search_type'] != $config['search_type'])) + if (isset($cfg_array['search_type']) && ($cfg_array['search_type'] !== $this->config['search_type'])) { - $search_backend_factory = $phpbb_container->get('search.backend_factory'); - $search = $search_backend_factory->get($cfg_array['search_type']); + $search = $this->search_backend_factory->get($cfg_array['search_type']); if (confirm_box(true)) { // Initialize search backend, if $error is false means that everything is ok if (!($error = $search->init())) { - $config->set('search_type', $cfg_array['search_type']); + $this->config->set('search_type', $cfg_array['search_type']); if (!$updated) { - $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_SEARCH'); + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_CONFIG_SEARCH'); } - $extra_message = '
' . $user->lang['SWITCHED_SEARCH_BACKEND'] . '
» ' . $user->lang['GO_TO_SEARCH_INDEX'] . ''; + $extra_message = '
' . $this->language->lang('SWITCHED_SEARCH_BACKEND') . '
php_ex, 'i=search&mode=index') . '">» ' . $this->language->lang('GO_TO_SEARCH_INDEX') . ''; } else { @@ -175,270 +229,243 @@ class acp_search } else { - confirm_box(false, $user->lang['CONFIRM_SEARCH_BACKEND'], build_hidden_fields(array( + confirm_box(false, $this->language->lang('CONFIRM_SEARCH_BACKEND'), build_hidden_fields([ 'i' => $id, 'mode' => $mode, 'submit' => true, 'updated' => $updated, - 'config' => array('search_type' => $cfg_array['search_type']), - ))); + 'config' => ['search_type' => $cfg_array['search_type']], + ])); } } - if ($updated) - { - if (method_exists($search, 'config_updated')) - { - if ($search->config_updated()) - { - trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING); - } - } - } - - trigger_error($user->lang['CONFIG_UPDATED'] . $extra_message . adm_back_link($this->u_action)); + trigger_error($this->language->lang('CONFIG_UPDATED') . $extra_message . adm_back_link($this->u_action)); } unset($cfg_array); - $this->tpl_name = 'acp_search'; + $this->tpl_name = 'acp_search_settings'; $this->page_title = 'ACP_SEARCH_SETTINGS'; - $template->assign_vars([ - 'DEFAULT_SEARCH_RETURN_CHARS' => (int) $config['default_search_return_chars'], - 'LIMIT_SEARCH_LOAD' => (float) $config['limit_search_load'], - 'MIN_SEARCH_AUTHOR_CHARS' => (int) $config['min_search_author_chars'], - 'SEARCH_INTERVAL' => (float) $config['search_interval'], - 'SEARCH_GUEST_INTERVAL' => (float) $config['search_anonymous_interval'], - 'SEARCH_STORE_RESULTS' => (int) $config['search_store_results'], - 'MAX_NUM_SEARCH_KEYWORDS' => (int) $config['max_num_search_keywords'], + $this->template->assign_vars([ + 'DEFAULT_SEARCH_RETURN_CHARS' => (int) $this->config['default_search_return_chars'], + 'LIMIT_SEARCH_LOAD' => (float) $this->config['limit_search_load'], + 'MIN_SEARCH_AUTHOR_CHARS' => (int) $this->config['min_search_author_chars'], + 'SEARCH_INTERVAL' => (float) $this->config['search_interval'], + 'SEARCH_GUEST_INTERVAL' => (float) $this->config['search_anonymous_interval'], + 'SEARCH_STORE_RESULTS' => (int) $this->config['search_store_results'], + 'MAX_NUM_SEARCH_KEYWORDS' => (int) $this->config['max_num_search_keywords'], 'S_SEARCH_TYPES' => $search_options, - 'S_YES_SEARCH' => (bool) $config['load_search'], - 'S_SETTINGS' => true, + 'S_YES_SEARCH' => (bool) $this->config['load_search'], 'U_ACTION' => $this->u_action . '&hash=' . generate_link_hash('acp_search'), ]); } - function index($id, $mode) + /** + * Execute action depending on the action and state + * + * @param string $id + * @param string $mode + * @throws Exception + */ + public function index(string $id, string $mode): void { - global $user, $template, $phpbb_log, $request; - global $config, $phpbb_admin_path, $phpEx, $phpbb_container; + $action = $this->request->variable('action', ''); + $state = !empty($this->config['search_indexing_state']) ? explode(',', $this->config['search_indexing_state']) : []; - $action = $request->variable('action', ''); - $this->state = explode(',', $config['search_indexing_state']); - - if ($request->is_set_post('cancel')) - { - $action = ''; - $this->state = array(); - $this->save_state(); - } - $submit = $request->is_set_post('submit'); - - if (!check_link_hash($request->variable('hash', ''), 'acp_search') && in_array($action, array('create', 'delete'))) - { - trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); - } - - if ($action) + if ($action && !$this->request->is_set_post('cancel')) { switch ($action) { case 'progress_bar': - $type = $request->variable('type', ''); - $this->display_progress_bar($type); - break; - - case 'delete': - $this->state[self::STATE_ACTION] = 'delete'; + $this->display_progress_bar(); break; case 'create': - $this->state[self::STATE_ACTION] = 'create'; + case 'delete': + $this->index_action($id, $mode, $action, $state); break; default: trigger_error('NO_ACTION', E_USER_ERROR); } - - if (empty($this->state[self::STATE_SEARCH_TYPE])) - { - $this->state[self::STATE_SEARCH_TYPE] = $request->variable('search_type', ''); - } - - $search_backend_factory = $phpbb_container->get('search.backend_factory'); - $this->search = $search_backend_factory->get($this->state[self::STATE_SEARCH_TYPE]); - - $name = $this->search->get_name(); - - $action = &$this->state[1]; - - $this->save_state(); - - switch ($action) - { - case 'delete': - try - { - $this->state[self::STATE_POST_COUNTER] = $this->state[self::STATE_POST_COUNTER] ?? 0; - if ($status = $this->search->delete_index($this->state[self::STATE_POST_COUNTER])) // Status is not null, so deleting is in progress.... - { - // save the current state - $this->save_state(); - - $u_action = append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=delete&hash=" . generate_link_hash('acp_search'), false); - meta_refresh(1, $u_action); - trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $status['row_count'], $status['post_counter']) . $user->lang('SEARCH_INDEX_DELETE_REDIRECT_RATE', $status['rows_per_second'])); - } - } - catch (Exception $e) - { - $this->state = []; - $this->save_state(); - trigger_error($e->getMessage() . adm_back_link($this->u_action) . $this->close_popup_js(), E_USER_WARNING); - } - - $this->search->tidy(); - - $this->state = []; - $this->save_state(); - - $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_SEARCH_INDEX_REMOVED', false, array($name)); - trigger_error($user->lang['SEARCH_INDEX_REMOVED'] . adm_back_link($this->u_action) . $this->close_popup_js()); - break; - - case 'create': - try - { - $this->state[self::STATE_POST_COUNTER] = $this->state[self::STATE_POST_COUNTER] ?? 0; - if ($status = $this->search->create_index($this->state[self::STATE_POST_COUNTER])) // Status is not null, so indexing is in progress.... - { - // save the current state - $this->save_state(); - - $u_action = append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=create&hash=" . generate_link_hash('acp_search'), false); - meta_refresh(1, $u_action); - trigger_error($user->lang('SEARCH_INDEX_CREATE_REDIRECT', (int) $status['row_count'], $status['post_counter']) . $user->lang('SEARCH_INDEX_CREATE_REDIRECT_RATE', $status['rows_per_second'])); - } - } - catch (Exception $e) - { - // Error executing create_index - $this->state = []; - $this->save_state(); - trigger_error($e->getMessage() . adm_back_link($this->u_action) . $this->close_popup_js(), E_USER_WARNING); - } - - // Indexing have finished - - $this->search->tidy(); - - $this->state = []; - $this->save_state(); - - $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_SEARCH_INDEX_CREATED', false, array($name)); - trigger_error($user->lang['SEARCH_INDEX_CREATED'] . adm_back_link($this->u_action) . $this->close_popup_js()); - break; - } } - - $search_types = $phpbb_container->get('search.backend_collection'); - - $search = null; - - foreach ($search_types as $search) + else { - $type = get_class($search); - - $name = $search->get_name(); - - $data = array(); - if (method_exists($search, 'index_stats')) + // If clicked to cancel the indexing progress (acp_search_index_inprogress form) + if ($this->request->is_set_post('cancel')) { - $data = $search->index_stats(); + $state = []; + $this->save_state($state); } - $statistics = array(); - foreach ($data as $statistic => $value) + if (!empty($state)) { - $n = count($statistics); - if ($n && count($statistics[$n - 1]) < 3) - { - $statistics[$n - 1] += array('statistic_2' => $statistic, 'value_2' => $value); - } - else - { - $statistics[] = array('statistic_1' => $statistic, 'value_1' => $value); - } + $this->index_inprogress($id, $mode, $state[self::STATE_ACTION]); } - - $template->assign_block_vars('backend', array( - 'L_NAME' => $name, - 'NAME' => $type, - - 'S_ACTIVE' => ($type == $config['search_type']) ? true : false, - 'S_HIDDEN_FIELDS' => build_hidden_fields(array('search_type' => $type)), - 'S_INDEXED' => (bool) $search->index_created(), - 'S_STATS' => (bool) count($statistics)) - ); - - foreach ($statistics as $statistic) + else { - $template->assign_block_vars('backend.data', array( - 'STATISTIC_1' => $statistic['statistic_1'], - 'VALUE_1' => $statistic['value_1'], - 'STATISTIC_2' => (isset($statistic['statistic_2'])) ? $statistic['statistic_2'] : '', - 'VALUE_2' => (isset($statistic['value_2'])) ? $statistic['value_2'] : '') - ); + $this->index_overview($id, $mode); } } - unset($search); - unset($statistics); - unset($data); - - $this->tpl_name = 'acp_search'; - $this->page_title = 'ACP_SEARCH_INDEX'; - - $template->assign_vars(array( - 'S_INDEX' => true, - 'U_ACTION' => $this->u_action . '&hash=' . generate_link_hash('acp_search'), - 'U_PROGRESS_BAR' => append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=progress_bar"), - 'UA_PROGRESS_BAR' => addslashes(append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=progress_bar")), - )); - - if (isset($this->state[self::STATE_ACTION])) - { - $template->assign_vars(array( - 'S_CONTINUE_INDEXING' => $this->state[1], - 'U_CONTINUE_INDEXING' => $this->u_action . '&action=' . $this->state[self::STATE_ACTION] . '&hash=' . generate_link_hash('acp_search'), - 'L_CONTINUE' => ($this->state[self::STATE_ACTION] == 'create') ? $user->lang['CONTINUE_INDEXING'] : $user->lang['CONTINUE_DELETING_INDEX'], - 'L_CONTINUE_EXPLAIN' => ($this->state[self::STATE_ACTION] == 'create') ? $user->lang['CONTINUE_INDEXING_EXPLAIN'] : $user->lang['CONTINUE_DELETING_INDEX_EXPLAIN']) - ); - } } - function display_progress_bar($type) + /** + * @param string $id + * @param string $mode + * + * @throws Exception + */ + private function index_overview(string $id, string $mode): void { - global $template, $user; + $this->tpl_name = 'acp_search_index'; + $this->page_title = 'ACP_SEARCH_INDEX'; - $l_type = ($type == 'create') ? 'INDEXING_IN_PROGRESS' : 'DELETING_INDEX_IN_PROGRESS'; + foreach ($this->search_backend_collection as $search) + { + $this->template->assign_block_vars('backends', [ + 'NAME' => $search->get_name(), + 'TYPE' => $search->get_type(), - adm_page_header($user->lang[$l_type]); + 'S_ACTIVE' => $search->get_type() === $this->config['search_type'], + 'S_HIDDEN_FIELDS' => build_hidden_fields(['search_type' => $search->get_type()]), + 'S_INDEXED' => $search->index_created(), + 'S_STATS' => $search->index_stats(), + ]); + } - $template->set_filenames(array( - 'body' => 'progress_bar.html') - ); + $this->template->assign_vars([ + 'U_ACTION' => $this->u_action . '&hash=' . generate_link_hash('acp_search'), + 'UA_PROGRESS_BAR' => addslashes($this->u_action . '&action=progress_bar'), + ]); + } - $template->assign_vars(array( - 'L_PROGRESS' => $user->lang[$l_type], - 'L_PROGRESS_EXPLAIN' => $user->lang[$l_type . '_EXPLAIN']) - ); + /** + * Form to continue or cancel indexing process + * + * @param string $id + * @param string $mode + * @param string $action Action in progress: 'create' or 'delete' + */ + private function index_inprogress(string $id, string $mode, string $action): void + { + $this->tpl_name = 'acp_search_index_inprogress'; + $this->page_title = 'ACP_SEARCH_INDEX'; + + $this->template->assign_vars([ + 'U_ACTION' => $this->u_action . '&action=' . $action . '&hash=' . generate_link_hash('acp_search'), + 'UA_PROGRESS_BAR' => addslashes($this->u_action . '&action=progress_bar'), + 'L_CONTINUE' => ($action === 'create') ? $this->language->lang('CONTINUE_INDEXING') : $this->language->lang('CONTINUE_DELETING_INDEX'), + 'L_CONTINUE_EXPLAIN' => ($action === 'create') ? $this->language->lang('CONTINUE_INDEXING_EXPLAIN') : $this->language->lang('CONTINUE_DELETING_INDEX_EXPLAIN'), + 'S_ACTION' => $action, + ]); + } + + /** + * Progress that do the indexing/index removal, updating the page continuously until is finished + * + * @param string $id + * @param string $mode + * @param string $action + * @param array $state + */ + private function index_action(string $id, string $mode, string $action, array $state): void + { + // For some this may be of help... + @ini_set('memory_limit', '128M'); + + if (!check_link_hash($this->request->variable('hash', ''), 'acp_search')) + { + trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->u_action), E_USER_WARNING); + } + + // Entering here for the first time + if (empty($state)) + { + if ($this->request->is_set_post('search_type', '')) + { + $state = [ + self::STATE_SEARCH_TYPE => $this->request->variable('search_type', ''), + self::STATE_ACTION => $action, + self::STATE_POST_COUNTER => 0 + ]; + } + else + { + trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->u_action), E_USER_WARNING); + } + + $this->save_state($state); // Create new state in the database + } + + $type = $state[self::STATE_SEARCH_TYPE]; + $action = $state[self::STATE_ACTION]; + $post_counter = &$state[self::STATE_POST_COUNTER]; + + // Execute create/delete + $search = $this->search_backend_factory->get($type); + + try + { + $status = ($action == 'create') ? $search->create_index($post_counter) : $search->delete_index($post_counter); + if ($status) // Status is not null, so action is in progress.... + { + $this->save_state($state); // update $post_counter in $state in the database + + $u_action = append_sid($this->phpbb_admin_path . "index." . $this->php_ex, "i=$id&mode=$mode&action=$action&hash=" . generate_link_hash('acp_search'), false); + meta_refresh(1, $u_action); + + $message_redirect = $this->language->lang(($action == 'create') ? 'SEARCH_INDEX_CREATE_REDIRECT' : 'SEARCH_INDEX_DELETE_REDIRECT', (int) $status['row_count'], $status['post_counter']); + $message_rate = $this->language->lang(($action == 'create') ? 'SEARCH_INDEX_CREATE_REDIRECT_RATE' : 'SEARCH_INDEX_DELETE_REDIRECT_RATE', $status['rows_per_second']); + trigger_error($message_redirect . $message_rate); + } + } + catch (Exception $e) + { + $this->save_state([]); // Unexpected error, cancel action + trigger_error($e->getMessage() . adm_back_link($this->u_action) . $this->close_popup_js(), E_USER_WARNING); + } + + $search->tidy(); + + $this->save_state([]); // finished operation, cancel action + + $log_operation = ($action == 'create') ? 'LOG_SEARCH_INDEX_CREATED' : 'LOG_SEARCH_INDEX_REMOVED'; + $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, $log_operation, false, [$search->get_name()]); + + $message = $this->language->lang(($action == 'create') ? 'SEARCH_INDEX_CREATED' : 'SEARCH_INDEX_REMOVED'); + trigger_error($message . adm_back_link($this->u_action) . $this->close_popup_js()); + } + + /** + * Popup window + */ + private function display_progress_bar(): void + { + $type = $this->request->variable('type', ''); + $l_type = ($type === 'create') ? 'INDEXING_IN_PROGRESS' : 'DELETING_INDEX_IN_PROGRESS'; + + adm_page_header($this->language->lang($l_type)); + + $this->template->set_filenames([ + 'body' => 'progress_bar.html' + ]); + + $this->template->assign_vars([ + 'L_PROGRESS' => $this->language->lang($l_type), + 'L_PROGRESS_EXPLAIN' => $this->language->lang($l_type . '_EXPLAIN'), + ]); adm_page_footer(); } - function close_popup_js() + /** + * Javascript code for closing the waiting screen (is attached to the trigger_errors) + * + * @return string + */ + private function close_popup_js(): string { return "\n"; } - function save_state($state = false) + /** + * @param array $state + */ + private function save_state(array $state = []): void { - global $config; + ksort($state); - if ($state) - { - $this->state = $state; - } - - ksort($this->state); - - $config->set('search_indexing_state', implode(',', $this->state), true); + $this->config->set('search_indexing_state', implode(',', $state), true); } } diff --git a/phpBB/phpbb/search/backend/base.php b/phpBB/phpbb/search/backend/base.php index 0245c72c2a..a6bcb08850 100644 --- a/phpBB/phpbb/search/backend/base.php +++ b/phpBB/phpbb/search/backend/base.php @@ -480,4 +480,12 @@ abstract class base implements search_backend_interface return $max_post_id; } + + /** + * {@inheritdoc} + */ + public function get_type(): string + { + return static::class; + } } diff --git a/phpBB/phpbb/search/backend/fulltext_sphinx.php b/phpBB/phpbb/search/backend/fulltext_sphinx.php index cc6c0b8afe..1d7ff5f310 100644 --- a/phpBB/phpbb/search/backend/fulltext_sphinx.php +++ b/phpBB/phpbb/search/backend/fulltext_sphinx.php @@ -1022,4 +1022,12 @@ class fulltext_sphinx implements search_backend_interface return true; } + + /** + * {@inheritdoc} + */ + public function get_type(): string + { + return static::class; + } } diff --git a/phpBB/phpbb/search/backend/search_backend_interface.php b/phpBB/phpbb/search/backend/search_backend_interface.php index 1fdc138028..82ea0d03ff 100644 --- a/phpBB/phpbb/search/backend/search_backend_interface.php +++ b/phpBB/phpbb/search/backend/search_backend_interface.php @@ -193,4 +193,11 @@ interface search_backend_interface * @return array array containing template and config variables */ public function get_acp_options(): array; + + /** + * Gets backend class + * + * @return string + */ + public function get_type(): string; } diff --git a/phpBB/phpbb/storage/provider/local.php b/phpBB/phpbb/storage/provider/local.php index 8e0de2b6fd..93d3c7a6d0 100644 --- a/phpBB/phpbb/storage/provider/local.php +++ b/phpBB/phpbb/storage/provider/local.php @@ -26,7 +26,7 @@ class local implements provider_interface /** * {@inheritdoc} */ - public function get_adapter_class() + public function get_adapter_class(): string { return \phpbb\storage\adapter\local::class; } diff --git a/phpBB/phpbb/storage/provider/provider_interface.php b/phpBB/phpbb/storage/provider/provider_interface.php index 428b6eb187..484b660aa8 100644 --- a/phpBB/phpbb/storage/provider/provider_interface.php +++ b/phpBB/phpbb/storage/provider/provider_interface.php @@ -25,9 +25,9 @@ interface provider_interface /** * Gets adapter class * - * @return \phpbb\storage\adapter\adapter_interface + * @return string */ - public function get_adapter_class(); + public function get_adapter_class(): string; /** * Gets adapter options