/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
backend/components/NavigationMenu.php
122 строки
4 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace backend\components; use Yii; use yii\base\Component; use yii\bootstrap\Html; use yii\helpers\ArrayHelper; /** * Dashboard navigation menu * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2020 */ class NavigationMenu extends Component { const TYPE_SIDEBAR = 'sidebar'; const TYPE_HEADER = 'header'; public $defaultRoute = 'dashboard'; /** * @var array */ private $menu; /** * Get menu items by type * @param $type * @return array */ public function getMenu($type) { return $this->normalize($this->menu, $type); } /** * Set menu $menu * @return array */ public function setMenu(array $data) { $this->menu = $data; } /** * Форматируем меню согласно конфигурационного файла * * @param array $items * @param $type * @return mixed */ protected function normalize(array $menu, $type) { $menu['encodeLabels'] = false; $menu['activeCssClass'] = 'active active-css'; $menu['submenuTemplate'] = "\n<ul class='hidden-ul'>\n{items}\n</ul>\n"; switch ($type) { case self::TYPE_SIDEBAR: $menu['options'] = ['class' => 'navigation navigation-main navigation-accordion']; break; default: $menu['options'] = ['class' => 'dropdown-menu dropdown-menu-right width-250']; break; } $user = Yii::$app->user; $recursion = function ($items) use (&$recursion, $user) { foreach ($items as $key => &$item) { if ($divider = ArrayHelper::getValue($item, 'divider')) { $item['options'] = ['class' => 'navigation-divider divider']; } elseif ($section = ArrayHelper::getValue($item, 'section')) { $rule = ArrayHelper::getValue($item, 'rule'); if ($rule && !$user->can($rule)) { $item['visible'] = false; } else { $item['options'] = ['class' => 'navigation-header']; $item['template'] = '<span>{label}</span><i class="icon-menu" title="" data-original-title="{label}"></i>'; } } else { $rule = ArrayHelper::getValue($item, 'rule'); if ($rule && !$user->can($rule)) { $item['visible'] = false; } else { if ($url = ArrayHelper::getValue($item, 'url')) { $item['url'] = $url; } else { $item['url'] = false; } $ext = ''; if ($info = ArrayHelper::getValue($item, 'info')) { if (is_callable($info, true) and $ret = call_user_func($info)) { $ext = Html::tag('span', $ret['value'], ['class' => "label bg-{$ret['class']}-400"]); } } if ($icon = ArrayHelper::getValue($item, 'icon')) { $item['label'] = Html::icon($icon, ['prefix' => '', 'tag' => 'i']) . ' ' . Html::tag('span', Yii::t('app', $item['label']) . $ext); } if (isset($item['items'])) { $item['items'] = $recursion($item['items']); } } } } return $items; }; $menu['items'] = $recursion($menu['items']); return $menu; } }