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.
 
 
 

230 lines
8.5 KiB

<?php
namespace Wms\Menu\Classes;
use Backend\Classes\SideMenuItem;
use Backend\Models\User;
use System\Classes\PluginManager;
class Extend
{
/**
* @var User
*/
protected static $user;
/**
* @var PluginManager
*/
protected static $manager;
protected static $icon;
protected static $defaultMenuName;
protected static $navigation = [
'first' => null,
'sideMenu' => [],
'subMenus' => [],
'permissions' => [],
];
/**
* @param PluginManager $pluginManager
* @param string $defaultMenuName
* @param string $defaultIcon
* @return array
*/
public static function collectNavigation(string $defaultMenuName, string $defaultIcon): array
{
self::$manager = PluginManager::instance();
self::$defaultMenuName = $defaultMenuName;
self::$icon = $defaultIcon;
self::$user = \BackendAuth::getUser();
$navigation = self::getPluginsNavigation();
self::removeOrder($navigation);
if (!$navCount = count($navigation)) {
return [null, null];
}
foreach ($navigation as $group => $pages) {
if ($group == '{default_name}') {
$group = self::$defaultMenuName;
}
foreach ($pages as $name => $page) {
if ($page) {
self::$navigation['sideMenu'][$name] = [
'label' => isset($page['label']) ? $page['label'] : 'wms.menu::lang.no-name',
'url' => isset($page['url']) ? $page['url'] : '#',
'icon' => isset($page['icon']) ? $page['icon'] : 'icon-leaf',
'attributes' => [
'group' => $group,
'icon_base64' => isset($page['icon_base64']) ? $page['icon_base64'] : '',
'icon_base64_minimized' => isset($page['icon_base64_minimized']) ? $page['icon_base64_minimized'] : '',
'keywords' => isset($page['keywords']) ? $page['keywords'] : '',
'description' => isset($page['description']) ? $page['description'] : ''
],
'permissions' => isset($page['permissions']) ? $page['permissions'] : ['wms.*'],
];
/**
* @see SideMenuItem::createFromArray()
*/
}
}
}
return [
self::$navigation,
self::$defaultMenuName,
];
}
protected static function removeOrder(&$array, $name = null)
{
if ($name && isset($array['subMenu']) && is_array($array['subMenu'])) {
$subPermissions = [];
$subFirst = null;
$subCount = 0;
foreach ($array['subMenu'] as $subGroup => $subMenu) {
if ($subGroup == '{default_name}') {
$subGroup = self::$defaultMenuName;
}
foreach ($subMenu as $subName => $subPage) {
$subPermission = isset($subPage['permissions']) ? $subPage['permissions'] : ['wms.*'];
if (!is_array($subPermission)) {
$subPermission = [$subPermission];
}
$hasPermissions = false;
foreach ($subPermission as $perm) {
$hasPermissions = $hasPermissions || self::$user->hasPermission($perm);
}
if ($hasPermissions) {
$subUrl = isset($subPage['url']) ? $subPage['url'] : '#';
foreach ($subPermission as $perm) {
$subPermissions[$perm] = true;
}
if (!$subFirst && isset($subPage['first']) && $subPage['first'] && self::$user->hasPermission($subPermission)) {
$subFirst = $subUrl;
}
self::$navigation['subMenus'][$name][$subGroup][$subName] = [
'label' => isset($subPage['label']) ? $subPage['label'] : 'wms.menu::lang.no-name',
'group' => $subGroup,
'url' => $subUrl,
'icon' => isset($subPage['icon']) ? $subPage['icon'] : 'icon-leaf',
'icon_base64' => isset($subPage['icon_base64']) ? $subPage['icon_base64'] : '',
'icon_base64_minimized' => isset($subPage['icon_base64_minimized']) ? $subPage['icon_base64_minimized'] : '',
'permissions' => $subPermission,
];
$subCount++;
}
}
}
$subFirst = $subFirst ?: \Backend::url("wms/menu/$name");
if ($subFirst && $subCount) {
$array['url'] = $subFirst;
$array['permissions'] = array_keys($subPermissions);
unset($array['subMenu']);
} else {
$array = [];
}
}
foreach ($array as $key => $val) {
if (is_array($array[$key])) {
if (isset($array[$key]['order'])) {
unset($array[$key]['order']);
}
self::removeOrder($array[$key], $key);
}
}
if (isset($array['first']) && $array['first']) {
unset($array['first']);
if (!self::$navigation['first']) {
self::$navigation['first'] = self::getFirstUrl($array);
}
}
if (isset($array['permissions'])) {
foreach ($array['permissions'] as $permission) {
self::$navigation['permissions'][$permission] = true;
}
}
}
protected static function getFirstUrl($field)
{
if (!isset($field['url'])) {
return null;
}
$url = null;
if (isset($field['permissions'])) {
$hasPermissions = false;
if (!is_array($field['permissions'])) {
$field['permissions'] = [$field['permissions']];
}
foreach ($field['permissions'] as $permission) {
$hasPermissions = $hasPermissions || self::$user->hasPermission($permission);
}
if ($hasPermissions) {
$url = $field['url'];
}
} else {
$url = $field['url'];
}
return $url;
}
protected static function getPluginsNavigation()
{
$navigation = [];
foreach (self::$manager->getRegistrationMethodValues('addToMainNavigation') as $plugin => $subNavigation) {
if (empty($subNavigation)) {
continue;
}
$class = str_replace('.', '\\', $plugin) . '\Plugin';
if (defined($class . '::DEFAULT_MENU_NAME') && !empty($class::DEFAULT_MENU_NAME)) {
self::$defaultMenuName = $class::DEFAULT_MENU_NAME;
}
$details = self::$manager->getRegistrationMethodValues('pluginDetails');
if (isset($details[$plugin]['icon'])) {
$defaultIcon = $details[$plugin]['icon'];
} else {
$defaultIcon = self::$icon;
}
foreach ($subNavigation as $group => $pages) {
foreach ($pages as $name => $page) {
if (is_array($page)) {
if (!isset($page['icon'])) {
$subNavigation[$group][$name]['icon'] = $defaultIcon;
}
}
}
}
self::arrayMerge($navigation, $subNavigation);
}
return $navigation;
}
protected static function arrayMerge(&$array, $merge)
{
foreach ($merge as $key => $val) {
if (!is_array($val)) {
$array[$key] = $val;
} else {
if (!isset($array[$key])) {
$array[$key] = [];
}
self::arrayMerge($array[$key], $merge[$key]);
}
}
uasort($array, function(&$arr1, &$arr2) {
$order1 = isset($arr1['order']) ? $arr1['order'] : -1;
$order2 = isset($arr2['order']) ? $arr2['order'] : -1;
return $order1 == $order2 ? 0 : ($order1 < $order2 ? -1 : 1);
});
}
}