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
This commit is contained in:
Piotr Miazga 2019-06-21 18:22:17 +02:00
parent 18a1d48d53
commit 0e65adbf44
4 changed files with 58 additions and 29 deletions

View File

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

View File

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

View File

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

View File

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