You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
532 lines
17 KiB
532 lines
17 KiB
<?php declare(strict_types = 0);
|
|
/*
|
|
** Zabbix
|
|
** Copyright (C) 2001-2023 Zabbix SIA
|
|
**
|
|
** This program is free software; you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation; either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program; if not, write to the Free Software
|
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
|
|
class CMenuHelper {
|
|
|
|
/**
|
|
* Get main menu element.
|
|
*
|
|
* @throws Exception
|
|
* @return CMenu
|
|
*/
|
|
public static function getMainMenu(): CMenu {
|
|
$menu = new CMenu();
|
|
|
|
if (CWebUser::checkAccess(CRoleHelper::UI_MONITORING_DASHBOARD)) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Dashboards')))
|
|
->setId('dashboard')
|
|
->setIcon(ZBX_ICON_DASHBOARD)
|
|
->setAction('dashboard.view')
|
|
->setAliases(['dashboard.list'])
|
|
);
|
|
}
|
|
|
|
$submenu_monitoring = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_PROBLEMS)
|
|
? (new CMenuItem(_('Problems')))
|
|
->setAction('problem.view')
|
|
->setAliases(['tr_events.php'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_HOSTS)
|
|
? (new CMenuItem(_('Hosts')))
|
|
->setAction('host.view')
|
|
->setAliases([
|
|
'web.view', 'charts.view', 'chart2.php', 'chart3.php', 'chart6.php', 'chart7.php',
|
|
'httpdetails.php', 'host.dashboard.view'
|
|
])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_LATEST_DATA)
|
|
? (new CMenuItem(_('Latest data')))
|
|
->setAction('latest.view')
|
|
->setAliases(['history.php', 'chart.php'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_MAPS)
|
|
? (new CMenuItem(_('Maps')))
|
|
->setAction('map.view')
|
|
->setAliases(['image.php', 'sysmaps.php', 'sysmap.php', 'map.php'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_MONITORING_DISCOVERY)
|
|
? (new CMenuItem(_('Discovery')))->setAction('discovery.view')
|
|
: null
|
|
];
|
|
$submenu_monitoring = array_filter($submenu_monitoring);
|
|
|
|
if ($submenu_monitoring) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Monitoring')))
|
|
->setId('view')
|
|
->setIcon(ZBX_ICON_EYE_ALT)
|
|
->setSubMenu(new CMenu($submenu_monitoring))
|
|
);
|
|
}
|
|
|
|
$submenu_services = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_SERVICES_SERVICES)
|
|
? (new CMenuItem(_('Services')))
|
|
->setAction('service.list')
|
|
->setAliases(['service.list.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_SERVICES_SLA)
|
|
? (new CMenuItem(_('SLA')))
|
|
->setAction('sla.list')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_SERVICES_SLA_REPORT)
|
|
? (new CMenuItem(_('SLA report')))
|
|
->setAction('slareport.list')
|
|
: null
|
|
];
|
|
|
|
$submenu_services = array_filter($submenu_services);
|
|
|
|
if ($submenu_services) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Services')))
|
|
->setId('services')
|
|
->setIcon(ZBX_ICON_HIERARCHY)
|
|
->setSubMenu(new CMenu($submenu_services))
|
|
);
|
|
}
|
|
|
|
$submenu_inventory = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_INVENTORY_OVERVIEW)
|
|
? (new CMenuItem(_('Overview')))
|
|
->setUrl(new CUrl('hostinventoriesoverview.php'), 'hostinventoriesoverview.php')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_INVENTORY_HOSTS)
|
|
? (new CMenuItem(_('Hosts')))->setUrl(new CUrl('hostinventories.php'), 'hostinventories.php')
|
|
: null
|
|
];
|
|
$submenu_inventory = array_filter($submenu_inventory);
|
|
|
|
if ($submenu_inventory) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Inventory')))
|
|
->setId('cm')
|
|
->setIcon(ZBX_ICON_LIST)
|
|
->setSubMenu(new CMenu($submenu_inventory))
|
|
);
|
|
}
|
|
|
|
$submenu_reports = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_SYSTEM_INFO)
|
|
? (new CMenuItem(_('System information')))->setAction('report.status')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_SCHEDULED_REPORTS)
|
|
? (new CMenuItem(_('Scheduled reports')))
|
|
->setAction('scheduledreport.list')
|
|
->setAliases(['scheduledreport.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_AVAILABILITY_REPORT)
|
|
? (new CMenuItem(_('Availability report')))
|
|
->setUrl(new CUrl('report2.php'), 'report2.php')
|
|
->setAliases(['chart4.php'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_TOP_TRIGGERS)
|
|
? (new CMenuItem(_('Top 100 triggers')))->setAction('toptriggers.list')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_AUDIT)
|
|
? (new CMenuItem(_('Audit log')))->setAction('auditlog.list')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_ACTION_LOG)
|
|
? (new CMenuItem(_('Action log')))->setAction('actionlog.list')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_REPORTS_NOTIFICATIONS)
|
|
? (new CMenuItem(_('Notifications')))->setUrl(new CUrl('report4.php'), 'report4.php')
|
|
: null
|
|
];
|
|
$submenu_reports = array_filter($submenu_reports);
|
|
|
|
if ($submenu_reports) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Reports')))
|
|
->setId('reports')
|
|
->setIcon(ZBX_ICON_REPORT)
|
|
->setSubMenu(new CMenu($submenu_reports))
|
|
);
|
|
}
|
|
|
|
$submenu_data_collection = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TEMPLATE_GROUPS)
|
|
? (new CMenuItem(_('Template groups')))->setAction('templategroup.list')
|
|
->setAliases(['templategroup.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_HOST_GROUPS)
|
|
? (new CMenuItem(_('Host groups')))->setAction('hostgroup.list')
|
|
->setAliases(['hostgroup.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TEMPLATES)
|
|
? (new CMenuItem(_('Templates')))
|
|
->setAction('template.list')
|
|
->setAliases([
|
|
'template.dashboard.list', 'template.dashboard.edit', 'items.php?context=template',
|
|
'triggers.php?context=template', 'graphs.php?context=template',
|
|
'host_discovery.php?context=template', 'disc_prototypes.php?context=template',
|
|
'trigger_prototypes.php?context=template', 'host_prototypes.php?context=template',
|
|
'httpconf.php?context=template'
|
|
])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_HOSTS)
|
|
? (new CMenuItem(_('Hosts')))
|
|
->setAction('host.list')
|
|
->setAliases([
|
|
'items.php?context=host', 'triggers.php?context=host', 'graphs.php?context=host',
|
|
'host_discovery.php?context=host', 'disc_prototypes.php?context=host',
|
|
'trigger_prototypes.php?context=host', 'host_prototypes.php?context=host',
|
|
'httpconf.php?context=host', 'host.edit'
|
|
])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_MAINTENANCE)
|
|
? (new CMenuItem(_('Maintenance')))->setAction('maintenance.list')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_EVENT_CORRELATION)
|
|
? (new CMenuItem(_('Event correlation')))
|
|
->setAction('correlation.list')
|
|
->setAliases(['correlation.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY)
|
|
? (new CMenuItem(_('Discovery')))
|
|
->setAction('discovery.list')
|
|
->setAliases(['discovery.edit'])
|
|
: null
|
|
];
|
|
$submenu_data_collection = array_filter($submenu_data_collection);
|
|
|
|
if ($submenu_data_collection) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Data collection')))
|
|
->setId('config')
|
|
->setIcon(ZBX_ICON_DOWNLOAD)
|
|
->setSubMenu(new CMenu($submenu_data_collection))
|
|
);
|
|
}
|
|
|
|
$submenu_alerts = [
|
|
(CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TRIGGER_ACTIONS) ||
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_SERVICE_ACTIONS) ||
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY_ACTIONS) ||
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_AUTOREGISTRATION_ACTIONS) ||
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_INTERNAL_ACTIONS))
|
|
? (new CMenuItem(_('Actions')))
|
|
->setSubMenu(new CMenu(array_filter([
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_TRIGGER_ACTIONS)
|
|
? (new CMenuItem(_('Trigger actions')))
|
|
->setUrl(
|
|
(new CUrl('zabbix.php'))
|
|
->setArgument('action', 'action.list')
|
|
->setArgument('eventsource', EVENT_SOURCE_TRIGGERS),
|
|
'action.list?eventsource='.EVENT_SOURCE_TRIGGERS
|
|
)
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_SERVICE_ACTIONS)
|
|
? (new CMenuItem(_('Service actions')))
|
|
->setUrl(
|
|
(new CUrl('zabbix.php'))
|
|
->setArgument('action', 'action.list')
|
|
->setArgument('eventsource', EVENT_SOURCE_SERVICE),
|
|
'action.list?eventsource='.EVENT_SOURCE_SERVICE
|
|
)
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_DISCOVERY_ACTIONS)
|
|
? (new CMenuItem(_('Discovery actions')))
|
|
->setUrl(
|
|
(new CUrl('zabbix.php'))
|
|
->setArgument('action', 'action.list')
|
|
->setArgument('eventsource', EVENT_SOURCE_DISCOVERY),
|
|
'action.list?eventsource='.EVENT_SOURCE_DISCOVERY
|
|
)
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_AUTOREGISTRATION_ACTIONS)
|
|
? (new CMenuItem(_('Autoregistration actions')))
|
|
->setUrl(
|
|
(new CUrl('zabbix.php'))
|
|
->setArgument('action', 'action.list')
|
|
->setArgument('eventsource', EVENT_SOURCE_AUTOREGISTRATION),
|
|
'action.list?eventsource='.EVENT_SOURCE_AUTOREGISTRATION
|
|
)
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_CONFIGURATION_INTERNAL_ACTIONS)
|
|
? (new CMenuItem(_('Internal actions')))
|
|
->setUrl(
|
|
(new CUrl('zabbix.php'))
|
|
->setArgument('action', 'action.list')
|
|
->setArgument('eventsource', EVENT_SOURCE_INTERNAL),
|
|
'action.list?eventsource='.EVENT_SOURCE_INTERNAL
|
|
)
|
|
: null
|
|
])))
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_MEDIA_TYPES)
|
|
? (new CMenuItem(_('Media types')))
|
|
->setAction('mediatype.list')
|
|
->setAliases(['mediatype.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_SCRIPTS)
|
|
? (new CMenuItem(_('Scripts')))
|
|
->setAction('script.list')
|
|
->setAliases(['script.edit'])
|
|
: null
|
|
];
|
|
$submenu_alerts = array_filter($submenu_alerts);
|
|
|
|
if ($submenu_alerts) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Alerts')))
|
|
->setId('alerts')
|
|
->setIcon(ZBX_ICON_ENVELOPE)
|
|
->setSubMenu(new CMenu($submenu_alerts))
|
|
);
|
|
}
|
|
|
|
$submenu_users = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USER_GROUPS)
|
|
? (new CMenuItem(_('User groups')))
|
|
->setAction('usergroup.list')
|
|
->setAliases(['usergroup.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USER_ROLES)
|
|
? (new CMenuItem(_('User roles')))
|
|
->setAction('userrole.list')
|
|
->setAliases(['userrole.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_USERS)
|
|
? (new CMenuItem(_('Users')))
|
|
->setAction('user.list')
|
|
->setAliases(['user.edit'])
|
|
: null,
|
|
(!CWebUser::isGuest() && CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_API_TOKENS) &&
|
|
CWebUser::checkAccess(CRoleHelper::ACTIONS_MANAGE_API_TOKENS))
|
|
? (new CMenuItem(_('API tokens')))
|
|
->setAction('token.list')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_AUTHENTICATION)
|
|
? (new CMenuItem(_('Authentication')))
|
|
->setAction('authentication.edit')
|
|
: null
|
|
];
|
|
$submenu_users = array_filter($submenu_users);
|
|
|
|
if ($submenu_users) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Users')))
|
|
->setId('users-menu')
|
|
->setIcon(ZBX_ICON_USERS)
|
|
->setSubMenu(new CMenu($submenu_users))
|
|
);
|
|
}
|
|
|
|
$submenu_administration = [
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_GENERAL)
|
|
? (new CMenuItem(_('General')))
|
|
->setSubMenu(new CMenu(array_filter([
|
|
(new CMenuItem(_('GUI')))
|
|
->setAction('gui.edit'),
|
|
(new CMenuItem(_('Autoregistration')))
|
|
->setAction('autoreg.edit'),
|
|
(new CMenuItem(_('Images')))
|
|
->setAction('image.list')
|
|
->setAliases(['image.edit']),
|
|
(new CMenuItem(_('Icon mapping')))
|
|
->setAction('iconmap.list')
|
|
->setAliases(['iconmap.edit']),
|
|
(new CMenuItem(_('Regular expressions')))
|
|
->setAction('regex.list')
|
|
->setAliases(['regex.edit']),
|
|
(new CMenuItem(_('Trigger displaying options')))
|
|
->setAction('trigdisplay.edit'),
|
|
(new CMenuItem(_('Geographical maps')))
|
|
->setAction('geomaps.edit'),
|
|
(new CMenuItem(_('Modules')))
|
|
->setAction('module.list')
|
|
->setAliases(['module.edit', 'module.scan']),
|
|
(new CMenuItem(_('Connectors')))
|
|
->setAction('connector.list')
|
|
->setAliases(['connector.edit']),
|
|
(new CMenuItem(_('Other')))
|
|
->setAction('miscconfig.edit')
|
|
])))
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_AUDIT_LOG)
|
|
? (new CMenuItem(_('Audit log')))
|
|
->setAction('audit.settings.edit')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_HOUSEKEEPING)
|
|
? (new CMenuItem(_('Housekeeping')))
|
|
->setAction('housekeeping.edit')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_PROXIES)
|
|
? (new CMenuItem(_('Proxies')))
|
|
->setAction('proxy.list')
|
|
->setAliases(['proxy.edit'])
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_MACROS)
|
|
? (new CMenuItem(_('Macros')))
|
|
->setAction('macros.edit')
|
|
: null,
|
|
CWebUser::checkAccess(CRoleHelper::UI_ADMINISTRATION_QUEUE)
|
|
? (new CMenuItem(_('Queue')))
|
|
->setSubMenu(new CMenu([
|
|
(new CMenuItem(_('Queue overview')))
|
|
->setAction('queue.overview'),
|
|
(new CMenuItem(_('Queue overview by proxy')))
|
|
->setAction('queue.overview.proxy'),
|
|
(new CMenuItem(_('Queue details')))
|
|
->setAction('queue.details')
|
|
]))
|
|
: null
|
|
];
|
|
$submenu_administration = array_filter($submenu_administration);
|
|
|
|
if ($submenu_administration) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Administration')))
|
|
->setId('admin')
|
|
->setIcon(ZBX_ICON_COG)
|
|
->setSubMenu(new CMenu($submenu_administration))
|
|
);
|
|
}
|
|
|
|
return $menu;
|
|
}
|
|
|
|
/**
|
|
* Get user menu element.
|
|
*
|
|
* @return CMenu
|
|
*/
|
|
public static function getUserMenu(): CMenu {
|
|
$menu = new CMenu();
|
|
|
|
if (!CBrandHelper::isRebranded()) {
|
|
$lang = CWebUser::getLang();
|
|
$menu
|
|
->add(
|
|
(new CMenuItem(_('Support')))
|
|
->setIcon(ZBX_ICON_SUPPORT)
|
|
->setUrl(new CUrl(getSupportUrl($lang)))
|
|
->setTitle(_('Zabbix Technical Support'))
|
|
->setTarget('_blank')
|
|
)
|
|
->add(
|
|
(new CMenuItem(_('Integrations')))
|
|
->setIcon(ZBX_ICON_Z)
|
|
->setUrl(new CUrl(getIntegrationsUrl($lang)))
|
|
->setTitle(_('Zabbix Integrations'))
|
|
->setTarget('_blank')
|
|
);
|
|
}
|
|
|
|
$menu->add(
|
|
(new CMenuItem(_('Help')))
|
|
->setIcon(ZBX_ICON_HELP)
|
|
->setUrl(new CUrl(CBrandHelper::getHelpUrl()))
|
|
->setTitle(_('Help'))
|
|
->setTarget('_blank')
|
|
);
|
|
|
|
$user = array_intersect_key(CWebUser::$data, array_flip(['username', 'name', 'surname'])) + [
|
|
'name' => null,
|
|
'surname' => null
|
|
];
|
|
|
|
if (CWebUser::isGuest()) {
|
|
$menu->add(
|
|
(new CMenuItem(_('Guest user')))
|
|
->setIcon(ZBX_ICON_USER)
|
|
->setTitle(getUserFullname($user))
|
|
);
|
|
}
|
|
elseif (CWebUser::checkAccess(CRoleHelper::ACTIONS_MANAGE_API_TOKENS)) {
|
|
$menu->add(
|
|
(new CMenuItem(_('User settings')))
|
|
->setIcon(ZBX_ICON_USER_FILLED)
|
|
->setTitle(getUserFullname($user))
|
|
->setSubMenu(new CMenu([
|
|
(new CMenuItem(_('Profile')))
|
|
->setAction('userprofile.edit'),
|
|
(new CMenuItem(_('API tokens')))
|
|
->setAction('user.token.list')
|
|
]))
|
|
);
|
|
}
|
|
else {
|
|
$menu->add(
|
|
(new CMenuItem(_('User settings')))
|
|
->setIcon(ZBX_ICON_USER_FILLED)
|
|
->setAction('userprofile.edit')
|
|
->setTitle(getUserFullname($user))
|
|
);
|
|
}
|
|
|
|
$menu->add(
|
|
(new CMenuItem(_('Sign out')))
|
|
->setIcon(ZBX_ICON_SIGNOUT)
|
|
->setUrl(new CUrl('#signout'))
|
|
->setTitle(_('Sign out'))
|
|
->onClick('ZABBIX.logout(event)')
|
|
);
|
|
|
|
return $menu;
|
|
}
|
|
|
|
/**
|
|
* Get first menu item from main menu.
|
|
*
|
|
* @return CMenuItem
|
|
*/
|
|
private static function getFirstMenuItem(): CMenuItem {
|
|
$menu = self::getMainMenu();
|
|
|
|
foreach (CRoleHelper::getUiSectionsLabels(CWebUser::$data['type']) as $section_label) {
|
|
$section_submenu = $menu->find($section_label);
|
|
|
|
if ($section_submenu instanceof CMenuItem && !$section_submenu->hasSubMenu()) {
|
|
return $menu->getMenuItems()[0];
|
|
}
|
|
elseif ($section_submenu instanceof CMenuItem) {
|
|
$menu = $section_submenu
|
|
->getSubMenu()
|
|
->getMenuItems();
|
|
|
|
if ($menu[0]->hasSubMenu()) {
|
|
$menu = $menu[0]
|
|
->getSubMenu()
|
|
->getMenuItems();
|
|
}
|
|
|
|
return $menu[0];
|
|
}
|
|
}
|
|
|
|
return $menu->getMenuItems()[0];
|
|
}
|
|
|
|
public static function getFirstUrl(): string {
|
|
return self::getFirstMenuItem()
|
|
->getUrl()
|
|
->getUrl();
|
|
}
|
|
|
|
public static function getFirstLabel(): string {
|
|
return self::getFirstMenuItem()->getLabel();
|
|
}
|
|
}
|