/**
  * @inheritdoc
  */
 public function run()
 {
     if (null === ($form = Form::findById($this->formId)) || null === $this->model || null === $this->model->object) {
         throw new InvalidParamException();
     }
     if ($this->registerCanonical === true) {
         $this->getView()->registerLinkTag(['rel' => 'canonical', 'href' => ObjectRule::canonical($this->additionalParams)], 'canonical');
     }
     $formObject = Object::getForClass(Form::className());
     $groups = PropertyGroup::getForModel($formObject->id, $form->id);
     $models = Review::getForObjectModel($this->model->id, $this->model->object->id, $form->id);
     $review = new Review(['scenario' => 'check']);
     $review->useCaptcha = $this->useCaptcha;
     /** @var $module \app\modules\review\ReviewModule */
     $module = Yii::$app->getModule('review');
     $maxPerPage = $module->maxPerPage;
     $pageSize = $module->pageSize;
     if ($pageSize > $maxPerPage) {
         $pageSize = $maxPerPage;
     }
     $this->additionalParams['review-page'] = Yii::$app->request->get('review-page');
     $this->additionalParams['review-per-page'] = Yii::$app->request->get('review-per-page');
     return $this->render($this->viewFile, ['reviews' => new ArrayDataProvider(['id' => 'review', 'allModels' => $models, 'pagination' => ['pageSize' => $pageSize, 'params' => $this->additionalParams], 'sort' => ['attributes' => ['submission_id'], 'defaultOrder' => ['submission_id' => $this->sort]]]), 'objectModel' => $this->model, 'model' => $form, 'review' => $review, 'groups' => $groups, 'ratingGroupName' => $this->ratingGroupName, 'useCaptcha' => $this->useCaptcha, 'additionalParams' => $this->additionalParams]);
 }
Exemplo n.º 2
0
 public function parseRequest($manager, $request)
 {
     Yii::beginProfile("ObjectRule::parseRequest");
     $url = $request->getPathInfo();
     if (empty($url)) {
         Yii::endProfile("ObjectRule::parseRequest");
         return false;
     }
     $cacheKey = 'ObjectRule:' . $url . ':' . Json::encode($request->getQueryParams());
     $result = Yii::$app->cache->get($cacheKey);
     if ($result !== false) {
         Yii::endProfile("ObjectRule::parseRequest");
         $this->defineBlocksTitleAndView($result);
         return $result['result'];
     }
     $prefilteredPage = PrefilteredPages::getActiveByUrl($url);
     if ($prefilteredPage !== null) {
         $params = ['properties' => Json::decode($prefilteredPage['params'])];
         $category = Category::findById($prefilteredPage['last_category_id']);
         if ($category === null) {
             throw new NotFoundHttpException();
         }
         $params['category_group_id'] = $category->category_group_id;
         $params['last_category_id'] = $category->id;
         $data = ['blocks' => []];
         if (!empty($prefilteredPage['title'])) {
             $data['title'] = $prefilteredPage['title'];
         }
         if (!empty($prefilteredPage['meta_description'])) {
             $data['meta_description'] = $prefilteredPage['meta_description'];
         }
         $blocks = ['content', 'announce', 'breadcrumbs_label', 'h1'];
         foreach ($blocks as $block_name) {
             if (!empty($prefilteredPage[$block_name])) {
                 $data['blocks'][$block_name] = $prefilteredPage[$block_name];
             }
         }
         $data['is_prefiltered_page'] = true;
         if ($prefilteredPage['view_id'] > 0) {
             $data['viewId'] = $prefilteredPage['view_id'];
         }
         $data['result'] = ['shop/product/list', $params];
         $this->defineBlocksTitleAndView($data);
         Yii::$app->cache->set($cacheKey, $data, 86400, new TagDependency(['tags' => [ActiveRecordHelper::getObjectTag(PrefilteredPages::className(), $prefilteredPage['id']), ActiveRecordHelper::getObjectTag(Category::className(), $category->id)]]));
         return $data['result'];
     }
     $routes = ObjectRule::getRoutes();
     $cacheTags = [];
     foreach ($routes as $model) {
         /** @var UrlPart[] $handlers */
         $handlers = [];
         $object = Object::findById($model->object_id);
         foreach ($model->template as $t) {
             $handler = Yii::createObject($t);
             $handler->object = $object;
             $handlers[] = $handler;
         }
         $url_parts = [];
         $parameters = [];
         $next_part = $url;
         foreach ($handlers as $handler) {
             if (empty($next_part)) {
                 //break;
             }
             $result = $handler->getNextPart($url, $next_part, $url_parts);
             if ($result !== false && is_object($result) === true) {
                 $parameters = ArrayHelper::merge($parameters, $result->parameters);
                 $cacheTags = ArrayHelper::merge($cacheTags, $result->cacheTags);
                 // удалим leading slash
                 $next_part = ltrim($result->rest_part, '/');
                 $url_parts[] = $result;
             } elseif ($result === false && $handler->optional === false) {
                 continue;
             }
         }
         if (count($url_parts) == 0) {
             continue;
         }
         // в конце удачного парсинга next_part должен остаться пустым
         if (empty($next_part)) {
             $resultForCache = ['result' => [$model->route, $parameters]];
             if (isset($_POST['properties'], $parameters['properties'])) {
                 foreach ($_POST['properties'] as $key => $value) {
                     if (isset($parameters['properties'][$key])) {
                         $parameters['properties'][$key] = array_unique(ArrayHelper::merge($parameters['properties'][$key], $value));
                     } else {
                         $parameters['properties'][$key] = array_unique($value);
                     }
                 }
             } elseif (isset($_POST['properties'])) {
                 $parameters['properties'] = $_POST['properties'];
             }
             Yii::endProfile("ObjectRule::parseRequest");
             if (isset($parameters['properties'])) {
                 foreach ($parameters['properties'] as $key => $values) {
                     foreach ($parameters['properties'][$key] as $index => $value) {
                         if ($value === '') {
                             unset($parameters['properties'][$key][$index]);
                         }
                     }
                     if (count($parameters['properties'][$key]) === 0) {
                         unset($parameters['properties'][$key]);
                     }
                 }
             }
             $result = [$model->route, $parameters];
             Yii::$app->cache->set($cacheKey, $resultForCache, 86400, new TagDependency(['tags' => $cacheTags]));
             return $result;
         }
     }
     Yii::endProfile("ObjectRule::parseRequest");
     return false;
     // this rule does not apply
 }