dimti
5 years ago
commit
6784cecf5e
20 changed files with 824 additions and 0 deletions
-
1.gitignore
-
205Plugin.php
-
41README-RU.md
-
41README.md
-
11assets/css/_wms_extend_menu.css
-
218classes/Extend.php
-
27controllers/Index.php
-
14controllers/index/index.htm
-
16helpers/Menu.php
-
5lang/en/lang.php
-
8lang/en/plugin.php
-
5lang/ru/lang.php
-
8lang/ru/plugin.php
-
36partials/menu/main/_system_sidebar.phtml
-
52partials/menu/main/_system_sidebar_menu.phtml
-
14partials/menu/main/_system_sidebar_menu_toolbar.phtml
-
81partials/menu/secondary/_sidenav.phtml
-
31partials/menu/secondary/_sidenav_sidebar_menu.phtml
-
9routes.php
-
1updates/version.yaml
@ -0,0 +1 @@ |
|||||
|
.idea |
@ -0,0 +1,205 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Wms\Menu; |
||||
|
|
||||
|
use Backend\Classes\Controller as BackendController; |
||||
|
use Cms\Classes\Controller as CmsController; |
||||
|
use Cms\Classes\Page as CmsPage; |
||||
|
use System\Classes\PluginBase; |
||||
|
|
||||
|
/** |
||||
|
* Menu Plugin Information File |
||||
|
*/ |
||||
|
class Plugin extends PluginBase |
||||
|
{ |
||||
|
protected const ICON = 'icon-sliders'; |
||||
|
|
||||
|
/** |
||||
|
* @var CmsController |
||||
|
*/ |
||||
|
protected $cmsController; |
||||
|
protected $defaultMenuName = 'wms.menu::plugin.default-menu'; |
||||
|
protected $navigation = [ |
||||
|
'first' => null, |
||||
|
'sideMenu' => [], |
||||
|
'subMenus' => [], |
||||
|
'permissions' => [], |
||||
|
]; |
||||
|
|
||||
|
public function pluginDetails() |
||||
|
{ |
||||
|
return [ |
||||
|
'name' => 'wms.menu::plugin.name', |
||||
|
'description' => 'wms.menu::plugin.description', |
||||
|
'author' => 'WMStudio', |
||||
|
'icon' => self::ICON, |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
public function register() |
||||
|
{ |
||||
|
BackendController::extend(function($controller) { |
||||
|
/* @var $controller BackendController */ |
||||
|
$controller->addDynamicMethod('getMenu', function($name) { |
||||
|
return isset($this->navigation['subMenus'][$name]) ? $this->navigation['subMenus'][$name] : null; |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* Скрывает содержимое заголовка или после символа `, или между символами `` |
||||
|
* прим: |
||||
|
* "Заголовок `Скрытый тектс" |
||||
|
* "`Скрытый текст` Заголовок" |
||||
|
*/ |
||||
|
CmsPage::extend(function($page) { |
||||
|
/* @var $page CmsPage */ |
||||
|
$page->addDynamicMethod('getTitle', function($withHidden = false) use (&$page) { |
||||
|
$title = $page->title; |
||||
|
if (($pos = mb_strpos($title, '`')) === false) { |
||||
|
return $title; |
||||
|
} |
||||
|
if ($withHidden) { |
||||
|
return str_replace('`', '', $title); |
||||
|
} else { |
||||
|
$result = mb_substr($title, 0, $pos); |
||||
|
$title = mb_substr($title, $pos + 1); |
||||
|
if (($pos = mb_strpos($title, '`')) === false) { |
||||
|
return $result; |
||||
|
} |
||||
|
|
||||
|
return trim($result . mb_substr($title, $pos + 1)); |
||||
|
} |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
\Event::listen('cms.page.beforeRenderPage', function($controller, $page) { |
||||
|
/* @var $page CmsPage */ |
||||
|
$config = $page->theme->getConfig(); |
||||
|
$page->theme->menu = $this->getMenu(optional($config)['menu'] ?: [], !!optional($config)['pageTitleMoreImportant']); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public function registerNavigation() |
||||
|
{ |
||||
|
list($navigation, $defaultMenuName) = Classes\Extend::collectNavigation($this->defaultMenuName, self::ICON); |
||||
|
if ($navigation) { |
||||
|
$this->navigation = $navigation; |
||||
|
} |
||||
|
if ($defaultMenuName) { |
||||
|
$this->defaultMenuName = $defaultMenuName; |
||||
|
} |
||||
|
|
||||
|
$navigation = []; |
||||
|
if (count($this->navigation['sideMenu'])) { |
||||
|
\BackendMenu::registerContextSidenavPartial('Wms.Menu', 'main', '~/plugins/wms/menu/partials/menu/main/_system_sidebar.phtml'); |
||||
|
$navigation['main'] = [ |
||||
|
'label' => 'wms.menu::plugin.name', |
||||
|
'url' => $this->navigation['first'] ?: \Backend::url('wms/menu'), |
||||
|
'icon' => self::ICON, |
||||
|
'permissions' => array_keys($this->navigation['permissions']), |
||||
|
'order' => 999, // before CMS Settings
|
||||
|
'sideMenu' => $this->navigation['sideMenu'], |
||||
|
]; |
||||
|
|
||||
|
if (is_array($this->navigation['subMenus'])) { |
||||
|
foreach ($this->navigation['subMenus'] as $name => $menu) { |
||||
|
if (!isset($navigation[$name])) { |
||||
|
\BackendMenu::registerContextSidenavPartial('Wms.Menu', $name, '~/plugins/wms/menu/partials/menu/secondary/_sidenav.phtml'); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $navigation; |
||||
|
} |
||||
|
|
||||
|
protected function getPage($name, $title = null, $pageTitleMoreImportant = false, $active = null, $attributes = []) |
||||
|
{ |
||||
|
/* @var $page CmsPage */ |
||||
|
if (!$this->cmsController) { |
||||
|
$this->cmsController = CmsController::getController() ?: new CmsController; |
||||
|
} |
||||
|
|
||||
|
$page = CmsPage::find($name); |
||||
|
if (!$page) { |
||||
|
$result = [ |
||||
|
'url' => '#', |
||||
|
'name' => $title ?? $name, |
||||
|
'class' => optional($attributes)['class'], |
||||
|
'attributes' => $this->renderAttributes($attributes), |
||||
|
]; |
||||
|
} else { |
||||
|
$result = [ |
||||
|
'url' => $this->cmsController->pageUrl($name, false), |
||||
|
'name' => $pageTitleMoreImportant ? $page->getTitle(true) : (($title ?? $page->getTitle(true)) ?: $name), |
||||
|
'class' => optional($attributes)['class'], |
||||
|
'attributes' => $this->renderAttributes($attributes), |
||||
|
]; |
||||
|
} |
||||
|
$current = CmsPage::url(''); |
||||
|
if ($current == $result['url']) { |
||||
|
$result['active'] = true; |
||||
|
} elseif ($active) { |
||||
|
if (is_string($active) && $current == CmsPage::url($active)) { |
||||
|
$result['active'] = true; |
||||
|
} elseif (is_array($active)) { |
||||
|
$isActive = false; |
||||
|
foreach ($active as $page) { |
||||
|
if ($isActive) { |
||||
|
break; |
||||
|
} |
||||
|
if ($current == CmsPage::url($page)) { |
||||
|
$isActive = true; |
||||
|
} |
||||
|
} |
||||
|
if ($isActive) { |
||||
|
$result['active'] = true; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $result; |
||||
|
} |
||||
|
|
||||
|
protected function getMenu($menu, $pageTitleMoreImportant = true) |
||||
|
{ |
||||
|
$result = []; |
||||
|
foreach ($menu as $key => $value) { |
||||
|
if (!is_array($value)) { |
||||
|
$result[$key] = $this->getPage($key, $value, $pageTitleMoreImportant); |
||||
|
} else { |
||||
|
$result[$key] = $this->getPage( |
||||
|
$key, |
||||
|
optional($value)['name'], |
||||
|
$pageTitleMoreImportant, |
||||
|
optional($value)['active'], |
||||
|
optional($value)['attributes'] ?: [] |
||||
|
); |
||||
|
if (isset($value['url'])) { |
||||
|
$result[$key]['url'] = url($value['url']); |
||||
|
} |
||||
|
if (isset($value['pages'])) { |
||||
|
$result[$key]['pages'] = $this->getMenu($value['pages'], $pageTitleMoreImportant); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return $result; |
||||
|
} |
||||
|
|
||||
|
protected function renderAttributes($attributes) |
||||
|
{ |
||||
|
$result = ''; |
||||
|
foreach ($attributes as $name => $attribute) { |
||||
|
if ($name == 'class' || $name == 'href') { |
||||
|
continue; |
||||
|
} |
||||
|
$result .= "$name=\"$attribute\" ";
|
||||
|
} |
||||
|
if (strlen($result)) { |
||||
|
$result = substr($result, 0, -1); |
||||
|
} |
||||
|
|
||||
|
return $result; |
||||
|
} |
||||
|
} |
@ -0,0 +1,41 @@ |
|||||
|
# Menu plugin |
||||
|
Объединяет элементы меню из разных плагинов |
||||
|
|
||||
|
Для добавления пунктов меню добавьте в класс `Plugin` |
||||
|
|
||||
|
public function addToMainNavigation() |
||||
|
{ |
||||
|
return [ |
||||
|
'{tab_name}' => [ |
||||
|
'{name}' => [ |
||||
|
'label' => {label}, |
||||
|
'url' => {url}, |
||||
|
'permissions' => [{permission}, ...], |
||||
|
'icon' => {icon}, |
||||
|
'order' => {order}, |
||||
|
//'first' => true, |
||||
|
'subMenu' => [ |
||||
|
'{tab_name}' => [ |
||||
|
'{name}' => [ |
||||
|
'label' => {label}, |
||||
|
'url' => {url}, |
||||
|
'permissions' => [{permission}, ...], |
||||
|
'icon' => {icon}, |
||||
|
'order' => {order}, |
||||
|
], |
||||
|
... |
||||
|
], |
||||
|
... |
||||
|
], |
||||
|
... |
||||
|
], |
||||
|
... |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
Имя вкладки по умолчанию {default_name} |
||||
|
|
||||
|
Для изменения имени вкладки по умолчанию, в файле `Plugin.php`, объявите константу `DEFAULT_MENU_NAME` |
||||
|
|
||||
|
Если указан `первый` элемент, то он будет сразу открываться при клике на меню. |
||||
|
Если нет, то будет открыта страница меню или подменю. |
@ -0,0 +1,41 @@ |
|||||
|
# Menu plugin |
||||
|
Combines menu items from different plugins |
||||
|
|
||||
|
To add menu items add to class`Plugin` |
||||
|
|
||||
|
public function addToMainNavigation() |
||||
|
{ |
||||
|
return [ |
||||
|
'{tab_name}' => [ |
||||
|
'{name}' => [ |
||||
|
'label' => {label}, |
||||
|
'url' => {url}, |
||||
|
'permissions' => [{permission}, ...], |
||||
|
'icon' => {icon}, |
||||
|
'order' => {order}, |
||||
|
//'first' => true, |
||||
|
'subMenu' => [ |
||||
|
'{tab_name}' => [ |
||||
|
'{name}' => [ |
||||
|
'label' => {label}, |
||||
|
'url' => {url}, |
||||
|
'permissions' => [{permission}, ...], |
||||
|
'icon' => {icon}, |
||||
|
'order' => {order}, |
||||
|
], |
||||
|
... |
||||
|
], |
||||
|
... |
||||
|
], |
||||
|
... |
||||
|
], |
||||
|
... |
||||
|
]; |
||||
|
} |
||||
|
|
||||
|
Default tab name is {default_name} |
||||
|
|
||||
|
For change default tab name, in `Plugin.php` file, declare the constant `DEFAULT_MENU_NAME` |
||||
|
|
||||
|
If the `first` element is specified, it will immediately open when you click on the menu. |
||||
|
If not, the menu or submenu page will be opened. |
@ -0,0 +1,11 @@ |
|||||
|
@media (max-width: 768px) { |
||||
|
.layout-cell.layout-sidenav-container.wms-menu { |
||||
|
display: none; |
||||
|
} |
||||
|
.sidenav-tree-root .sidenav-tree .back-link.wms-menu-back-link { |
||||
|
display: block !important; |
||||
|
} |
||||
|
.layout-cell.layout-sidenav-container ~ .layout-cell.sidenav-tree { |
||||
|
border: none; |
||||
|
} |
||||
|
} |
@ -0,0 +1,218 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Wms\Menu\Classes; |
||||
|
|
||||
|
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', |
||||
|
'group' => $group, |
||||
|
'url' => isset($page['url']) ? $page['url'] : '#', |
||||
|
'icon' => isset($page['icon']) ? $page['icon'] : 'icon-leaf', |
||||
|
'permissions' => isset($page['permissions']) ? $page['permissions'] : ['wms.*'], |
||||
|
]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
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', |
||||
|
'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); |
||||
|
}); |
||||
|
} |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Wms\Menu\Controllers; |
||||
|
|
||||
|
use Backend\Classes\Controller; |
||||
|
|
||||
|
/** |
||||
|
* Settings controller |
||||
|
* |
||||
|
* @package october\system |
||||
|
* @author Alexey Bobkov, Samuel Georges |
||||
|
* |
||||
|
*/ |
||||
|
class Index extends Controller |
||||
|
{ |
||||
|
public function __construct() |
||||
|
{ |
||||
|
parent::__construct(); |
||||
|
\BackendMenu::setContext('Wms.Menu', 'main'); |
||||
|
} |
||||
|
|
||||
|
public function index() |
||||
|
{ |
||||
|
$this->pageTitle = 'wms.menu::plugin.name'; |
||||
|
$this->bodyClass = 'compact-container sidenav-tree-root'; |
||||
|
} |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
<div class="layout"> |
||||
|
<div class="layout-cell oc-logo-transparent"> |
||||
|
<script> |
||||
|
$(document).ready(function() { |
||||
|
var $search = $('#settings-search-input'), |
||||
|
focusSearch = function() { |
||||
|
setTimeout(function() { $search.focus().select() }, 10) |
||||
|
}; |
||||
|
$search.on('blur', focusSearch); |
||||
|
focusSearch() |
||||
|
}) |
||||
|
</script> |
||||
|
</div> |
||||
|
</div> |
@ -0,0 +1,16 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Wms\Menu\Helpers; |
||||
|
|
||||
|
class Menu |
||||
|
{ |
||||
|
public static function setMainActive($sideMenuItemCode = null) |
||||
|
{ |
||||
|
\BackendMenu::setContext('Wms.Menu', 'main', $sideMenuItemCode); |
||||
|
} |
||||
|
|
||||
|
public static function setSubnavActive($mainMenuItemCode, $sideMenuItemCode = null) |
||||
|
{ |
||||
|
\BackendMenu::setContext('Wms.Menu', 'main', "$mainMenuItemCode|$sideMenuItemCode"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
'no-name' => 'No name', |
||||
|
]; |
@ -0,0 +1,8 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
'name' => 'Menu', |
||||
|
'description' => 'Combines menus from different plugins', |
||||
|
'default-menu' => 'Main', |
||||
|
'slogan' => 'In a secure future', |
||||
|
]; |
@ -0,0 +1,5 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
'no-name' => 'Без имени', |
||||
|
]; |
@ -0,0 +1,8 @@ |
|||||
|
<?php |
||||
|
|
||||
|
return [ |
||||
|
'name' => 'Меню', |
||||
|
'description' => 'Объединяет меню из разных плагинов', |
||||
|
'default-menu' => 'Основное', |
||||
|
'slogan' => 'В надежное будущее', |
||||
|
]; |
@ -0,0 +1,36 @@ |
|||||
|
<?php |
||||
|
$context = BackendMenu::getContext(); |
||||
|
if (strpos($context->sideMenuCode, '|') !== false) { |
||||
|
$menu = explode('|', $context->sideMenuCode); |
||||
|
$context->mainMenuCode = $menu[0]; |
||||
|
$context->sideMenuCode = $menu[1]; |
||||
|
} |
||||
|
if (isset($menu)): |
||||
|
?> |
||||
|
<?= $this->makePartial(__DIR__ . '/../secondary/_sidenav.phtml', [ |
||||
|
'context' => $context, |
||||
|
]) ?> |
||||
|
<?php else: ?> |
||||
|
<div class="layout-cell sidenav-tree bg-p" data-control="sidenav-tree" data-search-input="#settings-search-input"> |
||||
|
<a class="back-link" href="<?= Backend::url('wms/menu') ?>"><i class="icon-angle-left"></i><?= e(trans('wms.menu::plugin.name')) ?></a> |
||||
|
|
||||
|
<div class="layout"> |
||||
|
<div class="layout-row min-size"> |
||||
|
<?= $this->makePartial(__DIR__ . '/_system_sidebar_menu_toolbar.phtml') ?> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layout-row"> |
||||
|
<div class="layout-cell"> |
||||
|
<div class="layout-relative"> |
||||
|
|
||||
|
<div class="layout-absolute"> |
||||
|
<div class="control-scrollbar" data-control="scrollbar"> |
||||
|
<?= $this->makePartial(__DIR__ . '/_system_sidebar_menu.phtml') ?> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<?php endif; ?> |
@ -0,0 +1,52 @@ |
|||||
|
<?php |
||||
|
if ($sideMenuItems = BackendMenu::listSideMenuItems()): |
||||
|
$collapsedGroups = explode('|', |
||||
|
isset($_COOKIE['sidenav_treegroupStatus']) |
||||
|
? $_COOKIE['sidenav_treegroupStatus'] |
||||
|
: null |
||||
|
); |
||||
|
$categories = []; |
||||
|
foreach ($sideMenuItems as $sideItemCode => $item) { |
||||
|
if(!property_exists($item, 'group')) { |
||||
|
$item->group = 'default'; |
||||
|
} |
||||
|
if(!property_exists($item, 'keywords')) { |
||||
|
$item->keywords = ''; |
||||
|
} |
||||
|
if(!property_exists($item, 'description')) { |
||||
|
$item->description = ''; |
||||
|
} |
||||
|
$categories[$item->group][$sideItemCode] = $item; |
||||
|
} |
||||
|
?> |
||||
|
<ul class="top-level"> |
||||
|
<?php foreach ($categories as $category => $items): |
||||
|
$collapsed = in_array($category, $collapsedGroups); ?> |
||||
|
<li data-group-code="<?= e($category) ?>" <?= $collapsed ? 'data-status="collapsed"' : null ?>> |
||||
|
<div class="group"> |
||||
|
<h3><?= e(trans($category)); ?></h3> |
||||
|
</div> |
||||
|
<ul> |
||||
|
<?php foreach ($items as $item): |
||||
|
$last_path = array_last(explode('/', request()->path())); ?> |
||||
|
<li class="<?= |
||||
|
((BackendMenu::isSideMenuItemActive($item) && empty($item->scontents)) |
||||
|
|| ( |
||||
|
isset($item->scontents) |
||||
|
&& $item->scontents == $last_path |
||||
|
)) |
||||
|
? 'active' |
||||
|
: null; |
||||
|
?>" data-keywords="<?= e(trans($item->keywords)) ?>"> |
||||
|
<a href="<?= $item->url ?>"> |
||||
|
<i class="<?= $item->icon ?>"></i> |
||||
|
<span class="header"><?= e(trans($item->label)) ?></span> |
||||
|
<span class="description"><?= e(trans($item->description)) ?></span> |
||||
|
</a> |
||||
|
</li> |
||||
|
<?php endforeach ?> |
||||
|
</ul> |
||||
|
</li> |
||||
|
<?php endforeach ?> |
||||
|
</ul> |
||||
|
<?php endif; ?> |
@ -0,0 +1,14 @@ |
|||||
|
<div class="layout control-toolbar"> |
||||
|
<div class="layout-cell"> |
||||
|
<div class="relative toolbar-item loading-indicator-container size-input-text"> |
||||
|
<input placeholder="<?= e(trans('system::lang.settings.search')) ?>" type="text" name="search" value="" |
||||
|
class="form-control icon search" |
||||
|
id="settings-search-input" |
||||
|
autocomplete="off" |
||||
|
data-track-input |
||||
|
data-load-indicator |
||||
|
data-load-indicator-opaque |
||||
|
/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
@ -0,0 +1,81 @@ |
|||||
|
<?php |
||||
|
$mainMenuCode = 'main'; |
||||
|
$sideMainMenuItems = BackendMenu::listSideMenuItems(); |
||||
|
if (!isset($context)) { |
||||
|
$context = BackendMenu::getContext(); |
||||
|
} |
||||
|
?> |
||||
|
<?php if ($sideMainMenuItems): ?> |
||||
|
<div class="layout-cell layout-sidenav-container wms-menu"> |
||||
|
<div class="layout-relative"> |
||||
|
<nav |
||||
|
id="layout-sidenav" |
||||
|
class="layout-sidenav bg-p" |
||||
|
data-active-class="active" |
||||
|
data-control="sidenav"> |
||||
|
<ul class="nav"> |
||||
|
<?php foreach ($sideMainMenuItems as $sideItemCode => $item): ?> |
||||
|
<li |
||||
|
class="<?= $context->mainMenuCode == $sideItemCode ? 'active' : null ?>" |
||||
|
<?= Html::attributes($item->attributes) ?> |
||||
|
> |
||||
|
<a href="<?= $item->url ?>"> |
||||
|
<span class="nav-icon"> |
||||
|
<?php if ($item->iconSvg): ?> |
||||
|
<img class="svg-icon" src="<?= Url::asset($item->iconSvg) ?>"> |
||||
|
<?php endif ?> |
||||
|
|
||||
|
<i class="<?= $item->iconSvg ? 'svg-replace' : null ?> <?= $item->icon ?>"></i> |
||||
|
</span> |
||||
|
<span class="nav-label"> |
||||
|
<?= e(trans($item->label)) ?> |
||||
|
</span> |
||||
|
</a> |
||||
|
<span |
||||
|
class="counter <?= $item->counter === null ? 'empty' : null ?>" |
||||
|
data-menu-id="<?= e($mainMenuCode.'/'.$sideItemCode) ?>" |
||||
|
<?php if ($item->counterLabel): ?>title="<?= e(trans($item->counterLabel)) ?>"<?php endif ?> |
||||
|
> |
||||
|
<?= e($item->counter) ?> |
||||
|
</span> |
||||
|
</li> |
||||
|
<?php endforeach ?> |
||||
|
</ul> |
||||
|
</nav> |
||||
|
</div> |
||||
|
</div> |
||||
|
<?php endif ?> |
||||
|
<div class="layout-cell sidenav-tree bg-p" data-control="sidenav-tree" data-search-input="#settings-search-input"> |
||||
|
<a class="back-link" href="<?= Backend::url('wms/menu' . (empty($context->sideMenuCode) ? '' : "/{$context->mainMenuCode}")) ?>"> |
||||
|
<i class="icon-angle-left"></i><?= e(trans($context->mainMenuCode == $mainMenuCode || empty($context->sideMenuCode) |
||||
|
? 'wms.menu::plugin.name' |
||||
|
: "wms.site::lang.{$context->mainMenuCode}.title" |
||||
|
)) ?> |
||||
|
</a> |
||||
|
<div class="layout"> |
||||
|
<a class="back-link wms-menu-back-link" href="<?= Backend::url('wms/menu' . (empty($context->sideMenuCode) ? '' : "/{$context->mainMenuCode}")) ?>"> |
||||
|
<i class="icon-angle-left"></i><?= e(trans($context->mainMenuCode == $mainMenuCode || empty($context->sideMenuCode) |
||||
|
? 'wms.menu::plugin.name' |
||||
|
: "wms.site::lang.{$context->mainMenuCode}.title" |
||||
|
)) ?> |
||||
|
</a> |
||||
|
<div class="layout-row min-size"> |
||||
|
<?= $this->makePartial(__DIR__ . '/../main/_system_sidebar_menu_toolbar.phtml'); ?> |
||||
|
</div> |
||||
|
|
||||
|
<div class="layout-row"> |
||||
|
<div class="layout-cell"> |
||||
|
<div class="layout-relative"> |
||||
|
|
||||
|
<div class="layout-absolute"> |
||||
|
<div class="control-scrollbar" data-control="scrollbar"> |
||||
|
<?= $this->makePartial(__DIR__ . '/_sidenav_sidebar_menu.phtml', [ |
||||
|
'context' => $context, |
||||
|
]) ?> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
@ -0,0 +1,31 @@ |
|||||
|
<?php |
||||
|
if ($sideMenuItems = $this->getMenu($context->mainMenuCode)): |
||||
|
$collapsedGroups = explode('|', |
||||
|
isset($_COOKIE['sidenav_treegroupStatus']) |
||||
|
? $_COOKIE['sidenav_treegroupStatus'] |
||||
|
: null |
||||
|
); |
||||
|
?> |
||||
|
<ul class="top-level"> |
||||
|
<?php foreach ($sideMenuItems as $category => $items): |
||||
|
$collapsed = in_array($category, $collapsedGroups); ?> |
||||
|
<li data-group-code="<?= e($category) ?>" <?= $collapsed ? 'data-status="collapsed"' : null ?>> |
||||
|
<div class="group"> |
||||
|
<h3><?= e(trans($category)); ?></h3> |
||||
|
</div> |
||||
|
<ul> |
||||
|
<?php foreach ($items as $name => $item): ?> |
||||
|
<?php $keywords = isset($item['keywords']) ? e(trans($item['keywords'])) : ''; ?> |
||||
|
<li class="<?= $context->sideMenuCode == $name ? 'active' : null; ?>" data-keywords="<?= $keywords ?>"> |
||||
|
<a href="<?= isset($item['url']) ? $item['url'] : '#'; ?>"> |
||||
|
<i class="<?= isset($item['icon']) ? $item['icon'] : ''; ?>"></i> |
||||
|
<span class="header"><?= isset($item['label']) ? e(trans($item['label'])) : '' ?></span> |
||||
|
<span class="description"><?= isset($item['description']) ? e(trans($item['description'])) : '' ?></span> |
||||
|
</a> |
||||
|
</li> |
||||
|
<?php endforeach ?> |
||||
|
</ul> |
||||
|
</li> |
||||
|
<?php endforeach ?> |
||||
|
</ul> |
||||
|
<?php endif; ?> |
@ -0,0 +1,9 @@ |
|||||
|
<?php |
||||
|
|
||||
|
use Wms\Menu\Controllers\Index as MenuControllers; |
||||
|
|
||||
|
Route::get(config('cms.backendUri') . '/wms/menu/{menu}', function($menu) { |
||||
|
$controller = App::make(MenuControllers::class); |
||||
|
\BackendMenu::setContext('Wms.Menu', 'main', "$menu|"); |
||||
|
return $controller->run('index', ['menu' => $menu]); |
||||
|
})->middleware('web'); |
@ -0,0 +1 @@ |
|||||
|
1.0.1: First version of Menu |
Write
Preview
Loading…
Cancel
Save
Reference in new issue