public function getModules($navigationOnly = false, $disableModule = false)
{
$this->otherCategoryName = Yii::t('YupeModule.yupe', 'Other');
$this->categoryIcon = [Yii::t('YupeModule.yupe', 'Services') => 'fa fa-fw fa-briefcase', Yii::t('YupeModule.yupe', 'Yupe!') => 'fa fa-fw fa-cog', Yii::t('YupeModule.yupe', 'Content') => 'fa fa-fw fa-file', $this->otherCategoryName => 'fa fa-fw fa-cog'];
$this->categorySort = [Yii::t('YupeModule.yupe', 'Users'), Yii::t('YupeModule.yupe', 'Content'), Yii::t('YupeModule.yupe', 'Structure'), Yii::t('YupeModule.yupe', 'Users'), Yii::t('YupeModule.yupe', 'Services'), Yii::t('YupeModule.yupe', 'Yupe!'), Yii::t('YupeModule.yupe', 'Store'), $this->otherCategoryName];
$modules = $yiiModules = $order = [];
$modulesExtendedNavigation = [];
if (count(Yii::app()->getModules())) {
/**
*
* Получаем модули и заполняем основные массивы
**/
foreach (Yii::app()->getModules() as $key => $value) {
$key = strtolower($key);
$module = Yii::app()->getModule($key);
if ($module !== null) {
if ($module instanceof WebModule) {
$category = !$module->getCategory() ? $this->otherCategoryName : $module->getCategory();
$modules[$key] = $module;
$order[$category][$key] = $module->adminMenuOrder;
$moduleExNav = (array) $module->getExtendedNavigation();
$modulesExtendedNavigation = array_merge($modulesExtendedNavigation, $moduleExNav);
} else {
$yiiModules[$key] = $module;
}
}
}
$modulesNavigation = Yii::app()->getCache()->get('YupeModulesNavigation-' . Yii::app()->getLanguage());
if ($modulesNavigation === false) {
// Формируем навигационное меню
$modulesNavigation = [];
// Сортируем категории модулей
if (count($order) > 1) {
$categorySort = array_reverse($this->categorySort);
foreach ($categorySort as $iValue) {
if (array_key_exists($iValue, $order)) {
$orderValue = $order[$iValue];
unset($order[$iValue]);
$order = array_merge([$iValue => $orderValue], $order);
}
}
}
$uniqueMenuId = 0;
$settings['items'] = [];
// Обходим категории модулей
foreach ($order as $keyCategory => $valueCategory) {
// Шаблон категорий
$modulesNavigation[$keyCategory] = ['label' => $keyCategory, 'items' => [], 'submenuOptions' => ["id" => "mainmenu_" . $uniqueMenuId]];
$uniqueMenuId++;
if (array_key_exists($keyCategory, $this->categoryIcon)) {
$modulesNavigation[$keyCategory]['icon'] = $this->categoryIcon[$keyCategory];
}
// Сортируем модули в категории
asort($valueCategory, SORT_NUMERIC);
// Обходим модули
foreach ($valueCategory as $key => $value) {
$modSettings = [];
// Собраются подпункты категории "Настройки модулей", кроме пункта Юпи
if ($key !== self::CORE_MODULE && $modules[$key]->editableParams) {
$modSettings = ['---', ['icon' => 'fa fa-fw fa-cog', 'label' => Yii::t('YupeModule.yupe', 'Module settings'), 'url' => $modules[$key]->getSettingsUrl()]];
}
// Проверка на вывод модуля в категориях, потребуется при отключении модуля
if (!$modules[$key]->getIsShowInAdminMenu()) {
continue;
}
// Если нет иконки для данной категории - подставляется иконка первого модуля
if (!isset($modulesNavigation[$keyCategory]['icon']) && $modules[$key]->icon) {
$modulesNavigation[$keyCategory]['icon'] = $modules[$key]->icon;
}
// Шаблон модулей
$data = ['icon' => $modules[$key]->icon, 'label' => $modules[$key]->name, 'url' => $modules[$key]->adminPageLinkNormalize, 'submenuOptions' => ["id" => "submenu_" . $key], 'items' => []];
// Добавляем подменю у модулей
$links = $modules[$key]->getNavigation();
if (!empty($links)) {
$data['items'] = $links;
} else {
unset($modSettings[0]);
}
if ($key !== self::CORE_MODULE) {
$data['items'] = array_merge($data['items'], $key === self::CORE_MODULE ? [] : $modSettings);
}
$modulesNavigation[$keyCategory]['items'][$modules[$key]->id] = $data;
}
}
foreach ($modulesNavigation as $key => $data) {
if (count($data['items']) === 1) {
$items = array_shift($modulesNavigation[$key]['items']);
$modulesNavigation[$key]['items'] = $items['items'];
}
}
// Цепочка зависимостей:
$chain = new CChainedCacheDependency();
// Зависимость на тег:
$chain->dependencies->add(new TagsCache('yupe', 'navigation', 'installedModules'));
// Зависимость на каталог 'application.config.modules':
$chain->dependencies->add(new CDirectoryCacheDependency(Yii::getPathOfAlias('application.config.modules')));
Yii::app()->getCache()->set('YupeModulesNavigation-' . Yii::app()->getLanguage(), $modulesNavigation, 0, $chain);
}
}
// Подгрузка отключенных модулей
if ($disableModule) {
$modules = array_merge((array) $this->getModulesDisabled($modules), $modules);
}
$modulesNavigation = array_merge($modulesNavigation, $modulesExtendedNavigation);
return $navigationOnly === true ? $modulesNavigation : ['modules' => $modules, 'yiiModules' => $yiiModules, 'modulesNavigation' => $modulesNavigation];
}