yupe\components\ModuleManager::getModules PHP Method

getModules() public method

Возвращаем список модулей:
public getModules ( boolean $navigationOnly = false, boolean $disableModule = false ) : mixed
$navigationOnly boolean - только навигация
$disableModule boolean - отключённые модули
return mixed
    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];
    }

Usage Example

Example #1
0
 /**
  * @param  bool $navigationOnly
  * @param  bool $disableModule
  * @return array|mixed
  */
 public function getModules($navigationOnly = false, $disableModule = false)
 {
     $modules = parent::getModules($navigationOnly, $disableModule);
     if (true === $navigationOnly) {
         return $this->filterMenuVisibilityByUserRoles($modules);
     }
     $modules['modulesNavigation'] = $this->filterMenuVisibilityByUserRoles($modules['modulesNavigation']);
     $modules['modules'] = $this->filterModulesListByUserRoles($modules['modules']);
     return $modules;
 }