/** * Стандартный sitemap */ public function actionSitemap() { ini_set("memory_limit", "512M"); $trees = Tree::find()->where(['site_code' => \Yii::$app->cms->site->code])->orderBy(['level' => SORT_ASC, 'priority' => SORT_ASC])->all(); if ($trees) { /** * @var Tree $tree */ foreach ($trees as $tree) { if (!$tree->redirect) { $result[] = ["loc" => $tree->url, "lastmod" => $this->_lastMod($tree), "priority" => $this->_calculatePriority($tree), "changefreq" => "daily"]; } } } $elements = CmsContentElement::find()->joinWith('cmsTree')->andWhere([Tree::tableName() . '.site_code' => \Yii::$app->cms->site->code])->orderBy(['updated_at' => SORT_DESC, 'priority' => SORT_ASC])->all(); //Добавление элементов в карту if ($elements) { /** * @var CmsContentElement $model */ foreach ($elements as $model) { $result[] = ["loc" => $model->absoluteUrl, "lastmod" => $this->_lastMod($model), "priority" => "0.3", "changefreq" => "daily"]; } } \Yii::$app->response->format = Response::FORMAT_XML; $this->layout = false; //Генерация sitemap вручную, не используем XmlResponseFormatter \Yii::$app->response->content = $this->render($this->action->id, ['data' => $result]); return; /*return $this->render($this->action->id, [ 'data' => $result ]);;*/ }
/** * @return \yii\widgets\ActiveField */ public function renderForActiveForm() { $field = parent::renderForActiveForm(); $find = CmsContentElement::find()->active(); if ($this->content_id) { $find->andWhere(['content_id' => $this->content_id]); } if ($this->fieldElement == self::FIELD_ELEMENT_SELECT) { $field = $this->activeForm->fieldSelect($this->model->relatedPropertiesModel, $this->property->code, ArrayHelper::map($find->all(), 'id', 'name'), []); } else { if ($this->fieldElement == self::FIELD_ELEMENT_SELECT_MULTI) { $field = $this->activeForm->fieldSelectMulti($this->model->relatedPropertiesModel, $this->property->code, ArrayHelper::map($find->all(), 'id', 'name'), []); } else { if ($this->fieldElement == self::FIELD_ELEMENT_RADIO_LIST) { $field = parent::renderForActiveForm(); $field->radioList(ArrayHelper::map($find->all(), 'id', 'name')); } else { if ($this->fieldElement == self::FIELD_ELEMENT_CHECKBOX_LIST) { $field = parent::renderForActiveForm(); $field->checkboxList(ArrayHelper::map($find->all(), 'id', 'name')); } } } } if (!$field) { return ''; } return $field; }
/** * @param ActiveDataProvider $activeDataProvider */ public function search(ActiveDataProvider $activeDataProvider, $tableName = 'cms_content_element') { $classSearch = $this->propertyElementClassName; /** * @var $activeQuery ActiveQuery */ $activeQuery = $activeDataProvider->query; $elementIdsGlobal = []; $applyFilters = false; foreach ($this->toArray() as $propertyCode => $value) { //TODO: add to validator related properties if ($propertyCode == 'properties') { continue; } if ($property = $this->getProperty($propertyCode)) { if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_NUMBER) { $elementIds = []; $query = $classSearch::find()->select(['element_id'])->where(["property_id" => $property->id])->indexBy('element_id'); if ($fromValue = $this->{$this->getAttributeNameRangeFrom($propertyCode)}) { $applyFilters = true; $query->andWhere(['>=', 'value_num', (double) $fromValue]); } if ($toValue = $this->{$this->getAttributeNameRangeTo($propertyCode)}) { $applyFilters = true; $query->andWhere(['<=', 'value_num', (double) $toValue]); } if (!$fromValue && !$toValue) { continue; } $elementIds = $query->all(); } else { if (!$value) { continue; } $applyFilters = true; $elementIds = $classSearch::find()->select(['element_id'])->where(["value" => $value, "property_id" => $property->id])->indexBy('element_id')->all(); } $elementIds = array_keys($elementIds); if ($elementIds) { $realElements = CmsContentElement::find()->where(['id' => $elementIds])->select(['id', 'parent_content_element_id'])->indexBy('parent_content_element_id')->groupBy(['parent_content_element_id'])->asArray()->all(); $elementIds = array_keys($realElements); } if (!$elementIds) { $elementIdsGlobal = []; } if ($elementIdsGlobal) { $elementIdsGlobal = array_intersect($elementIds, $elementIdsGlobal); } else { $elementIdsGlobal = $elementIds; } } } if ($applyFilters) { //$activeQuery->andWhere(['cms_content_element.id' => $elementIdsGlobal]); $activeQuery->andWhere([$tableName . '.id' => $elementIdsGlobal]); } }
/** * @return \yii\widgets\ActiveField */ public function renderForActiveForm() { $field = parent::renderForActiveForm(); $find = CmsContentElement::find()->active(); if ($this->content_id) { $find->andWhere(['content_id' => $this->content_id]); } if ($this->multiple == Cms::BOOL_N) { $field = $this->activeForm->fieldSelect($this->model->relatedPropertiesModel, $this->property->code, ArrayHelper::map($find->all(), 'id', 'name'), []); } else { if ($this->multiple == Cms::BOOL_Y) { $field = $this->activeForm->fieldSelectMulti($this->model->relatedPropertiesModel, $this->property->code, ArrayHelper::map($find->all(), 'id', 'name'), []); } } return $field; }
public function safeUp() { if ($models = \skeeks\cms\models\CmsContentElement::find()->all()) { /** * @var $model \skeeks\cms\models\CmsContentElement */ foreach ($models as $model) { if (!method_exists($model, 'getMainImageSrc')) { continue; } //$user->getFiles() $imageSrc = $model->getMainImageSrcOld(); if ($imageSrc) { $storageFile = \skeeks\cms\models\CmsStorageFile::find()->where(['src' => $imageSrc])->one(); if ($storageFile) { $model->image_id = $storageFile->id; $model->image_full_id = $storageFile->id; $model->save(false); } } } } }
/** * @return string */ public function getStringValue() { $value = $this->property->relatedPropertiesModel->getAttribute($this->property->code); if ($this->isMultiple) { $data = ArrayHelper::map(CmsContentElement::find()->where(['id' => $value])->all(), 'id', 'name'); return implode(', ', $data); } else { if ($element = CmsContentElement::find()->where(['id' => $value])->one()) { return $element->name; } return ""; } }
}]; } $searchRelatedPropertiesModel = new \skeeks\cms\models\searchs\SearchRelatedPropertiesModel(); $searchRelatedPropertiesModel->initCmsContent($model->cmsContent); $searchRelatedPropertiesModel->load(\Yii::$app->request->get()); $searchRelatedPropertiesModel->search($dataProvider); /** * @var $model \skeeks\cms\models\CmsContentElement */ if ($model->relatedPropertiesModel) { foreach ($model->relatedPropertiesModel->attributeValues() as $name => $value) { $property = $model->relatedPropertiesModel->getRelatedProperty($name); $filter = ''; if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_ELEMENT) { $propertyType = $property->createPropertyType(); $options = \skeeks\cms\models\CmsContentElement::find()->active()->andWhere(['content_id' => $propertyType->content_id])->all(); $items = \yii\helpers\ArrayHelper::merge(['' => ''], \yii\helpers\ArrayHelper::map($options, 'id', 'name')); $filter = \yii\helpers\Html::activeDropDownList($searchRelatedPropertiesModel, $name, $items, ['class' => 'form-control']); } else { if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_LIST) { $items = \yii\helpers\ArrayHelper::merge(['' => ''], \yii\helpers\ArrayHelper::map($property->enums, 'id', 'value')); $filter = \yii\helpers\Html::activeDropDownList($searchRelatedPropertiesModel, $name, $items, ['class' => 'form-control']); } else { if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_STRING) { $filter = \yii\helpers\Html::activeTextInput($searchRelatedPropertiesModel, $name, ['class' => 'form-control']); } else { if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_NUMBER) { $filter = "<div class='row'><div class='col-md-6'>" . \yii\helpers\Html::activeTextInput($searchRelatedPropertiesModel, $searchRelatedPropertiesModel->getAttributeNameRangeFrom($name), ['class' => 'form-control', 'placeholder' => 'от']) . "</div><div class='col-md-6'>" . \yii\helpers\Html::activeTextInput($searchRelatedPropertiesModel, $searchRelatedPropertiesModel->getAttributeNameRangeTo($name), ['class' => 'form-control', 'placeholder' => 'до']) . "</div></div>"; } } }
$searchRelatedPropertiesModel->search($dataProvider); /** * @var $model \skeeks\cms\models\CmsContentElement */ if ($model->relatedPropertiesModel) { foreach ($model->relatedPropertiesModel->toArray($model->relatedPropertiesModel->attributes()) as $name => $value) { $property = $model->relatedPropertiesModel->getRelatedProperty($name); $filter = ''; if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_ELEMENT) { $propertyType = $property->handler; $options = \skeeks\cms\models\CmsContentElement::find()->active()->andWhere([ 'content_id' => $propertyType->content_id ])->all(); $items = \yii\helpers\ArrayHelper::merge(['' => ''], \yii\helpers\ArrayHelper::map( $options, 'id', 'name' )); $filter = \yii\helpers\Html::activeDropDownList($searchRelatedPropertiesModel, $name, $items, ['class' => 'form-control']); } else if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_LIST) { $items = \yii\helpers\ArrayHelper::merge(['' => ''], \yii\helpers\ArrayHelper::map( $property->enums, 'id', 'value' ));
/** * @param CmsContent $cmsContent * @return array */ public static function getColumnsByContent($cmsContent = null, $dataProvider = null) { $autoColumns = []; if (!$cmsContent) { return []; } $model = CmsContentElement::find()->where(['content_id' => $cmsContent->id])->one(); if (!$model) { $model = new CmsContentElement(['content_id' => $cmsContent->id]); } if (is_array($model) || is_object($model)) { foreach ($model as $name => $value) { $autoColumns[] = ['attribute' => $name, 'visible' => false, 'format' => 'raw', 'class' => \yii\grid\DataColumn::className(), 'value' => function ($model, $key, $index) use($name) { if (is_array($model->{$name})) { return implode(",", $model->{$name}); } else { return $model->{$name}; } }]; } $searchRelatedPropertiesModel = new \skeeks\cms\models\searchs\SearchRelatedPropertiesModel(); $searchRelatedPropertiesModel->initProperties($cmsContent->cmsContentProperties); $searchRelatedPropertiesModel->load(\Yii::$app->request->get()); if ($dataProvider) { $searchRelatedPropertiesModel->search($dataProvider); } /** * @var $model \skeeks\cms\models\CmsContentElement */ if ($model->relatedPropertiesModel) { $autoColumns = ArrayHelper::merge($autoColumns, GridViewStandart::getColumnsByRelatedPropertiesModel($model->relatedPropertiesModel, $searchRelatedPropertiesModel)); } } return $autoColumns; }
/** * @param $name * @return array|mixed|string */ public function getSmartAttribute($name) { /** * @var $property RelatedPropertyModel */ $value = $this->getAttribute($name); $property = $this->getRelatedProperty($name); if ($property->property_type == PropertyType::CODE_LIST) { if ($property->multiple == Cms::BOOL_Y) { if ($property->enums) { $result = []; foreach ($property->enums as $enum) { if (in_array($enum->id, $value)) { $result[$enum->code] = $enum->value; } } return $result; } } else { if ($property->enums) { $enum = array_shift($property->enums); foreach ($property->enums as $enum) { if ($enum->id == $value) { return $enum->value; } } } return ""; } } else { if ($property->property_type == PropertyType::CODE_ELEMENT) { if ($property->multiple == Cms::BOOL_Y) { return ArrayHelper::map(CmsContentElement::find()->where(['id' => $value])->all(), 'id', 'name'); } else { if ($element = CmsContentElement::find()->where(['id' => $value])->one()) { return $element->name; } return ""; } } else { return $value; } } }
/** * * Получение доступных опций для свойства * @param CmsContentProperty $property * @return $this|array|\yii\db\ActiveRecord[] */ public function getRelatedPropertyOptions($property) { $options = []; if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_ELEMENT) { $propertyType = $property->handler; if ($this->elementIds) { $availables = \skeeks\cms\models\CmsContentElementProperty::find()->select(['value_enum'])->indexBy('value_enum')->andWhere(['element_id' => $this->elementIds])->andWhere(['property_id' => $property->id])->asArray()->all(); $availables = array_keys($availables); } $options = \skeeks\cms\models\CmsContentElement::find()->active()->andWhere(['content_id' => $propertyType->content_id]); if ($this->elementIds) { $options->andWhere(['id' => $availables]); } $options = $options->select(['id', 'name'])->asArray()->all(); $options = \yii\helpers\ArrayHelper::map($options, 'id', 'name'); } elseif ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_LIST) { $options = $property->getEnums()->select(['id', 'value']); if ($this->elementIds) { $availables = \skeeks\cms\models\CmsContentElementProperty::find()->select(['value_enum'])->indexBy('value_enum')->andWhere(['element_id' => $this->elementIds])->andWhere(['property_id' => $property->id])->asArray()->all(); $availables = array_keys($availables); $options->andWhere(['id' => $availables]); } $options = $options->asArray()->all(); $options = \yii\helpers\ArrayHelper::map($options, 'id', 'value'); } return $options; }