Example #1
0
 /**
  * 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;
     }
 }
Example #2
0
 /**
  * {@inheritdoc}
  */
 protected function getQueryParams()
 {
     $params = parent::getQueryParams();
     $params['parent_id'] = $this->getFileId();
     return $params;
 }