/** * Parses the given request and returns the corresponding route and parameters. * @param \yii\web\UrlManager $manager the URL manager * @param Request $request the request component * @return array|bool the parsing result. The route and the parameters are returned as an array. * @throws ForbiddenHttpException */ public function parseRequest($manager, $request) { $menuMap = $this->menuManager->getMenuMap(); if (!($pathInfo = $request->getPathInfo() or $pathInfo = ($mainMenu = $menuMap->getMainMenu()) ? $mainMenu->path : null)) { return false; } // помечаем как активные все пункты меню которые ссылаются на тотже урл что в запросе $this->menuManager->setActiveMenuIds($menuMap->getMenuIdsByLink($request->getUrl())); // ищем пункт меню, чей путь совпадает с путем в запросе if ($menu = $menuMap->getMenuByPathRecursive($pathInfo)) { // определяем в каком контексте ("Точный" или "Подходящий") рассматривать активное меню $menu->setContext($menu->path === $pathInfo ? MenuItem::CONTEXT_PROPER : MenuItem::CONTEXT_APPLICABLE); // устанавливаем найденный пункт меню в качестве активного $this->menuManager->setActiveMenu($menu); // добавляем данный пункт в список активных пунктов меню $this->menuManager->addActiveMenuId($menu->id); if ($menu->getContext() === MenuItem::CONTEXT_PROPER) { //при "точном" совпадении, метаданные меню перекрывают метаднные контроллера Yii::$app->getView()->on(View::EVENT_BEGIN_PAGE, [$this, 'applyMetaData']); } else { //при "подходящем" устанавливаются по умолчанию $this->applyMetaData(); } } else { return false; } // устанавливаем макет приложению Event::on(Controller::className(), Controller::EVENT_BEFORE_ACTION, [$this, 'applyLayout']); // Проверка на доступ к пунтку меню if (!empty($menu->access_rule) && !Yii::$app->user->can($menu->access_rule)) { if (Yii::$app->user->getIsGuest()) { Yii::$app->user->loginRequired(); } else { throw new ForbiddenHttpException(Yii::t('gromver.platform', 'You have no rights for access to this section of the site.')); } } if ($menu->getContext() === MenuItem::CONTEXT_PROPER) { // при "точном" контексте пункта меню, возвращаем роут на компонент return $menu->parseUrl(); } else { /* * при "подходящем" контексте пункта меню, необходимо на основании оставшейся части пути * и информации из пункта меню маршрутизировать приложение */ $requestRoute = substr($pathInfo, mb_strlen($menu->path) + 1); list($menuRoute, $menuParams) = $menu->parseUrl(); $requestInfo = new MenuRequestInfo(['menuMap' => $menuMap, 'menuRoute' => $menuRoute, 'menuParams' => $menuParams, 'requestRoute' => $requestRoute, 'requestParams' => $request->getQueryParams()]); foreach ($this->_parseUrlRules as $rule) { if ($result = $rule->process($requestInfo, $this)) { return $result; } } return false; } }