$this->getSearchQuery($category, $params), 'pagination' => [ 'pageSize' => 16, ], 'sort' => [ 'attributes' => [ 'name' => [ 'asc' => ['name' => SORT_ASC], 'desc' => ['name' => SORT_DESC], 'default' => SORT_DESC, 'label' => 'имени', ], 'price' => [ 'asc' => [ProductVariant::tableName() .'.price' => SORT_ASC], 'desc' => [ProductVariant::tableName() .'.price' => SORT_DESC], 'default' => SORT_DESC, 'label' => 'по цене', ], ], ] ]); if (!$this->validate()) { return $dataProvider; } return $dataProvider; } public function getSearchQuery($category = null, $params = []) { if (!empty($category)) { /** @var ActiveQuery $query */ // $query = $category->getRelations('product_categories'); $query = $category->getProducts(); } else { $query = Product::find(); } $query->select(['product.*']); $query->joinWith(['enabledVariants','brand', 'brand.brandName', 'category', 'category.categoryName']); ProductHelper::_setQueryParams($query, $params); $query->andWhere(['!=', ProductVariant::tableName() .'.stock', 0]); return $query; } public function optionsForCategory($category = null, $params = []) { $query = TaxOption::find() ->select([ TaxOption::tableName() .'.*', ]) ->leftJoin(ProductOption::tableName(), ProductOption::tableName() .'.option_id='. TaxOption::tableName() .'.tax_option_id') ->joinWith('taxGroup') ->where([TaxGroup::tableName() .'.is_filter' => true]); $query->innerJoin('product_variant', 'product_variant.product_id = '. ProductOption::tableName() .'.product_id'); $query->andWhere(['!=', 'product_variant.stock', 0]); if (!empty($category)) { $query->innerJoin(ProductCategory::tableName(), ProductCategory::tableName() .'.product_id='. ProductOption::tableName() .'.product_id'); $query->andWhere([ProductCategory::tableName() .'.category_id' => $category->category_id]); } $query->limit(null); return $query; } public function priceLimits($category = null, $params = []) { if (!empty($category)) { /** @var ActiveQuery $query */ // $query = $category->getRelations('product_categories'); $query = $category->getProducts(); } else { $query = Product::find(); } $query->joinWith('variant'); ProductHelper::_setQueryParams($query, $params, false); // $query->select([ // 'MIN('. ProductVariant::tableName() .'.price) AS priceMIN', // 'MAX('. ProductVariant::tableName() .'.price) AS priceMAX', // ]); return [ 'min' => $query->min(ProductVariant::tableName() .'.price'), 'max' => $query->max(ProductVariant::tableName() .'.price'), ]; } }