/** * @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]); }
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 }