/** * @param ActiveDataProvider $activeDataProvider */ public function search(ActiveDataProvider $activeDataProvider) { /** * @var $activeQuery ActiveQuery */ $activeQuery = $activeDataProvider->query; //$activeQuery->leftJoin('cms_content_element_property', '`cms_content_element_property`.`element_id` = `cms_content_element`.`id`'); $elementIdsGlobal = []; $applyFilters = false; foreach ($this->toArray() as $propertyCode => $value) { if ($property = $this->getProperty($propertyCode)) { if ($property->property_type == \skeeks\cms\relatedProperties\PropertyType::CODE_NUMBER) { $elementIds = []; $query = (new \yii\db\Query())->from(CmsContentElementProperty::tableName())->select(['element_id'])->where(["property_id" => $property->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 = (new \yii\db\Query())->from(CmsContentElementProperty::tableName())->select(['element_id'])->where(["value" => $value, "property_id" => $property->id])->all(); } $elementIds = \yii\helpers\ArrayHelper::map($elementIds, "element_id", "element_id"); if (!$elementIds) { $elementIdsGlobal = []; } if ($elementIdsGlobal) { $elementIdsGlobal = array_intersect_assoc($elementIds, $elementIdsGlobal); } else { $elementIdsGlobal = $elementIds; } } } if ($applyFilters) { $activeQuery->andWhere(['cms_content_element.id' => $elementIdsGlobal]); } }
/** * Конфигурирование объекта запроса поиска по элементам. * * @param \yii\db\ActiveQuery $activeQuery * @param null $modelClassName * @return $this */ public function buildElementsQuery(\yii\db\ActiveQuery $activeQuery) { $where = []; //Нужно учитывать связанные дополнительные данные if ($this->enabledElementProperties == Cms::BOOL_Y) { $activeQuery->joinWith('cmsContentElementProperties'); //Нужно учитывать настройки связанные дополнительные данных if ($this->enabledElementPropertiesSearchable == Cms::BOOL_Y) { $activeQuery->joinWith('cmsContentElementProperties.property'); $where[] = ['and', ['like', CmsContentElementProperty::tableName() . ".value", '%' . $this->searchQuery . '%', false], [CmsContentProperty::tableName() . ".searchable" => Cms::BOOL_Y]]; } else { $where[] = ['like', CmsContentElementProperty::tableName() . ".value", '%' . $this->searchQuery . '%', false]; } } //Поиск по основному набору полей if ($this->searchElementFields) { foreach ($this->searchElementFields as $fieldName) { $where[] = ['like', CmsContentElement::tableName() . "." . $fieldName, '%' . $this->searchQuery . '%', false]; } } if ($where) { $where = array_merge(['or'], $where); $activeQuery->andWhere($where); } //Отфильтровать только конкретный тип if ($this->searchElementContentIds) { $activeQuery->andWhere([CmsContentElement::tableName() . ".content_id" => (array) $this->searchElementContentIds]); } return $this; }