1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-11 11:13:59 +02:00

[ticket/13740] Add navigation bar support for the installer

Also added various UI elements and texts.
[ci skip]

PHPBB3-13740
This commit is contained in:
CHItA
2015-06-11 19:32:11 +02:00
committed by Mate Bartus
parent 1b81bf5b23
commit db4cfa7df6
27 changed files with 495 additions and 54 deletions

View File

@@ -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']),
));
}
}
}
}

View File

@@ -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());
// 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']))
{
$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())
{
// @todo: remove this line, and use the above
$this->installer->set_iohandler($this->iohandler_factory->get());
$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');
}

View File

@@ -13,7 +13,7 @@
namespace phpbb\install\controller;
class install_index
class installer_index
{
/**
* @var helper

View File

@@ -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
{
}

View File

@@ -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
{

View File

@@ -13,6 +13,8 @@
namespace phpbb\install\helper;
use phpbb\install\exception\installer_config_not_writable_exception;
/**
* Stores common settings and installation status
*/
@@ -64,6 +66,13 @@ class config
*/
protected $system_data;
/**
* Array containing navigation bar information
*
* @var array
*/
protected $navigation_data;
/**
* Constructor
*/
@@ -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);
}
@@ -285,6 +302,36 @@ class config
return $this->progress_data['max_task_progress'];
}
/**
* 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
*/

View File

@@ -33,6 +33,16 @@ class ajax_iohandler extends iohandler_base
*/
protected $form;
/**
* @var bool
*/
protected $request_client_refresh;
/**
* @var array
*/
protected $nav_data;
/**
* Constructor
*
@@ -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;
}
@@ -203,6 +228,32 @@ class ajax_iohandler extends iohandler_base
$this->send_response();
}
/**
* {@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
*

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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,
),
),
),
);
}

View File

@@ -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();
@@ -59,6 +61,27 @@ class navigation_provider
$this->merge($nav_arry, $this->menu_collection);
}
/**
* 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
*

View File

@@ -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');
}
}
}
/**

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -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');
}
}

View File

@@ -15,6 +15,14 @@ namespace phpbb\install\module\obtain_data;
class module extends \phpbb\install\module_base
{
/**
* {@inheritdoc}
*/
public function get_navigation_stage_path()
{
return array('install', 0, 'obtain_data');
}
/**
* {@inheritdoc}
*/

View File

@@ -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');
}
}

View File

@@ -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)
{

View File

@@ -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();
}