|
Apache/2.4.41 (Ubuntu) Linux vmi616275.contaboserver.net 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 uid=33(www-data) gid=33(www-data) groups=33(www-data) server ip : 62.171.164.128 | your ip : 127.0.0.1 safemode OFF > / home / dev2.destoffenstraat.com / app / code / Glace / Lib01 / Plugin / Backend / Model / Menu / |
Filename | /home/dev2.destoffenstraat.com/app/code/Glace/Lib01/Plugin/Backend/Model/Menu/Builder.php |
Size | 11.86 kb |
Permission | rwxrwxrwx |
Owner | root : root |
Create time | 17-Aug-2025 10:26 |
Last modified | 06-Apr-2021 18:06 |
Last accessed | 24-Aug-2025 02:07 |
Actions | edit | rename | delete | download (gzip) |
View | text | code | image |
<?php
/**
* @author Glace Team
* @copyright Copyright (c) 2019 Glace (https://www.glace.com)
* @package Glace_Lib01
*/
namespace Glace\Lib01\Plugin\Backend\Model\Menu;
use Magento\Backend\Model\Menu;
use Magento\Framework\DataObjectFactory as ObjectFactory;
use Magento\Store\Model\ScopeInterface;
class Builder
{
const LIB01_MENU = 'MenuGlace_Lib01::menu';
const SEO_PARAMS = '?utm_source=extension&utm_medium=backend&utm_campaign=common_menu_to_guide';
const SETTING_ENABLE = 'glace_lib01/menu/enable';
/**
* @var Menu\Config
*/
private $menuConfig;
/**
* @var array|null
*/
private $glaceItems = null;
/**
* @var Menu\Filter\IteratorFactory
*/
private $iteratorFactory;
/**
* @var \Magento\Backend\Model\Menu\ItemFactory
*/
private $itemFactory;
/**
* @var \Magento\Framework\Module\ModuleListInterface
*/
private $moduleList;
/**
* @var \Glace\Lib01\Helper\Module
*/
private $moduleHelper;
/**
* @var \Magento\Config\Model\Config\Structure
*/
private $configStructure;
/**
* @var ObjectFactory
*/
private $objectFactory;
/**
* @var \Magento\Framework\App\ProductMetadataInterface
*/
private $metadata;
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
private $scopeConfig;
public function __construct(
\Magento\Backend\Model\Menu\Config $menuConfig,
\Magento\Backend\Model\Menu\Filter\IteratorFactory $iteratorFactory,
\Magento\Backend\Model\Menu\ItemFactory $itemFactory,
\Magento\Framework\Module\ModuleListInterface $moduleList,
\Glace\Lib01\Helper\Module $moduleHelper,
\Magento\Config\Model\Config\Structure $configStructure,
\Magento\Framework\App\ProductMetadataInterface $metadata,
ObjectFactory $objectFactory,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
) {
$this->menuConfig = $menuConfig;
$this->iteratorFactory = $iteratorFactory;
$this->itemFactory = $itemFactory;
$this->moduleList = $moduleList;
$this->moduleHelper = $moduleHelper;
$this->configStructure = $configStructure;
$this->objectFactory = $objectFactory;
$this->metadata = $metadata;
$this->scopeConfig = $scopeConfig;
}
/**
* @param $subject
* @param Menu $menu
*
* @return Menu
*/
public function afterGetResult($subject, Menu $menu)
{
try {
$menu = $this->observeMenu($menu);
} catch (\Exception $ex) {
//do nothing - do not show our menu
}
return $menu;
}
/**
* @param Menu $menu
*
* @return Menu
*/
private function observeMenu(Menu $menu)
{
$item = $menu->get(self::LIB01_MENU);
if (!$item) {
return $menu;
}
if (version_compare($this->metadata->getVersion(), '2.2.0', '<')
|| !$this->scopeConfig->isSetFlag(self::SETTING_ENABLE, ScopeInterface::SCOPE_STORE)
) {
$menu->remove(self::LIB01_MENU);
return $menu;
}
$origMenu = $this->menuConfig->getMenu();
$menuItems = $this->getMenuItems($origMenu);
$configItems = $this->getConfigItems();
foreach ($this->getInstalledModules($configItems) as $title => $installedModule) {
$itemsToAdd = [];
$moduleInfo = $this->moduleHelper->getFeedModuleData($installedModule);
if (isset($menuItems[$installedModule])) {
$this->cloneMenuItems($menuItems[$installedModule], $itemsToAdd, $menu);
}
if (isset($configItems[$installedModule]['id'])) {
$glaceItem = $this->generateMenuItem(
$installedModule . '::menuconfig',
$installedModule,
self::LIB01_MENU,
'adminhtml/system_config/edit/section/' . $configItems[$installedModule]['id'],
__('Configuration')->render()
);
$itemsToAdd[] = $glaceItem;
}
if (isset($moduleInfo['guide']) && $moduleInfo['guide']) {
$glaceItem = $this->generateMenuItem(
$installedModule . '::menuguide',
$installedModule,
self::LIB01_MENU,
'adminhtml/system_config/edit/section/glacelib01',
__('User Guide')->render()
);
$itemsToAdd[] = $glaceItem;
}
if ($itemsToAdd) {
$itemId = $installedModule . '::container';
/** @var \Magento\Backend\Model\Menu\Item $module */
$module = $this->itemFactory->create(
[
'data' => [
'id' => $itemId,
'title' => $title,
'module' => $installedModule,
'resource' => self::LIB01_MENU
]
]
);
$menu->add($module, self::LIB01_MENU, 1);
foreach ($itemsToAdd as $copy) {
if ($copy) {
$menu->add($copy, $itemId, null);
}
}
}
}
return $menu;
}
/**
* @param array $menuItems
* @param array $itemsToAdd
* @param Menu $menu
*/
private function cloneMenuItems($menuItems, &$itemsToAdd, Menu $menu)
{
foreach ($menuItems as $link) {
$glaceItem = $menu->get($link);
if ($glaceItem) {
$itemData = $glaceItem->toArray();
if (isset($itemData['id'])
&& isset($itemData['resource'])
&& isset($itemData['action'])
&& isset($itemData['title'])
) {
$module = isset($itemData['module']) ? $itemData['module'] : explode('::', $itemData['resource'])[0];
$itemsToAdd[] = $this->generateMenuItem(
$itemData['id'] . 'menu',
$module,
$itemData['resource'],
$itemData['action'],
$itemData['title']
);
}
}
}
}
/**
* @param $id
* @param $installedModule
* @param $resource
* @param $url
* @param $title
*
* @return bool|Menu\Item
*/
private function generateMenuItem($id, $installedModule, $resource, $url, $title)
{
try {
$item = $this->itemFactory->create(
[
'data' => [
'id' => $id,
'title' => $title,
'module' => $installedModule,
'action' => $url,
'resource' => $resource
]
]
);
} catch (\Exception $ex) {
$item = false;
}
return $item;
}
/**
* @param $configItems
*
* @return array
*/
private function getInstalledModules($configItems)
{
$installed = [];
$modules = $this->moduleList->getNames();
$dispatchResult = $this->objectFactory->create(['data' => $modules]);
$modules = $dispatchResult->toArray();
foreach ($modules as $moduleName) {
if (strstr($moduleName, 'Glace_') === false
|| $moduleName === 'Glace_Lib01'
|| in_array($moduleName, $this->moduleHelper->getRestrictedModules())
) {
continue;
}
$title = (isset($configItems[$moduleName]['label']) && $configItems[$moduleName]['label'])
? $configItems[$moduleName]['label']
: $this->getModuleTitle($moduleName);
$installed[$title] = $moduleName;
}
ksort($installed);
return $installed;
}
/**
* @param Menu $menu
*
* @return array|null
*/
private function getMenuItems(Menu $menu)
{
if ($this->glaceItems === null) {
$all = $this->generateGlaceItems($menu);
$this->glaceItems = [];
foreach ($all as $item) {
$name = explode('::', $item);
$name = $name[0];
if (!isset($this->glaceItems[$name])) {
$this->glaceItems[$name] = [];
}
$this->glaceItems[$name][] = $item;
}
}
return $this->glaceItems;
}
/**
* @return array
*/
private function getConfigItems()
{
$configItems = [];
$config = $this->generateConfigItems();
foreach ($config as $item => $section) {
$name = explode('::', $item);
$name = $name[0];
if (!isset($configItems[$name])) {
$configItems[$name] = [];
}
$configItems[$name] = $section;
}
return $configItems;
}
/**
* @return array
*/
private function generateGlaceItems($menu)
{
$glace = [];
foreach ($this->getMenuIterator($menu) as $menuItem) {
$menuId = $menuItem->getId();
if (strpos($menuId, 'Glace') !== false
&& strpos($menuId, 'Glace_Lib01') === false
&& ($menuItem->getAction() && strpos($menuItem->getAction(), 'system_config') === false)
) {
$glace[] = $menuId;
}
if ($menuItem->hasChildren()) {
$glace = array_merge($glace, $this->generateGlaceItems($menuItem->getChildren()));
}
}
return $glace;
}
/**
* Get menu filter iterator
*
* @param \Magento\Backend\Model\Menu $menu
*
* @return \Magento\Backend\Model\Menu\Filter\Iterator
*/
private function getMenuIterator($menu)
{
return $this->iteratorFactory->create(['iterator' => $menu->getIterator()]);
}
/**
* @param $name
*
* @return string
*/
private function getModuleTitle($name)
{
$result = $name;
$module = $this->moduleHelper->getFeedModuleData($name);
if ($module && isset($module['name'])) {
$result = $module['name'];
$result = str_replace(' for Magento 2', '', $result);
} else {
$result = str_replace('Glace_', '', $result);
preg_match_all('/((?:^|[A-Z])[a-z]+)/', $result, $matches);
if (isset($matches[1]) && $matches[1]) {
$result = implode(' ', $matches[1]);
}
}
return $result;
}
private function generateConfigItems()
{
$result = [];
$configTabs = $this->configStructure->getTabs();
$config = $this->findResourceChildren($configTabs, 'glace');
if ($config) {
foreach ($config as $item) {
$data = $item->getData('resource');
if (isset($data['resource'])
&& isset($data['id'])
&& $data['id']
) {
$result[$data['resource']] = $data;
}
}
}
return $result;
}
/**
* @param $config
* @param $name
*
* @return array
*/
private function findResourceChildren($config, $name)
{
$result = [];
$currentNode = null;
foreach ($config as $key => $node) {
if ($node->getId() == $name) {
$currentNode = $node;
break;
}
}
if ($currentNode) {
$result = $currentNode->getChildren();
}
return $result;
}
}
/**
* @author Glace Team
* @copyright Copyright (c) 2019 Glace (https://www.glace.com)
* @package Glace_Lib01
*/
namespace Glace\Lib01\Plugin\Backend\Model\Menu;
use Magento\Backend\Model\Menu;
use Magento\Framework\DataObjectFactory as ObjectFactory;
use Magento\Store\Model\ScopeInterface;
class Builder
{
const LIB01_MENU = 'MenuGlace_Lib01::menu';
const SEO_PARAMS = '?utm_source=extension&utm_medium=backend&utm_campaign=common_menu_to_guide';
const SETTING_ENABLE = 'glace_lib01/menu/enable';
/**
* @var Menu\Config
*/
private $menuConfig;
/**
* @var array|null
*/
private $glaceItems = null;
/**
* @var Menu\Filter\IteratorFactory
*/
private $iteratorFactory;
/**
* @var \Magento\Backend\Model\Menu\ItemFactory
*/
private $itemFactory;
/**
* @var \Magento\Framework\Module\ModuleListInterface
*/
private $moduleList;
/**
* @var \Glace\Lib01\Helper\Module
*/
private $moduleHelper;
/**
* @var \Magento\Config\Model\Config\Structure
*/
private $configStructure;
/**
* @var ObjectFactory
*/
private $objectFactory;
/**
* @var \Magento\Framework\App\ProductMetadataInterface
*/
private $metadata;
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
private $scopeConfig;
public function __construct(
\Magento\Backend\Model\Menu\Config $menuConfig,
\Magento\Backend\Model\Menu\Filter\IteratorFactory $iteratorFactory,
\Magento\Backend\Model\Menu\ItemFactory $itemFactory,
\Magento\Framework\Module\ModuleListInterface $moduleList,
\Glace\Lib01\Helper\Module $moduleHelper,
\Magento\Config\Model\Config\Structure $configStructure,
\Magento\Framework\App\ProductMetadataInterface $metadata,
ObjectFactory $objectFactory,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
) {
$this->menuConfig = $menuConfig;
$this->iteratorFactory = $iteratorFactory;
$this->itemFactory = $itemFactory;
$this->moduleList = $moduleList;
$this->moduleHelper = $moduleHelper;
$this->configStructure = $configStructure;
$this->objectFactory = $objectFactory;
$this->metadata = $metadata;
$this->scopeConfig = $scopeConfig;
}
/**
* @param $subject
* @param Menu $menu
*
* @return Menu
*/
public function afterGetResult($subject, Menu $menu)
{
try {
$menu = $this->observeMenu($menu);
} catch (\Exception $ex) {
//do nothing - do not show our menu
}
return $menu;
}
/**
* @param Menu $menu
*
* @return Menu
*/
private function observeMenu(Menu $menu)
{
$item = $menu->get(self::LIB01_MENU);
if (!$item) {
return $menu;
}
if (version_compare($this->metadata->getVersion(), '2.2.0', '<')
|| !$this->scopeConfig->isSetFlag(self::SETTING_ENABLE, ScopeInterface::SCOPE_STORE)
) {
$menu->remove(self::LIB01_MENU);
return $menu;
}
$origMenu = $this->menuConfig->getMenu();
$menuItems = $this->getMenuItems($origMenu);
$configItems = $this->getConfigItems();
foreach ($this->getInstalledModules($configItems) as $title => $installedModule) {
$itemsToAdd = [];
$moduleInfo = $this->moduleHelper->getFeedModuleData($installedModule);
if (isset($menuItems[$installedModule])) {
$this->cloneMenuItems($menuItems[$installedModule], $itemsToAdd, $menu);
}
if (isset($configItems[$installedModule]['id'])) {
$glaceItem = $this->generateMenuItem(
$installedModule . '::menuconfig',
$installedModule,
self::LIB01_MENU,
'adminhtml/system_config/edit/section/' . $configItems[$installedModule]['id'],
__('Configuration')->render()
);
$itemsToAdd[] = $glaceItem;
}
if (isset($moduleInfo['guide']) && $moduleInfo['guide']) {
$glaceItem = $this->generateMenuItem(
$installedModule . '::menuguide',
$installedModule,
self::LIB01_MENU,
'adminhtml/system_config/edit/section/glacelib01',
__('User Guide')->render()
);
$itemsToAdd[] = $glaceItem;
}
if ($itemsToAdd) {
$itemId = $installedModule . '::container';
/** @var \Magento\Backend\Model\Menu\Item $module */
$module = $this->itemFactory->create(
[
'data' => [
'id' => $itemId,
'title' => $title,
'module' => $installedModule,
'resource' => self::LIB01_MENU
]
]
);
$menu->add($module, self::LIB01_MENU, 1);
foreach ($itemsToAdd as $copy) {
if ($copy) {
$menu->add($copy, $itemId, null);
}
}
}
}
return $menu;
}
/**
* @param array $menuItems
* @param array $itemsToAdd
* @param Menu $menu
*/
private function cloneMenuItems($menuItems, &$itemsToAdd, Menu $menu)
{
foreach ($menuItems as $link) {
$glaceItem = $menu->get($link);
if ($glaceItem) {
$itemData = $glaceItem->toArray();
if (isset($itemData['id'])
&& isset($itemData['resource'])
&& isset($itemData['action'])
&& isset($itemData['title'])
) {
$module = isset($itemData['module']) ? $itemData['module'] : explode('::', $itemData['resource'])[0];
$itemsToAdd[] = $this->generateMenuItem(
$itemData['id'] . 'menu',
$module,
$itemData['resource'],
$itemData['action'],
$itemData['title']
);
}
}
}
}
/**
* @param $id
* @param $installedModule
* @param $resource
* @param $url
* @param $title
*
* @return bool|Menu\Item
*/
private function generateMenuItem($id, $installedModule, $resource, $url, $title)
{
try {
$item = $this->itemFactory->create(
[
'data' => [
'id' => $id,
'title' => $title,
'module' => $installedModule,
'action' => $url,
'resource' => $resource
]
]
);
} catch (\Exception $ex) {
$item = false;
}
return $item;
}
/**
* @param $configItems
*
* @return array
*/
private function getInstalledModules($configItems)
{
$installed = [];
$modules = $this->moduleList->getNames();
$dispatchResult = $this->objectFactory->create(['data' => $modules]);
$modules = $dispatchResult->toArray();
foreach ($modules as $moduleName) {
if (strstr($moduleName, 'Glace_') === false
|| $moduleName === 'Glace_Lib01'
|| in_array($moduleName, $this->moduleHelper->getRestrictedModules())
) {
continue;
}
$title = (isset($configItems[$moduleName]['label']) && $configItems[$moduleName]['label'])
? $configItems[$moduleName]['label']
: $this->getModuleTitle($moduleName);
$installed[$title] = $moduleName;
}
ksort($installed);
return $installed;
}
/**
* @param Menu $menu
*
* @return array|null
*/
private function getMenuItems(Menu $menu)
{
if ($this->glaceItems === null) {
$all = $this->generateGlaceItems($menu);
$this->glaceItems = [];
foreach ($all as $item) {
$name = explode('::', $item);
$name = $name[0];
if (!isset($this->glaceItems[$name])) {
$this->glaceItems[$name] = [];
}
$this->glaceItems[$name][] = $item;
}
}
return $this->glaceItems;
}
/**
* @return array
*/
private function getConfigItems()
{
$configItems = [];
$config = $this->generateConfigItems();
foreach ($config as $item => $section) {
$name = explode('::', $item);
$name = $name[0];
if (!isset($configItems[$name])) {
$configItems[$name] = [];
}
$configItems[$name] = $section;
}
return $configItems;
}
/**
* @return array
*/
private function generateGlaceItems($menu)
{
$glace = [];
foreach ($this->getMenuIterator($menu) as $menuItem) {
$menuId = $menuItem->getId();
if (strpos($menuId, 'Glace') !== false
&& strpos($menuId, 'Glace_Lib01') === false
&& ($menuItem->getAction() && strpos($menuItem->getAction(), 'system_config') === false)
) {
$glace[] = $menuId;
}
if ($menuItem->hasChildren()) {
$glace = array_merge($glace, $this->generateGlaceItems($menuItem->getChildren()));
}
}
return $glace;
}
/**
* Get menu filter iterator
*
* @param \Magento\Backend\Model\Menu $menu
*
* @return \Magento\Backend\Model\Menu\Filter\Iterator
*/
private function getMenuIterator($menu)
{
return $this->iteratorFactory->create(['iterator' => $menu->getIterator()]);
}
/**
* @param $name
*
* @return string
*/
private function getModuleTitle($name)
{
$result = $name;
$module = $this->moduleHelper->getFeedModuleData($name);
if ($module && isset($module['name'])) {
$result = $module['name'];
$result = str_replace(' for Magento 2', '', $result);
} else {
$result = str_replace('Glace_', '', $result);
preg_match_all('/((?:^|[A-Z])[a-z]+)/', $result, $matches);
if (isset($matches[1]) && $matches[1]) {
$result = implode(' ', $matches[1]);
}
}
return $result;
}
private function generateConfigItems()
{
$result = [];
$configTabs = $this->configStructure->getTabs();
$config = $this->findResourceChildren($configTabs, 'glace');
if ($config) {
foreach ($config as $item) {
$data = $item->getData('resource');
if (isset($data['resource'])
&& isset($data['id'])
&& $data['id']
) {
$result[$data['resource']] = $data;
}
}
}
return $result;
}
/**
* @param $config
* @param $name
*
* @return array
*/
private function findResourceChildren($config, $name)
{
$result = [];
$currentNode = null;
foreach ($config as $key => $node) {
if ($node->getId() == $name) {
$currentNode = $node;
break;
}
}
if ($currentNode) {
$result = $currentNode->getChildren();
}
return $result;
}
}