mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 09:17:35 +00:00
514 lines
11 KiB
PHP
514 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
namespace Magento\Backend\Model\Menu;
|
|
|
|
use Magento\Backend\Model\Menu;
|
|
use Magento\Store\Model\ScopeInterface;
|
|
|
|
/**
|
|
* Menu item. Should be used to create nested menu structures with \Magento\Backend\Model\Menu
|
|
*
|
|
* @api
|
|
* @SuppressWarnings(PHPMD.TooManyFields)
|
|
* @since 100.0.2
|
|
*/
|
|
class Item
|
|
{
|
|
/**
|
|
* Menu item id
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_id;
|
|
|
|
/**
|
|
* Menu item title
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_title;
|
|
|
|
/**
|
|
* Module of menu item
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_moduleName;
|
|
|
|
/**
|
|
* Menu item sort index in list
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_sortIndex = null;
|
|
|
|
/**
|
|
* Menu item action
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_action = null;
|
|
|
|
/**
|
|
* Parent menu item id
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_parentId = null;
|
|
|
|
/**
|
|
* Acl resource of menu item
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_resource;
|
|
|
|
/**
|
|
* Item tooltip text
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_tooltip;
|
|
|
|
/**
|
|
* Path from root element in tree
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_path = '';
|
|
|
|
/**
|
|
* Acl
|
|
*
|
|
* @var \Magento\Framework\AuthorizationInterface
|
|
*/
|
|
protected $_acl;
|
|
|
|
/**
|
|
* Module that item is dependent on
|
|
*
|
|
* @var string|null
|
|
*/
|
|
protected $_dependsOnModule;
|
|
|
|
/**
|
|
* Global config option that item is dependent on
|
|
*
|
|
* @var string|null
|
|
*/
|
|
protected $_dependsOnConfig;
|
|
|
|
/**
|
|
* Submenu item list
|
|
*
|
|
* @var Menu
|
|
*/
|
|
protected $_submenu;
|
|
|
|
/**
|
|
* @var \Magento\Backend\Model\MenuFactory
|
|
*/
|
|
protected $_menuFactory;
|
|
|
|
/**
|
|
* @var \Magento\Backend\Model\UrlInterface
|
|
*/
|
|
protected $_urlModel;
|
|
|
|
/**
|
|
* @var \Magento\Framework\App\Config\ScopeConfigInterface
|
|
*/
|
|
protected $_scopeConfig;
|
|
|
|
/**
|
|
* @var \Magento\Backend\Model\Menu\Item\Validator
|
|
*/
|
|
protected $_validator;
|
|
|
|
/**
|
|
* Serialized submenu string
|
|
*
|
|
* @var string
|
|
* @deprecated 100.2.0
|
|
*/
|
|
protected $_serializedSubmenu;
|
|
|
|
/**
|
|
* Module list
|
|
*
|
|
* @var \Magento\Framework\Module\ModuleListInterface
|
|
*/
|
|
protected $_moduleList;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Module\Manager
|
|
*/
|
|
private $_moduleManager;
|
|
|
|
/**
|
|
* Menu item target
|
|
*
|
|
* @var string|null
|
|
*/
|
|
private $target;
|
|
|
|
/**
|
|
* @param Item\Validator $validator
|
|
* @param \Magento\Framework\AuthorizationInterface $authorization
|
|
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
|
|
* @param \Magento\Backend\Model\MenuFactory $menuFactory
|
|
* @param \Magento\Backend\Model\UrlInterface $urlModel
|
|
* @param \Magento\Framework\Module\ModuleListInterface $moduleList
|
|
* @param \Magento\Framework\Module\Manager $moduleManager
|
|
* @param array $data
|
|
*/
|
|
public function __construct(
|
|
\Magento\Backend\Model\Menu\Item\Validator $validator,
|
|
\Magento\Framework\AuthorizationInterface $authorization,
|
|
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
|
|
\Magento\Backend\Model\MenuFactory $menuFactory,
|
|
\Magento\Backend\Model\UrlInterface $urlModel,
|
|
\Magento\Framework\Module\ModuleListInterface $moduleList,
|
|
\Magento\Framework\Module\Manager $moduleManager,
|
|
array $data = []
|
|
) {
|
|
$this->_validator = $validator;
|
|
$this->_validator->validate($data);
|
|
$this->_moduleManager = $moduleManager;
|
|
$this->_acl = $authorization;
|
|
$this->_scopeConfig = $scopeConfig;
|
|
$this->_menuFactory = $menuFactory;
|
|
$this->_urlModel = $urlModel;
|
|
$this->_moduleList = $moduleList;
|
|
$this->populateFromArray($data);
|
|
}
|
|
|
|
/**
|
|
* Retrieve argument element, or default value
|
|
*
|
|
* @param array $array
|
|
* @param string $key
|
|
* @param mixed $defaultValue
|
|
* @return mixed
|
|
*/
|
|
protected function _getArgument(array $array, $key, $defaultValue = null)
|
|
{
|
|
return isset($array[$key]) ? $array[$key] : $defaultValue;
|
|
}
|
|
|
|
/**
|
|
* Retrieve item id
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getId()
|
|
{
|
|
return $this->_id;
|
|
}
|
|
|
|
/**
|
|
* Retrieve item target
|
|
*
|
|
* @return string|null
|
|
* @since 100.2.0
|
|
*/
|
|
public function getTarget()
|
|
{
|
|
return $this->target;
|
|
}
|
|
|
|
/**
|
|
* Check whether item has subnodes
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasChildren()
|
|
{
|
|
return (null !== $this->_submenu) && (bool)$this->_submenu->count();
|
|
}
|
|
|
|
/**
|
|
* Retrieve submenu
|
|
*
|
|
* @return Menu
|
|
*/
|
|
public function getChildren()
|
|
{
|
|
if (!$this->_submenu) {
|
|
$this->_submenu = $this->_menuFactory->create();
|
|
}
|
|
return $this->_submenu;
|
|
}
|
|
|
|
/**
|
|
* Retrieve menu item url
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getUrl()
|
|
{
|
|
if ((bool)$this->_action) {
|
|
return $this->_urlModel->getUrl((string)$this->_action, ['_cache_secret_key' => true]);
|
|
}
|
|
return '#';
|
|
}
|
|
|
|
/**
|
|
* Retrieve menu item action
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getAction()
|
|
{
|
|
return $this->_action;
|
|
}
|
|
|
|
/**
|
|
* Set Item action
|
|
*
|
|
* @param string $action
|
|
* @return $this
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function setAction($action)
|
|
{
|
|
$this->_validator->validateParam('action', $action);
|
|
$this->_action = $action;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Check whether item has javascript callback on click
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasClickCallback()
|
|
{
|
|
return $this->getUrl() == '#';
|
|
}
|
|
|
|
/**
|
|
* Retrieve item click callback
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getClickCallback()
|
|
{
|
|
if ($this->getUrl() == '#') {
|
|
return 'return false;';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Retrieve tooltip text title
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getTitle()
|
|
{
|
|
return $this->_title;
|
|
}
|
|
|
|
/**
|
|
* Set Item title
|
|
*
|
|
* @param string $title
|
|
* @return $this
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function setTitle($title)
|
|
{
|
|
$this->_validator->validateParam('title', $title);
|
|
$this->_title = $title;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Check whether item has tooltip text
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasTooltip()
|
|
{
|
|
return (bool)$this->_tooltip;
|
|
}
|
|
|
|
/**
|
|
* Retrieve item tooltip text
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getTooltip()
|
|
{
|
|
return $this->_tooltip;
|
|
}
|
|
|
|
/**
|
|
* Set Item tooltip
|
|
*
|
|
* @param string $tooltip
|
|
* @return $this
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function setTooltip($tooltip)
|
|
{
|
|
$this->_validator->validateParam('toolTip', $tooltip);
|
|
$this->_tooltip = $tooltip;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set Item module
|
|
*
|
|
* @param string $module
|
|
* @return $this
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function setModule($module)
|
|
{
|
|
$this->_validator->validateParam('module', $module);
|
|
$this->_moduleName = $module;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set Item module dependency
|
|
*
|
|
* @param string $moduleName
|
|
* @return $this
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function setModuleDependency($moduleName)
|
|
{
|
|
$this->_validator->validateParam('dependsOnModule', $moduleName);
|
|
$this->_dependsOnModule = $moduleName;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set Item config dependency
|
|
*
|
|
* @param string $configPath
|
|
* @return $this
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public function setConfigDependency($configPath)
|
|
{
|
|
$this->_validator->validateParam('dependsOnConfig', $configPath);
|
|
$this->_dependsOnConfig = $configPath;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Check whether item is disabled. Disabled items are not shown to user
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isDisabled()
|
|
{
|
|
return !$this->_moduleManager->isOutputEnabled(
|
|
$this->_moduleName
|
|
) || !$this->_isModuleDependenciesAvailable() || !$this->_isConfigDependenciesAvailable();
|
|
}
|
|
|
|
/**
|
|
* Check whether module that item depends on is active
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function _isModuleDependenciesAvailable()
|
|
{
|
|
if ($this->_dependsOnModule) {
|
|
$module = $this->_dependsOnModule;
|
|
return $this->_moduleList->has($module);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Check whether config dependency is available
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function _isConfigDependenciesAvailable()
|
|
{
|
|
if ($this->_dependsOnConfig) {
|
|
return $this->_scopeConfig->isSetFlag((string)$this->_dependsOnConfig, ScopeInterface::SCOPE_STORE);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Check whether item is allowed to the user
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isAllowed()
|
|
{
|
|
try {
|
|
return $this->_acl->isAllowed((string)$this->_resource);
|
|
} catch (\Exception $e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get menu item data represented as an array
|
|
*
|
|
* @return array
|
|
* @since 100.2.0
|
|
*/
|
|
public function toArray()
|
|
{
|
|
return [
|
|
'parent_id' => $this->_parentId,
|
|
'module' => $this->_moduleName,
|
|
'sort_index' => $this->_sortIndex,
|
|
'dependsOnConfig' => $this->_dependsOnConfig,
|
|
'id' => $this->_id,
|
|
'resource' => $this->_resource,
|
|
'path' => $this->_path,
|
|
'action' => $this->_action,
|
|
'dependsOnModule' => $this->_dependsOnModule,
|
|
'toolTip' => $this->_tooltip,
|
|
'title' => $this->_title,
|
|
'target' => $this->target,
|
|
'sub_menu' => isset($this->_submenu) ? $this->_submenu->toArray() : null
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Populate the menu item with data from array
|
|
*
|
|
* @param array $data
|
|
* @return void
|
|
* @since 100.2.0
|
|
*/
|
|
public function populateFromArray(array $data)
|
|
{
|
|
$this->_parentId = $this->_getArgument($data, 'parent_id');
|
|
$this->_moduleName = $this->_getArgument($data, 'module', 'Magento_Backend');
|
|
$this->_sortIndex = $this->_getArgument($data, 'sort_index');
|
|
$this->_dependsOnConfig = $this->_getArgument($data, 'dependsOnConfig');
|
|
$this->_id = $this->_getArgument($data, 'id');
|
|
$this->_resource = $this->_getArgument($data, 'resource');
|
|
$this->_path = $this->_getArgument($data, 'path', '');
|
|
$this->_action = $this->_getArgument($data, 'action');
|
|
$this->_dependsOnModule = $this->_getArgument($data, 'dependsOnModule');
|
|
$this->_tooltip = $this->_getArgument($data, 'toolTip');
|
|
$this->_title = $this->_getArgument($data, 'title');
|
|
$this->target = $this->_getArgument($data, 'target');
|
|
$this->_submenu = null;
|
|
if (isset($data['sub_menu'])) {
|
|
$menu = $this->_menuFactory->create();
|
|
$menu->populateFromArray($data['sub_menu']);
|
|
$this->_submenu = $menu;
|
|
}
|
|
}
|
|
}
|