Commit 2f5c8d1163900a70aca795cf6c8c266361902480
1 parent
879394e3
add variantSku
Showing
2 changed files
with
125 additions
and
129 deletions
Show diff stats
helpers/FilterHelper.php
| ... | ... | @@ -111,66 +111,40 @@ |
| 111 | 111 | |
| 112 | 112 | |
| 113 | 113 | |
| 114 | - | |
| 115 | - | |
| 116 | - public static function setNewQueryParams(ActiveQuery $query, array $params) | |
| 117 | - { | |
| 118 | - $last_query = null; | |
| 119 | - foreach ($params as $key => $param) { | |
| 120 | - switch ($key) { | |
| 121 | - case 'special': | |
| 122 | - self::filterSpecial($param, $query); | |
| 123 | - break; | |
| 124 | - case 'brands': | |
| 125 | - self::filterBrands($param, $query); | |
| 126 | - break; | |
| 127 | - case 'keywords': | |
| 128 | - self::filterKeywords($param, $query); | |
| 129 | - break; | |
| 130 | - case 'prices': | |
| 131 | - self::filterPrices($param, $query); | |
| 132 | - break; | |
| 133 | - default: | |
| 134 | - self::filterNewOptions($key, $param, $query); | |
| 135 | - break; | |
| 136 | - } | |
| 137 | - } | |
| 138 | - } | |
| 139 | - | |
| 140 | - | |
| 141 | 114 | /** |
| 142 | - * @param $key | |
| 143 | - * @param array $param | |
| 144 | - * @param ActiveQuery $query | |
| 115 | + * select options for product variants with selected category | |
| 116 | + * | |
| 117 | + * @param integer $categoryId | |
| 118 | + * @param integer $langId | |
| 119 | + * @return mixed | |
| 145 | 120 | */ |
| 146 | - private static function filterNewOptions($key, array $param, &$query) | |
| 147 | - { | |
| 148 | - $query->andWhere( | |
| 149 | - 'product.id IN ( | |
| 150 | - SELECT DISTINCT products | |
| 151 | - FROM ( | |
| 152 | - SELECT id AS products FROM product WHERE id IN( | |
| 153 | - SELECT product_id FROM product_option | |
| 154 | - INNER JOIN tax_option ON tax_option.id = product_option.option_id | |
| 155 | - INNER JOIN tax_group ON tax_group.id = tax_option.tax_group_id | |
| 156 | - INNER JOIN tax_group_lang ON tax_group.id = tax_group_lang.tax_group_id | |
| 157 | - INNER JOIN tax_option_lang ON tax_option.id = tax_option_lang.tax_option_id | |
| 158 | - WHERE tax_group_lang.alias = \''. $key .'\' AND tax_option_lang.alias IN (\'' . implode('\',\'', $param) . '\')) | |
| 159 | - OR id IN ( | |
| 160 | - (SELECT product_id AS products | |
| 161 | - FROM product_variant_option | |
| 162 | - INNER JOIN product_variant ON product_variant_option.product_variant_id = product_variant.id | |
| 163 | - INNER JOIN tax_option ON tax_option.id = product_variant_option.option_id | |
| 164 | - INNER JOIN tax_group ON tax_group.id = tax_option.tax_group_id | |
| 165 | - INNER JOIN tax_group_lang ON tax_group.id = tax_group_lang.tax_group_id | |
| 166 | - INNER JOIN tax_option_lang ON tax_option.id = tax_option_lang.tax_option_id | |
| 167 | - WHERE tax_group_lang.alias = \''. $key .'\' AND tax_option_lang.alias IN (\'' . implode('\',\'', $param) . '\')) | |
| 168 | - ) | |
| 169 | - ) AS table_name | |
| 170 | - )' | |
| 171 | - ); | |
| 172 | - | |
| 173 | - | |
| 121 | + public static function getProductVariantOptions($categoryId,$langId){ | |
| 122 | + $result = \Yii::$app->db->cache(function () use($categoryId,$langId) { | |
| 123 | + return ( new Query() )->distinct()->select('tax_group_lang.alias') | |
| 124 | + ->from('product_variant_option') | |
| 125 | + ->innerJoin( | |
| 126 | + 'tax_option', | |
| 127 | + 'product_variant_option.option_id = tax_option.id' | |
| 128 | + ) | |
| 129 | + ->innerJoin( | |
| 130 | + 'tax_group', | |
| 131 | + 'tax_group.id = tax_option.tax_group_id' | |
| 132 | + ) | |
| 133 | + ->innerJoin( | |
| 134 | + 'tax_group_lang', | |
| 135 | + 'tax_group_lang.tax_group_id = tax_group.id' | |
| 136 | + ) | |
| 137 | + ->innerJoin( | |
| 138 | + 'tax_group_to_category', | |
| 139 | + 'tax_group_to_category.tax_group_id = tax_group.id' | |
| 140 | + ) | |
| 141 | + ->where([ | |
| 142 | + 'tax_group_lang.language_id' => $langId, | |
| 143 | + 'tax_group_to_category.category_id' => $categoryId, | |
| 144 | + 'tax_group.is_filter' => true | |
| 145 | + ])->all(); | |
| 146 | + },60*60*24); | |
| 147 | + return ArrayHelper::getColumn($result,'alias'); | |
| 174 | 148 | } |
| 175 | 149 | |
| 176 | 150 | |
| ... | ... | @@ -179,87 +153,119 @@ |
| 179 | 153 | * |
| 180 | 154 | * @param ActiveQuery $query |
| 181 | 155 | * @param array $params |
| 156 | + * @param integer $categoryId | |
| 157 | + * @param integer $langId | |
| 182 | 158 | */ |
| 183 | - public static function setQueryParams(ActiveQuery $query, array $params) | |
| 159 | + public static function setQueryParams(ActiveQuery $query, array $params, $categoryId, $langId) | |
| 184 | 160 | { |
| 185 | 161 | $last_query = null; |
| 162 | + $productVariantOptions = self::getProductVariantOptions($categoryId,$langId); | |
| 186 | 163 | foreach ($params as $key => $param) { |
| 187 | 164 | switch ($key) { |
| 188 | 165 | case 'special': |
| 166 | + unset($params[$key]); | |
| 189 | 167 | self::filterSpecial($param, $query); |
| 190 | 168 | break; |
| 191 | 169 | case 'brands': |
| 170 | + unset($params[$key]); | |
| 192 | 171 | self::filterBrands($param, $query); |
| 193 | 172 | break; |
| 194 | 173 | case 'keywords': |
| 174 | + unset($params[$key]); | |
| 195 | 175 | self::filterKeywords($param, $query); |
| 196 | 176 | break; |
| 197 | 177 | case 'prices': |
| 178 | + unset($params[$key]); | |
| 198 | 179 | self::filterPrices($param, $query); |
| 199 | 180 | break; |
| 200 | - default: | |
| 201 | - $last_query = self::filterOptions($param, $last_query); | |
| 202 | - break; | |
| 181 | + | |
| 203 | 182 | } |
| 204 | 183 | } |
| 205 | - // If tax option filters were provided filter query with them | |
| 206 | - if (!empty( $last_query )) { | |
| 207 | - $query->andWhere([ 'product.id' => $last_query ]); | |
| 208 | - } | |
| 184 | + self::filterOptions($params, $productVariantOptions, $query); | |
| 209 | 185 | } |
| 210 | 186 | |
| 211 | 187 | |
| 212 | - | |
| 188 | + | |
| 213 | 189 | /** |
| 214 | 190 | * Tax Option filter |
| 215 | 191 | * |
| 216 | 192 | * @param string[] $params |
| 217 | - * @param \yii\db\Query|null $last_query | |
| 193 | + * @param string[] $productVariantOptions | |
| 194 | + * @param \yii\db\Query|null $query | |
| 218 | 195 | * @param bool $in_stock |
| 219 | 196 | * |
| 220 | 197 | * @return \yii\db\Query |
| 221 | 198 | */ |
| 222 | - private static function filterOptions(array $params, Query $last_query = null, bool $in_stock = true): Query | |
| 199 | + private static function filterOptions(array $params,$productVariantOptions, Query &$query = null, bool $in_stock = true) | |
| 223 | 200 | { |
| 224 | - | |
| 225 | 201 | $variant_query = ( new Query() )->distinct() |
| 226 | - ->select('product_variant.product_id as products') | |
| 227 | - ->from('product_variant_option') | |
| 228 | - ->innerJoin( | |
| 229 | - 'product_variant', | |
| 230 | - 'product_variant_option.product_variant_id = product_variant.id' | |
| 231 | - ) | |
| 232 | - ->innerJoin( | |
| 233 | - 'tax_option', | |
| 234 | - 'tax_option.id = product_variant_option.option_id' | |
| 235 | - ) | |
| 236 | - ->innerJoin( | |
| 237 | - 'tax_option_lang', | |
| 238 | - 'tax_option_lang.tax_option_id = tax_option.id' | |
| 239 | - ) | |
| 240 | - ->where([ 'tax_option_lang.alias' => $params ]); | |
| 202 | + ->select('product_variant.product_id as products') | |
| 203 | + ->from('product_variant'); | |
| 204 | + | |
| 205 | + foreach ($params as $key=>$param){ | |
| 206 | + if(in_array($key, $productVariantOptions)){ | |
| 207 | + unset($params[$key]); | |
| 208 | + $product_variant_id = ( new Query() )->distinct()->select('product_variant_option.product_variant_id as id') | |
| 209 | + ->from('product_variant_option') | |
| 210 | + ->innerJoin( | |
| 211 | + 'tax_option', | |
| 212 | + 'tax_option.id = product_variant_option.option_id' | |
| 213 | + ) | |
| 214 | + ->innerJoin( | |
| 215 | + 'tax_option_lang', | |
| 216 | + 'tax_option_lang.tax_option_id = tax_option.id' | |
| 217 | + ) | |
| 218 | + ->innerJoin( | |
| 219 | + 'tax_group', | |
| 220 | + 'tax_group.id = tax_option.tax_group_id' | |
| 221 | + ) | |
| 222 | + ->innerJoin( | |
| 223 | + 'tax_group_lang', | |
| 224 | + 'tax_group_lang.tax_group_id = tax_group.id' | |
| 225 | + ) | |
| 226 | + ->where([ 'tax_group_lang.alias' => $key ]) | |
| 227 | + ->andWhere([ 'tax_option_lang.alias' => $param ]); | |
| 228 | + $variant_query->andWhere(['product_variant.id'=>$product_variant_id]); | |
| 229 | + } | |
| 230 | + | |
| 231 | + } | |
| 232 | + | |
| 233 | + | |
| 241 | 234 | if($in_stock) { |
| 242 | 235 | $variant_query->andWhere(['!=', 'product_variant.stock', 0]); |
| 243 | 236 | } |
| 244 | 237 | $product_query = ( new Query() )->distinct() |
| 245 | - ->select('product_option.product_id as products') | |
| 246 | - ->from('product_option') | |
| 247 | - ->innerJoin('tax_option', 'product_option.option_id = tax_option.id') | |
| 248 | - ->innerJoin( | |
| 249 | - 'tax_option_lang', | |
| 250 | - 'tax_option_lang.tax_option_id = tax_option.id' | |
| 251 | - ) | |
| 252 | - ->where( | |
| 253 | - [ 'tax_option_lang.alias' => $params ] | |
| 254 | - ) | |
| 255 | - ->union($variant_query); | |
| 256 | - $query = ( new Query() )->select('products') | |
| 257 | - ->from([ 'result_table' => $product_query ]); | |
| 258 | - if (!empty( $last_query )) { | |
| 259 | - $query->andWhere([ 'product.id' => $last_query ]); | |
| 238 | + ->select('product_option.product_id as products') | |
| 239 | + ->from('product_option') | |
| 240 | + ->innerJoin( | |
| 241 | + 'tax_option', | |
| 242 | + 'tax_option.id = product_option.option_id' | |
| 243 | + ) | |
| 244 | + ->innerJoin( | |
| 245 | + 'tax_option_lang', | |
| 246 | + 'tax_option_lang.tax_option_id = tax_option.id' | |
| 247 | + ) | |
| 248 | + ->innerJoin( | |
| 249 | + 'tax_group', | |
| 250 | + 'tax_group.id = tax_option.tax_group_id' | |
| 251 | + ) | |
| 252 | + ->innerJoin( | |
| 253 | + 'tax_group_lang', | |
| 254 | + 'tax_group_lang.tax_group_id = tax_group.id' | |
| 255 | + ); | |
| 256 | + foreach ($params as $key=>$param){ | |
| 257 | + $product_query | |
| 258 | + ->where([ 'tax_group_lang.alias' => $key ]) | |
| 259 | + ->andWhere([ 'tax_option_lang.alias' => $param ]); | |
| 260 | + | |
| 260 | 261 | } |
| 261 | - return $query; | |
| 262 | + | |
| 263 | + $query->andWhere([ 'product.id' => $product_query ]); | |
| 264 | + $query->andWhere([ 'product.id' => $variant_query ]); | |
| 265 | + | |
| 262 | 266 | } |
| 267 | + | |
| 268 | + | |
| 263 | 269 | |
| 264 | 270 | /** |
| 265 | 271 | * Fill $query with special filters (used in Product) | ... | ... |
models/ProductFrontendSearch.php
| ... | ... | @@ -4,6 +4,7 @@ |
| 4 | 4 | |
| 5 | 5 | use artweb\artbox\ecommerce\helpers\FilterHelper; |
| 6 | 6 | use artweb\artbox\ecommerce\models\Category; |
| 7 | + use artweb\artbox\language\models\Language; | |
| 7 | 8 | use yii\base\Model; |
| 8 | 9 | use yii\data\ActiveDataProvider; |
| 9 | 10 | use yii\data\ArrayDataProvider; |
| ... | ... | @@ -116,23 +117,17 @@ |
| 116 | 117 | |
| 117 | 118 | return $dataProvider; |
| 118 | 119 | } |
| 119 | - | |
| 120 | - public function getSearchQuery($category = null, $params = [], $in_stock = true) | |
| 120 | + | |
| 121 | + /** | |
| 122 | + * @param Category $category | |
| 123 | + * @param array $params | |
| 124 | + * @param bool $in_stock | |
| 125 | + * @return mixed | |
| 126 | + */ | |
| 127 | + public function getSearchQuery($category, $params = [], $in_stock = true) | |
| 121 | 128 | { |
| 122 | - | |
| 123 | - if (!empty( $category )) { | |
| 124 | - /** @var ActiveQuery $query */ | |
| 125 | - /**@var Category $category * */ | |
| 126 | - $query = $category->getProducts(); | |
| 127 | - | |
| 128 | - } else { | |
| 129 | - $query = Product::find() | |
| 130 | - ->joinWith( | |
| 131 | - [ | |
| 132 | - 'category.lang', | |
| 133 | - ] | |
| 134 | - ); | |
| 135 | - } | |
| 129 | + | |
| 130 | + $query = $category->getProducts(); | |
| 136 | 131 | |
| 137 | 132 | $query->select([ 'product.*' ]); |
| 138 | 133 | $query->joinWith( |
| ... | ... | @@ -175,9 +170,9 @@ |
| 175 | 170 | 'product_variant.price', |
| 176 | 171 | ] |
| 177 | 172 | ); |
| 178 | - | |
| 179 | - FilterHelper::setQueryParams($query, $params); | |
| 180 | - | |
| 173 | + | |
| 174 | + $lang = Language::getCurrent(); | |
| 175 | + FilterHelper::setQueryParams($query, $params, $category->id, $lang->id); | |
| 181 | 176 | return $query; |
| 182 | 177 | } |
| 183 | 178 | |
| ... | ... | @@ -189,21 +184,16 @@ |
| 189 | 184 | |
| 190 | 185 | public function priceLimits($category = null, $params = []) |
| 191 | 186 | { |
| 192 | - if (!empty( $category )) { | |
| 193 | - /** @var ActiveQuery $query */ | |
| 194 | - // $query = $category->getRelations('product_categories'); | |
| 195 | - $query = $category->getProducts(); | |
| 196 | - } else { | |
| 197 | - $query = Product::find(); | |
| 198 | - } | |
| 187 | + $query = $category->getProducts(); | |
| 199 | 188 | |
| 200 | 189 | $query->select(['MAX('.ProductVariant::tableName() . '.price) as max', 'MIN('.ProductVariant::tableName() . '.price) as min']); |
| 201 | 190 | $query->joinWith('variant'); |
| 202 | 191 | |
| 203 | 192 | // Price filter fix |
| 204 | 193 | unset( $params[ 'prices' ] ); |
| 205 | - | |
| 206 | - FilterHelper::setQueryParams($query, $params); | |
| 194 | + | |
| 195 | + $lang = Language::getCurrent(); | |
| 196 | + FilterHelper::setQueryParams($query, $params, $category->id, $lang->id); | |
| 207 | 197 | $query->andWhere( |
| 208 | 198 | [ |
| 209 | 199 | '>=', | ... | ... |