diff options
Diffstat (limited to 'phpBB/install')
20 files changed, 394 insertions, 41 deletions
diff --git a/phpBB/install/controller/helper.php b/phpBB/install/controller/helper.php index 7a5e20406d..0df1ae71a4 100644 --- a/phpBB/install/controller/helper.php +++ b/phpBB/install/controller/helper.php @@ -157,13 +157,25 @@ class helper { // @todo Sort navs by order - foreach ($entry[0] as $sub_entry) + foreach ($entry[0] as $name => $sub_entry) { - $this->template->assign_block_vars('l_block1', array( - 'L_TITLE' => $this->language->lang($sub_entry['label']), - 'S_SELECTED' => (isset($sub_entry['route']) && $sub_entry['route'] === $this->request->get('_route')), - 'U_TITLE' => $this->route($sub_entry['route']), - )); + if (isset($sub_entry['stage']) && $sub_entry['stage'] === true) + { + $this->template->assign_block_vars('l_block2', array( + 'L_TITLE' => $this->language->lang($sub_entry['label']), + 'S_SELECTED' => (isset($sub_entry['selected']) && $sub_entry['selected'] === true), + 'S_COMPLETE' => (isset($sub_entry['completed']) && $sub_entry['completed'] === true), + 'STAGE_NAME' => $name, + )); + } + else + { + $this->template->assign_block_vars('l_block1', array( + 'L_TITLE' => $this->language->lang($sub_entry['label']), + 'S_SELECTED' => (isset($sub_entry['route']) && $sub_entry['route'] === $this->request->get('_route')), + 'U_TITLE' => $this->route($sub_entry['route']), + )); + } } } } diff --git a/phpBB/install/controller/install.php b/phpBB/install/controller/install.php index 4021c5625b..c1329b6456 100644 --- a/phpBB/install/controller/install.php +++ b/phpBB/install/controller/install.php @@ -13,7 +13,16 @@ namespace phpbb\install\controller; +use phpbb\install\helper\config; +use phpbb\install\helper\navigation\navigation_provider; use Symfony\Component\HttpFoundation\StreamedResponse; +use Symfony\Component\HttpFoundation\Response; +use phpbb\install\helper\iohandler\factory; +use phpbb\install\controller\helper; +use phpbb\template\template; +use phpbb\request\request_interface; +use phpbb\install\installer; +use phpbb\language\language; /** * Controller for installing phpBB @@ -21,51 +30,72 @@ use Symfony\Component\HttpFoundation\StreamedResponse; class install { /** - * @var \phpbb\install\controller\helper + * @var helper */ protected $controller_helper; /** - * @var \phpbb\install\helper\iohandler\factory + * @var config + */ + protected $installer_config; + + /** + * @var factory */ protected $iohandler_factory; /** - * @var \phpbb\template\template + * @var navigation_provider + */ + protected $menu_provider; + + /** + * @var language + */ + protected $language; + + /** + * @var template */ protected $template; /** - * @var \phpbb\request\request_interface + * @var request_interface */ protected $request; /** - * @var \phpbb\install\installer + * @var installer */ protected $installer; /** * Constructor * - * @param helper $helper - * @param \phpbb\install\helper\iohandler\factory $factory - * @param \phpbb\request\request_interface $request - * @param \phpbb\install\installer $installer + * @param helper $helper + * @param config $install_config + * @param factory $factory + * @param navigation_provider $nav_provider + * @param language $language + * @param request_interface $request + * @param installer $installer */ - public function __construct(helper $helper, \phpbb\install\helper\iohandler\factory $factory, \phpbb\template\template $template, \phpbb\request\request_interface $request, \phpbb\install\installer $installer) + public function __construct(helper $helper, config $install_config, factory $factory, navigation_provider $nav_provider, language $language, template $template, request_interface $request, installer $installer) { - $this->controller_helper = $helper; - $this->iohandler_factory = $factory; - $this->template = $template; - $this->request = $request; - $this->installer = $installer; + $this->controller_helper = $helper; + $this->installer_config = $install_config; + $this->iohandler_factory = $factory; + $this->menu_provider = $nav_provider; + $this->language = $language; + $this->template = $template; + $this->request = $request; + $this->installer = $installer; } /** * Controller logic * - * @return \Symfony\Component\HttpFoundation\Response|StreamedResponse + * @return Response|StreamedResponse */ public function handle() { @@ -86,13 +116,38 @@ class install } // Set the appropriate input-output handler - //$this->installer->set_iohandler($this->iohandler_factory->get()); + $this->installer->set_iohandler($this->iohandler_factory->get()); - if ($this->request->is_ajax()) + // Set up navigation + $nav_data = $this->installer_config->get_navigation_data(); + /** @var \phpbb\install\helper\iohandler\iohandler_interface $iohandler */ + $iohandler = $this->iohandler_factory->get(); + + // Set active navigation stage + if (isset($nav_data['active']) && is_array($nav_data['active'])) { - // @todo: remove this line, and use the above - $this->installer->set_iohandler($this->iohandler_factory->get()); + $iohandler->set_active_stage_menu($nav_data['active']); + $this->menu_provider->set_nav_property($nav_data['active'], array( + 'selected' => true, + 'completed' => false, + )); + } + + // Set finished navigation stages + if (isset($nav_data['finished']) && is_array($nav_data['finished'])) + { + foreach ($nav_data['finished'] as $finished_stage) + { + $iohandler->set_finished_stage_menu($finished_stage); + $this->menu_provider->set_nav_property($finished_stage, array( + 'selected' => false, + 'completed' => true, + )); + } + } + if ($this->request->is_ajax()) + { $installer = $this->installer; $response = new StreamedResponse(); $response->setCallback(function() use ($installer) { @@ -106,9 +161,20 @@ class install // Determine whether the installation was started or not if (true) { + // Set active stage + $this->menu_provider->set_nav_property( + array('install', 0, 'introduction'), + array( + 'selected' => true, + 'completed' => false, + ) + ); + // If not, let's render the welcome page $this->template->assign_vars(array( - 'SHOW_INSTALL_START_FORM' => true, + 'SHOW_INSTALL_START_FORM' => true, + 'TITLE' => $this->language->lang('INSTALL_INTRO'), + 'CONTENT' => $this->language->lang('INSTALL_INTRO_BODY'), )); return $this->controller_helper->render('installer_install.html', 'INSTALL'); } diff --git a/phpBB/install/controller/install_index.php b/phpBB/install/controller/installer_index.php index c61d68f7fb..3d5224f1be 100644 --- a/phpBB/install/controller/install_index.php +++ b/phpBB/install/controller/installer_index.php @@ -13,7 +13,7 @@ namespace phpbb\install\controller; -class install_index +class installer_index { /** * @var helper diff --git a/phpBB/install/exception/installer_config_not_writable_exception.php b/phpBB/install/exception/installer_config_not_writable_exception.php new file mode 100644 index 0000000000..3f3b03f178 --- /dev/null +++ b/phpBB/install/exception/installer_config_not_writable_exception.php @@ -0,0 +1,22 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\install\exception; + +/** + * Exception for the event when installer config is not writable to disk + */ +class installer_config_not_writable_exception extends installer_exception +{ + +} diff --git a/phpBB/install/exception/user_interaction_required_exception.php b/phpBB/install/exception/user_interaction_required_exception.php index 0aaae648cf..d65a448841 100644 --- a/phpBB/install/exception/user_interaction_required_exception.php +++ b/phpBB/install/exception/user_interaction_required_exception.php @@ -15,6 +15,9 @@ namespace phpbb\install\exception; /** * This exception should be thrown when user interaction is inevitable + * + * Note: Please note that the output should already be setup for the user + * when you use throw this exception */ class user_interaction_required_exception extends installer_exception { diff --git a/phpBB/install/helper/config.php b/phpBB/install/helper/config.php index 0c04b5e950..5c1348c06d 100644 --- a/phpBB/install/helper/config.php +++ b/phpBB/install/helper/config.php @@ -13,6 +13,8 @@ namespace phpbb\install\helper; +use phpbb\install\exception\installer_config_not_writable_exception; + /** * Stores common settings and installation status */ @@ -65,6 +67,13 @@ class config protected $system_data; /** + * Array containing navigation bar information + * + * @var array + */ + protected $navigation_data; + + /** * Constructor */ public function __construct(\phpbb\filesystem\filesystem_interface $filesystem, \phpbb\php\ini $php_ini, $phpbb_root_path) @@ -74,6 +83,7 @@ class config $this->phpbb_root_path = $phpbb_root_path; // Set up data arrays + $this->navigation_data = array(); $this->installer_config = array(); $this->system_data = array(); $this->progress_data = array( @@ -206,6 +216,7 @@ class config $this->installer_config = $unserialized_data['installer_config']; $this->progress_data = $unserialized_data['progress_data']; + $this->navigation_data = $unserialized_data['navigation_data']; } /** @@ -217,6 +228,7 @@ class config $save_array = array( 'installer_config' => $this->installer_config, 'progress_data' => $this->progress_data, + 'navigation_data' => $this->navigation_data, ); // Create file content @@ -225,7 +237,12 @@ class config $file_content .= "\n"; // Dump file_content to disk - $fp = fopen($this->install_config_file, 'w'); + $fp = @fopen($this->install_config_file, 'w'); + if (!$fp) + { + throw new installer_config_not_writable_exception(); + } + fwrite($fp, $file_content); fclose($fp); } @@ -286,6 +303,36 @@ class config } /** + * Marks stage as completed in the navigation bar + * + * @param array $nav_path Array to the navigation elem + */ + public function set_finished_navigation_stage($nav_path) + { + $this->navigation_data['finished'][] = $nav_path; + } + + /** + * Marks stage as active in the navigation bar + * + * @param array $nav_path Array to the navigation elem + */ + public function set_active_navigation_stage($nav_path) + { + $this->navigation_data['active'] = $nav_path; + } + + /** + * Returns navigation data + * + * @return array + */ + public function get_navigation_data() + { + return $this->navigation_data; + } + + /** * Filling up system_data array */ protected function setup_system_data() diff --git a/phpBB/install/helper/iohandler/ajax_iohandler.php b/phpBB/install/helper/iohandler/ajax_iohandler.php index 960dd615b5..71571fecba 100644 --- a/phpBB/install/helper/iohandler/ajax_iohandler.php +++ b/phpBB/install/helper/iohandler/ajax_iohandler.php @@ -34,6 +34,16 @@ class ajax_iohandler extends iohandler_base protected $form; /** + * @var bool + */ + protected $request_client_refresh; + + /** + * @var array + */ + protected $nav_data; + + /** * Constructor * * @param \phpbb\request\request_interface $request HTTP request interface @@ -44,6 +54,7 @@ class ajax_iohandler extends iohandler_base $this->request = $request; $this->template = $template; $this->form = ''; + $this->nav_data = array(); parent::__construct(); } @@ -89,6 +100,8 @@ class ajax_iohandler extends iohandler_base // This code is pretty ugly... but works // + $this->template->assign_var('S_FORM_ELEM_COUNT', sizeof($form)); + $this->template->assign_block_vars('options', array( 'LEGEND' => $this->language->lang($title), 'S_LEGEND' => true, @@ -187,9 +200,21 @@ class ajax_iohandler extends iohandler_base ); } + if (!empty($this->nav_data)) + { + $json_array['nav'] = $this->nav_data; + } + $this->errors = array(); $this->warnings = array(); $this->logs = array(); + $this->nav_data = array(); + + if ($this->request_client_refresh) + { + $json_array['refresh'] = true; + $this->request_client_refresh = false; + } return $json_array; } @@ -204,6 +229,32 @@ class ajax_iohandler extends iohandler_base } /** + * {@inheritdoc} + */ + public function request_refresh() + { + $this->request_client_refresh = true; + } + + /** + * {@inheritdoc} + */ + public function set_active_stage_menu($menu_path) + { + $this->nav_data['active'] = $menu_path[sizeof($menu_path) - 1]; + $this->send_response(); + } + + /** + * {@inheritdoc} + */ + public function set_finished_stage_menu($menu_path) + { + $this->nav_data['finished'][] = $menu_path[sizeof($menu_path) - 1]; + $this->send_response(); + } + + /** * Callback function for language replacing * * @param array $matches diff --git a/phpBB/install/helper/iohandler/factory.php b/phpBB/install/helper/iohandler/factory.php index 0b59e5ec63..0af75b78ae 100644 --- a/phpBB/install/helper/iohandler/factory.php +++ b/phpBB/install/helper/iohandler/factory.php @@ -64,6 +64,10 @@ class factory case 'ajax': return $this->container->get('installer.helper.iohandler_ajax'); break; + case 'nojs': + // @todo replace this + return $this->container->get('installer.helper.iohandler_ajax'); + break; default: throw new iohandler_not_implemented_exception(); break; diff --git a/phpBB/install/helper/iohandler/iohandler_interface.php b/phpBB/install/helper/iohandler/iohandler_interface.php index 387a8617b9..c40fea24ce 100644 --- a/phpBB/install/helper/iohandler/iohandler_interface.php +++ b/phpBB/install/helper/iohandler/iohandler_interface.php @@ -123,4 +123,23 @@ interface iohandler_interface * @param int $task_number Position of the current task in the task queue */ public function set_progress($task_lang_key, $task_number); + + /** + * Sends refresh request to the client + */ + public function request_refresh(); + + /** + * Marks stage as active in the navigation bar + * + * @param array $menu_path Array to the navigation elem + */ + public function set_active_stage_menu($menu_path); + + /** + * Marks stage as completed in the navigation bar + * + * @param array $menu_path Array to the navigation elem + */ + public function set_finished_stage_menu($menu_path); } diff --git a/phpBB/install/helper/navigation/install_navigation.php b/phpBB/install/helper/navigation/install_navigation.php index 3e29e55038..1389f11fa0 100644 --- a/phpBB/install/helper/navigation/install_navigation.php +++ b/phpBB/install/helper/navigation/install_navigation.php @@ -21,7 +21,29 @@ class install_navigation implements navigation_interface 'install' => array( 'label' => 'INSTALL', 'route' => 'phpbb_installer_install', - 'order' => 0, + 'order' => 1, + array( + 'introduction' => array( + 'label' => 'INTRODUCTION_TITLE', + 'stage' => true, + 'order' => 0, + ), + 'requirements' => array( + 'label' => 'STAGE_REQUIREMENTS', + 'stage' => true, + 'order' => 1, + ), + 'obtain_data' => array( + 'label' => 'STAGE_OBTAIN_DATA', + 'stage' => true, + 'order' => 2, + ), + 'install' => array( + 'label' => 'STAGE_INSTALL', + 'stage' => true, + 'order' => 3, + ), + ), ), ); } diff --git a/phpBB/install/helper/navigation/navigation_provider.php b/phpBB/install/helper/navigation/navigation_provider.php index ddb2509348..1f58cbea83 100644 --- a/phpBB/install/helper/navigation/navigation_provider.php +++ b/phpBB/install/helper/navigation/navigation_provider.php @@ -13,6 +13,8 @@ namespace phpbb\install\helper\navigation; +use phpbb\di\service_collection; + /** * Installers navigation provider */ @@ -26,9 +28,9 @@ class navigation_provider /** * Constructor * - * @param \phpbb\di\service_collection $plugins + * @param service_collection $plugins */ - public function __construct(\phpbb\di\service_collection $plugins) + public function __construct(service_collection $plugins) { $this->menu_collection = array(); @@ -60,6 +62,27 @@ class navigation_provider } /** + * Set a property in the navigation array + * + * @param array $nav_element Array to the navigation elem + * @param array $property_array Array with the properties to set + */ + public function set_nav_property($nav_element, $property_array) + { + $array_pointer = array(); + $array_root_pointer = &$array_pointer; + foreach ($nav_element as $array_path) + { + $array_pointer[$array_path] = array(); + $array_pointer = &$array_pointer[$array_path]; + } + + $array_pointer = $property_array; + + $this->merge($array_root_pointer, $this->menu_collection); + } + + /** * Recursive array merge * * This function is necessary to be able to replace the options of diff --git a/phpBB/install/installer.php b/phpBB/install/installer.php index 1c7c9c8a92..f5da898a00 100644 --- a/phpBB/install/installer.php +++ b/phpBB/install/installer.php @@ -13,6 +13,7 @@ namespace phpbb\install; +use phpbb\install\exception\installer_config_not_writable_exception; use phpbb\install\exception\invalid_service_name_exception; use phpbb\install\exception\module_not_found_exception; use phpbb\install\exception\task_not_found_exception; @@ -106,6 +107,10 @@ class installer // Flag used by exception handling, whether or not we need to flush output buffer once again $flush_messages = false; + // We are installing something, so the introduction stage can go now... + $this->install_config->set_finished_navigation_stage(array('install', 0, 'introduction')); + $this->iohandler->set_finished_stage_menu(array('install', 0, 'introduction')); + try { if ($this->install_config->get_task_progress_count() === 0) @@ -168,6 +173,9 @@ class installer // Check if module should be executed if (!$module->is_essential() && !$module->check_requirements()) { + $this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path()); + $this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path()); + $this->iohandler->add_log_message(array( 'SKIP_MODULE', $module_service_name, @@ -176,8 +184,15 @@ class installer continue; } + // Set the correct stage in the navigation bar + $this->install_config->set_active_navigation_stage($module->get_navigation_stage_path()); + $this->iohandler->set_active_stage_menu($module->get_navigation_stage_path()); + $module->run(); + $this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path()); + $this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path()); + // Clear task progress $this->install_config->set_finished_task('', 0); } @@ -189,12 +204,12 @@ class installer } else { - // @todo: Send refresh request + $this->iohandler->request_refresh(); } } catch (user_interaction_required_exception $e) { - // @todo handle exception + // Do nothing } catch (module_not_found_exception $e) { @@ -234,7 +249,20 @@ class installer } // Save install progress - $this->install_config->save_config(); + try + { + $this->install_config->save_config(); + } + catch (installer_config_not_writable_exception $e) + { + // It is allowed to fail this test during requirements testing + $progress_data = $this->install_config->get_progress_data(); + + if ($progress_data['last_task_module_name'] !== 'installer.module.requirements_install') + { + $this->iohandler->add_error_message('INSTALLER_CONFIG_NOT_WRITABLE'); + } + } } /** diff --git a/phpBB/install/module/install_data/module.php b/phpBB/install/module/install_data/module.php index 231bcb0866..77f1f73f1f 100644 --- a/phpBB/install/module/install_data/module.php +++ b/phpBB/install/module/install_data/module.php @@ -18,5 +18,11 @@ namespace phpbb\install\module\install_data; */ class module extends \phpbb\install\module_base { - + /** + * {@inheritdoc} + */ + public function get_navigation_stage_path() + { + return array('install', 0, 'install'); + } } diff --git a/phpBB/install/module/install_database/module.php b/phpBB/install/module/install_database/module.php index d31c5573ec..0d8b33087f 100644 --- a/phpBB/install/module/install_database/module.php +++ b/phpBB/install/module/install_database/module.php @@ -18,5 +18,11 @@ namespace phpbb\install\module\install_database; */ class module extends \phpbb\install\module_base { - + /** + * {@inheritdoc} + */ + public function get_navigation_stage_path() + { + return array('install', 0, 'install'); + } } diff --git a/phpBB/install/module/install_filesystem/module.php b/phpBB/install/module/install_filesystem/module.php index 9562c957fd..7215449664 100644 --- a/phpBB/install/module/install_filesystem/module.php +++ b/phpBB/install/module/install_filesystem/module.php @@ -18,5 +18,11 @@ namespace phpbb\install\module\install_filesystem; */ class module extends \phpbb\install\module_base { - + /** + * {@inheritdoc} + */ + public function get_navigation_stage_path() + { + return array('install', 0, 'install'); + } } diff --git a/phpBB/install/module/install_finish/module.php b/phpBB/install/module/install_finish/module.php index 98c99d7cff..3a7544b84f 100644 --- a/phpBB/install/module/install_finish/module.php +++ b/phpBB/install/module/install_finish/module.php @@ -18,5 +18,11 @@ namespace phpbb\install\module\install_finish; */ class module extends \phpbb\install\module_base { - + /** + * {@inheritdoc} + */ + public function get_navigation_stage_path() + { + return array('install', 0, 'install'); + } } diff --git a/phpBB/install/module/obtain_data/module.php b/phpBB/install/module/obtain_data/module.php index a181c5231a..0e008796c5 100644 --- a/phpBB/install/module/obtain_data/module.php +++ b/phpBB/install/module/obtain_data/module.php @@ -18,6 +18,14 @@ class module extends \phpbb\install\module_base /** * {@inheritdoc} */ + public function get_navigation_stage_path() + { + return array('install', 0, 'obtain_data'); + } + + /** + * {@inheritdoc} + */ public function get_step_count() { return 0; diff --git a/phpBB/install/module/requirements/module.php b/phpBB/install/module/requirements/module.php index 5de6bd70b9..d87ca15128 100644 --- a/phpBB/install/module/requirements/module.php +++ b/phpBB/install/module/requirements/module.php @@ -61,6 +61,15 @@ class module extends \phpbb\install\module_base if (!$tests_passed) { // If requirements are not met, exit form installer + // Set up UI for retesting + $this->iohandler->add_user_form_group('', array( + 'install' => array( + 'label' => 'RETEST_REQUIREMENTS', + 'type' => 'submit', + ), + )); + + // Send the response and quit $this->iohandler->send_response(); throw new user_interaction_required_exception(); } @@ -77,4 +86,12 @@ class module extends \phpbb\install\module_base { return 0; } + + /** + * {@inheritdoc} + */ + public function get_navigation_stage_path() + { + return array('install', 0, 'requirements'); + } } diff --git a/phpBB/install/module_base.php b/phpBB/install/module_base.php index ac7ce7583a..6c0c0e0c30 100644 --- a/phpBB/install/module_base.php +++ b/phpBB/install/module_base.php @@ -75,8 +75,8 @@ abstract class module_base implements module_interface * Dependency getter * * @param ContainerInterface $container - * @param config $config - * @param iohandler_interface $iohandler + * @param config $config + * @param iohandler_interface $iohandler */ public function setup(ContainerInterface $container, config $config, iohandler_interface $iohandler) { diff --git a/phpBB/install/module_interface.php b/phpBB/install/module_interface.php index 29918f0c34..a2d61e3958 100644 --- a/phpBB/install/module_interface.php +++ b/phpBB/install/module_interface.php @@ -53,4 +53,11 @@ interface module_interface * @return int */ public function get_step_count(); + + /** + * Returns an array to the correct navigation stage + * + * @return array + */ + public function get_navigation_stage_path(); } |