diff --git a/phpBB/config/default/container/services.yml b/phpBB/config/default/container/services.yml index c376726b3b..36f22d72d6 100644 --- a/phpBB/config/default/container/services.yml +++ b/phpBB/config/default/container/services.yml @@ -8,6 +8,7 @@ imports: - { resource: services_db.yml } - { resource: services_event.yml } - { resource: services_feed.yml } + - { resource: services_help.yml } - { resource: services_mimetype_guesser.yml } - { resource: services_notification.yml } - { resource: services_password.yml } diff --git a/phpBB/config/default/container/services_help.yml b/phpBB/config/default/container/services_help.yml new file mode 100644 index 0000000000..ae3eafe7b0 --- /dev/null +++ b/phpBB/config/default/container/services_help.yml @@ -0,0 +1,10 @@ +services: + phpbb.help.controller: + class: phpbb\help\controller\help + arguments: + - @controller.helper + - @dispatcher + - @template + - @user + - %core.root_path% + - %core.php_ext% diff --git a/phpBB/config/default/routing/help.yml b/phpBB/config/default/routing/help.yml new file mode 100644 index 0000000000..957d6dab55 --- /dev/null +++ b/phpBB/config/default/routing/help.yml @@ -0,0 +1,3 @@ +phpbb_help_controller: + path: /{mode} + defaults: { _controller: phpbb.help.controller:handle } diff --git a/phpBB/config/default/routing/routing.yml b/phpBB/config/default/routing/routing.yml index 94146e1ec2..d6881f1959 100644 --- a/phpBB/config/default/routing/routing.yml +++ b/phpBB/config/default/routing/routing.yml @@ -7,3 +7,7 @@ # The above will be accessed via app.php?controller=foo and it will # instantiate the "foo_service" service and call the "method" method. # + +phpbb_help_routing: + resource: "help.yml" + prefix: /help diff --git a/phpBB/faq.php b/phpBB/faq.php index ddecd28b00..e6a44f588f 100644 --- a/phpBB/faq.php +++ b/phpBB/faq.php @@ -24,90 +24,8 @@ $user->session_begin(); $auth->acl($user->data); $user->setup(); -$mode = $request->variable('mode', ''); +/** @var \phpbb\controller\helper $controller_helper */ +$controller_helper = $phpbb_container->get('controller.helper'); -// Load the appropriate faq file -switch ($mode) -{ - case 'bbcode': - $l_title = $user->lang['BBCODE_GUIDE']; - $user->add_lang('bbcode', false, true); - break; - - default: - $page_title = $user->lang['FAQ_EXPLAIN']; - $ext_name = $lang_file = ''; - - /** - * You can use this event display a custom help page - * - * @event core.faq_mode_validation - * @var string page_title Title of the page - * @var string mode FAQ that is going to be displayed - * @var string lang_file Language file containing the help data - * @var string ext_name Vendor and extension name where the help - * language file can be loaded from - * @since 3.1.4-RC1 - */ - $vars = array( - 'page_title', - 'mode', - 'lang_file', - 'ext_name', - ); - extract($phpbb_dispatcher->trigger_event('core.faq_mode_validation', compact($vars))); - - $l_title = $page_title; - $user->add_lang(($lang_file) ? $lang_file : 'faq', false, true, $ext_name); - break; -} - -// Pull the array data from the lang pack -$switch_column = $found_switch = false; -$help_blocks = array(); -foreach ($user->help as $help_ary) -{ - if ($help_ary[0] == '--') - { - if ($help_ary[1] == '--') - { - $switch_column = true; - $found_switch = true; - continue; - } - - $template->assign_block_vars('faq_block', array( - 'BLOCK_TITLE' => $help_ary[1], - 'SWITCH_COLUMN' => $switch_column, - )); - - if ($switch_column) - { - $switch_column = false; - } - continue; - } - - $template->assign_block_vars('faq_block.faq_row', array( - 'FAQ_QUESTION' => $help_ary[0], - 'FAQ_ANSWER' => $help_ary[1]) - ); -} - -// Lets build a page ... -$template->assign_vars(array( - 'L_FAQ_TITLE' => $l_title, - 'L_BACK_TO_TOP' => $user->lang['BACK_TO_TOP'], - - 'SWITCH_COLUMN_MANUALLY' => (!$found_switch) ? true : false, - 'S_IN_FAQ' => true, -)); - -page_header($l_title); - -$template->set_filenames(array( - 'body' => 'faq_body.html') -); -make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx")); - -page_footer(); +// TODO send "Moved permanently" header +redirect($controller_helper->route('phpbb_help_controller', array('mode' => $request->variable('mode', 'faq')))); diff --git a/phpBB/phpbb/help/controller/help.php b/phpBB/phpbb/help/controller/help.php new file mode 100644 index 0000000000..e9594a0563 --- /dev/null +++ b/phpBB/phpbb/help/controller/help.php @@ -0,0 +1,160 @@ + + * @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\help\controller; + +use phpbb\exception\http_exception; + +class help +{ + /** @var \phpbb\controller\helper */ + protected $helper; + + /** @var \phpbb\event\dispatcher_interface */ + protected $dispatcher; + + /** @var \phpbb\template\template */ + protected $template; + + /** @var \phpbb\user */ + protected $user; + + /** @var string */ + protected $root_path; + + /** @var string */ + protected $php_ext; + + /** + * Constructor + * + * @param \phpbb\controller\helper $helper + * @param \phpbb\event\dispatcher_interface $dispatcher + * @param \phpbb\template\template $template + * @param \phpbb\user $user + * @param string $root_path + * @param string $php_ext + */ + public function __construct(\phpbb\controller\helper $helper, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\template\template $template, \phpbb\user $user, $root_path, $php_ext) + { + $this->helper = $helper; + $this->dispatcher = $dispatcher; + $this->template = $template; + $this->user = $user; + $this->root_path = $root_path; + $this->php_ext = $php_ext; + } + + /** + * Controller for /help/{mode} routes + * + * @param string $mode + * @return \Symfony\Component\HttpFoundation\Response A Symfony Response object + * @throws http_exception when the $mode is not known by any extension + */ + public function handle($mode) + { + switch ($mode) + { + case 'faq': + case 'bbcode': + $page_title = ($mode === 'faq') ? $this->user->lang['FAQ_EXPLAIN'] : $this->user->lang['BBCODE_GUIDE']; + $this->user->add_lang($mode, false, true); + break; + + default: + $page_title = $this->user->lang['FAQ_EXPLAIN']; + $ext_name = $lang_file = ''; + + /** + * You can use this event display a custom help page + * + * @event core.faq_mode_validation + * @var string page_title Title of the page + * @var string mode FAQ that is going to be displayed + * @var string lang_file Language file containing the help data + * @var string ext_name Vendor and extension name where the help + * language file can be loaded from + * @since 3.1.4-RC1 + */ + $vars = array( + 'page_title', + 'mode', + 'lang_file', + 'ext_name', + ); + extract($this->dispatcher->trigger_event('core.faq_mode_validation', compact($vars))); + + if ($ext_name === '' || $lang_file === '') + { + throw new http_exception(501, 'FEATURE_NOT_AVAILABLE'); + } + + $this->user->add_lang($lang_file, false, true, $ext_name); + break; + + } + + $this->template->assign_vars(array( + 'L_FAQ_TITLE' => $page_title, + 'S_IN_FAQ' => true, + )); + + $this->assign_to_template($this->user->help); + + make_jumpbox(append_sid("{$this->root_path}viewforum.{$this->php_ext}")); + return $this->helper->render('faq_body.html', $page_title); + } + + /** + * Assigns the help data to the template blocks + * + * @param array $help_data + * @return null + */ + protected function assign_to_template(array $help_data) + { + // Pull the array data from the lang pack + $switch_column = $found_switch = false; + foreach ($help_data as $help_ary) + { + if ($help_ary[0] == '--') + { + if ($help_ary[1] == '--') + { + $switch_column = true; + $found_switch = true; + continue; + } + + $this->template->assign_block_vars('faq_block', array( + 'BLOCK_TITLE' => $help_ary[1], + 'SWITCH_COLUMN' => $switch_column, + )); + + if ($switch_column) + { + $switch_column = false; + } + continue; + } + + $this->template->assign_block_vars('faq_block.faq_row', array( + 'FAQ_QUESTION' => $help_ary[0], + 'FAQ_ANSWER' => $help_ary[1], + )); + } + + $this->template->assign_var('SWITCH_COLUMN_MANUALLY', !$found_switch); + } +}