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;