[ 'name_asc' => [ 'asc' => [ 'lang.title' => SORT_ASC ], 'desc' => [ 'lang.title' => SORT_ASC ], 'default' => SORT_ASC, 'label' => 'имени от А до Я', ], 'name_desc' => [ 'asc' => [ 'lang.title' => SORT_DESC ], 'desc' => [ 'lang.title' => SORT_DESC ], 'default' => SORT_DESC, 'label' => 'имени от Я до А', ], 'price_asc' => [ 'asc' => [ 'enabledVariants.price' => SORT_ASC ], 'desc' => [ 'enabledVariants.price' => SORT_ASC ], 'default' => SORT_ASC, 'label' => 'по цене по возрастанию', ], 'price_desc' => [ 'asc' => [ 'enabledVariants.price' => SORT_DESC ], 'desc' => [ 'enabledVariants.price' => SORT_DESC ], 'default' => SORT_DESC, 'label' => 'по цене по уменшению', ], ], ] ); $dataProvider = new ArrayDataProvider( [ 'allModels' => $this->getSearchQuery($category, $params, $in_stock) ->with('variant', 'videos')->all(), 'pagination' => [ 'pageSize' => 12, ], 'sort' => $sort, ] ); return $dataProvider; } public function getSearchQuery($category = null, $params = [], $in_stock = true) { if (!empty( $category )) { /** @var ActiveQuery $query */ /**@var Category $category * */ $query = $category->getProducts(); } else { $query = Product::find() ->joinWith(['category','category.lang']); } $query->select([ 'product.*' ]); $query->joinWith( [ 'lang', 'brand.lang', 'options', ] ) ->innerJoinWith( [ 'enabledVariants' => function ($query) { /** * @var ActiveQuery $query */ $query->joinWith('lang') ->with('images'); }, ] ); $query->groupBy( [ 'product.id', 'product_variant.price', ] ); FilterHelper::setQueryParams($query, $params); if ($in_stock) { $query->andWhere( [ '>=', ProductVariant::tableName() . '.stock', 1, ] ); } return $query; } /** * @param Category|null $category * * @return array */ 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'); // Price filter fix unset($params['prices']); FilterHelper::setQueryParams($query, $params); $query->andWhere( [ '>=', ProductVariant::tableName() . '.stock', 1, ] ); return [ 'min' => $query->min(ProductVariant::tableName() .'.price'), 'max' => $query->max(ProductVariant::tableName() .'.price'), ]; } }