From 0e65adbf44af3c2bdfd528573c8b3b907701fb7a Mon Sep 17 00:00:00 2001 From: Piotr Miazga Date: Fri, 21 Jun 2019 18:22:17 +0200 Subject: [PATCH] Move hamburger icon generation into Director The MainMenu is built using Builder pattern. The hamburger icon is always the same, and it should be defined in the Menu builder, not as a separte UI element. For better code organization, all things related to MainMenu building should stay in the Menu Director/Builders, not in the SkinMinerva class. Changes: - moved hamburger icon build method into MainMenu/Director (as the menu icon is the same for all builders) - renamed stuff in BaseTemplate for better readability - use MediaWikiServices::getInstance()->getSpecialPageFactory() instead of deprecated SpecialPageFactory class. Change-Id: Ie5b30c0dd1649d38a4023ccb40c99dee2a127a70 --- includes/ServiceWiring.php | 2 +- includes/menu/Main/Director.php | 55 +++++++++++++++++++++++++++--- includes/skins/MinervaTemplate.php | 4 +-- includes/skins/SkinMinerva.php | 26 +++----------- 4 files changed, 58 insertions(+), 29 deletions(-) diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 73a7465..e5dd3ce 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -41,7 +41,7 @@ return [ new MainMenu\AdvancedBuilder( $showMobileOptions, $user, $definitions ) : new MainMenu\DefaultBuilder( $showMobileOptions, $user, $definitions ); - return new MainMenu\Director( $builder ); + return new MainMenu\Director( $builder, $context, $services->getSpecialPageFactory() ); }, 'Minerva.Menu.PageActionsDirector' => function ( MediaWikiServices $services ) { /** diff --git a/includes/menu/Main/Director.php b/includes/menu/Main/Director.php index 40f6d00..421d9b6 100644 --- a/includes/menu/Main/Director.php +++ b/includes/menu/Main/Director.php @@ -19,6 +19,12 @@ */ namespace MediaWiki\Minerva\Menu\Main; +use Html; +use MessageLocalizer; +use MinervaUI; +use SpecialPage; +use \MediaWiki\Special\SpecialPageFactory; + /** * Director responsible for building Main Menu */ @@ -34,13 +40,32 @@ final class Director { */ private $menuData; + /** + * @var MessageLocalizer + */ + private $msgLocalizer; + + /** + * @var SpecialPageFactory + */ + private $specialPageFactory; + /** * Director responsible for Main Menu building * * @param IBuilder $builder + * @param MessageLocalizer $messageLocalizer Used for translating texts in menu toggle + * @param SpecialPageFactory $specialPageFactory Used to check for MobileMenu special page + * existence */ - public function __construct( IBuilder $builder ) { + public function __construct( + IBuilder $builder, + MessageLocalizer $messageLocalizer, + SpecialPageFactory $specialPageFactory + ) { $this->builder = $builder; + $this->msgLocalizer = $messageLocalizer; + $this->specialPageFactory = $specialPageFactory; } /** @@ -60,15 +85,37 @@ final class Director { */ private function buildMenu() { $menuData = [ - 'groups' => [], - 'sitelinks' => $this->builder->getSiteLinks()->getEntries() + 'buttonHTML' => $this->prepareToggle(), + 'items' => [ + 'groups' => [], + 'sitelinks' => $this->builder->getSiteLinks()->getEntries() + ] ]; foreach ( $this->builder->getGroups() as $group ) { if ( $group->hasEntries() ) { - $menuData['groups'][] = $group->getEntries(); + $menuData['items']['groups'][] = $group->getEntries(); } } return $menuData; } + /** + * Prepare the button opens the main side menu + * @return string Rendered Menu button as HTML + */ + protected function prepareToggle() { + $url = $this->specialPageFactory->exists( 'MobileMenu' ) ? + SpecialPage::getTitleFor( 'MobileMenu' )->getLocalURL() : '#'; + $title = $this->msgLocalizer->msg( 'mobile-frontend-main-menu-button-tooltip' )->text(); + $tooltip = $this->msgLocalizer->msg( 'mobile-frontend-main-menu-button-tooltip' ) + ->text(); + + return Html::element( 'a', [ + 'title' => $title, + 'href' => $url, + 'class' => MinervaUI::iconClass( 'mainmenu', 'element', 'main-menu-button' ), + 'id' => 'mw-mf-main-menu-button', + ], $tooltip ); + } + } diff --git a/includes/skins/MinervaTemplate.php b/includes/skins/MinervaTemplate.php index 7ce13a2..a32e75f 100644 --- a/includes/skins/MinervaTemplate.php +++ b/includes/skins/MinervaTemplate.php @@ -211,7 +211,7 @@ class MinervaTemplate extends BaseTemplate { $templateParser = new TemplateParser( __DIR__ . '/../../resources/skins.minerva.scripts/menu/' ); - return $templateParser->processTemplate( 'menu', $data['menu_data'] ); + return $templateParser->processTemplate( 'menu', $data['mainMenu']['items'] ); } return ''; @@ -239,7 +239,7 @@ class MinervaTemplate extends BaseTemplate { 'search' => $data['search'], 'placeholder' => wfMessage( 'mobile-frontend-placeholder' ), 'headelement' => $data[ 'headelement' ], - 'menuButton' => $data['menuButton'], + 'menuButton' => $data['mainMenu']['buttonHTML'], 'siteheading' => $data['footer-site-heading-html'], 'mainPageURL' => Title::newMainPage()->getLocalURL(), // A button when clicked will submit the form diff --git a/includes/skins/SkinMinerva.php b/includes/skins/SkinMinerva.php index d52e94e..c3fa9cc 100644 --- a/includes/skins/SkinMinerva.php +++ b/includes/skins/SkinMinerva.php @@ -138,7 +138,7 @@ class SkinMinerva extends SkinTemplate { $tpl->set( 'unstyledContent', $out->getProperty( 'unstyledContent' ) ); // Set the links for the main menu - $tpl->set( 'menu_data', $this->getMainMenu()->getMenuData() ); + $tpl->set( 'mainMenu', $this->getMainMenu()->getMenuData() ); // Set the links for page secondary actions $tpl->set( 'secondary_actions', $this->getSecondaryActions( $tpl ) ); @@ -146,7 +146,6 @@ class SkinMinerva extends SkinTemplate { // Construct various Minerva-specific interface elements $this->preparePageContent( $tpl ); $this->prepareHeaderAndFooter( $tpl ); - $this->prepareMenuButton( $tpl ); $this->prepareBanners( $tpl ); $this->preparePageActions( $tpl ); $this->prepareUserNotificationsButton( $tpl, $tpl->get( 'newtalk' ) ); @@ -671,25 +670,6 @@ class SkinMinerva extends SkinTemplate { } } - /** - * Prepare the button opens the main side menu - * @param BaseTemplate $tpl - */ - protected function prepareMenuButton( BaseTemplate $tpl ) { - // menu button - $url = SpecialPageFactory::exists( 'MobileMenu' ) ? - SpecialPage::getTitleFor( 'MobileMenu' )->getLocalURL() : '#'; - - $tpl->set( 'menuButton', - Html::element( 'a', [ - 'title' => $this->msg( 'mobile-frontend-main-menu-button-tooltip' )->text(), - 'href' => $url, - 'class' => MinervaUI::iconClass( 'mainmenu', 'element', 'main-menu-button' ), - 'id' => 'mw-mf-main-menu-button', - ], $this->msg( 'mobile-frontend-main-menu-button-tooltip' )->text() ) - ); - } - /** * Load internal banner content to show in pre content in template * Beware of HTML caching when using this function. @@ -871,10 +851,12 @@ class SkinMinerva extends SkinTemplate { * @return array */ public function getSkinConfigVariables() { + $menuData = $this->getMainMenu()->getMenuData(); $vars = [ 'wgMinervaFeatures' => $this->skinOptions->getAll(), 'wgMinervaDownloadNamespaces' => $this->getConfig()->get( 'MinervaDownloadNamespaces' ), - 'wgMinervaMenuData' => $this->getMainMenu()->getMenuData(), + // hamburger icon is already rendered, pass only menu items + 'wgMinervaMenuData' => $menuData['items'] ]; return $vars;