Commit cb55aee82f5837e976b29eec4d63505317c6d88a
1 parent
ad348101
add variantSku
Showing
1 changed file
with
90 additions
and
67 deletions
Show diff stats
helpers/FilterHelper.php
| @@ -111,6 +111,69 @@ | @@ -111,6 +111,69 @@ | ||
| 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 | + /** | ||
| 142 | + * @param $key | ||
| 143 | + * @param array $param | ||
| 144 | + * @param ActiveQuery $query | ||
| 145 | + */ | ||
| 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 | + | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + | ||
| 114 | /** | 177 | /** |
| 115 | * Fill query with filter conditions | 178 | * Fill query with filter conditions |
| 116 | * | 179 | * |
| @@ -123,24 +186,22 @@ | @@ -123,24 +186,22 @@ | ||
| 123 | foreach ($params as $key => $param) { | 186 | foreach ($params as $key => $param) { |
| 124 | switch ($key) { | 187 | switch ($key) { |
| 125 | case 'special': | 188 | case 'special': |
| 126 | - unset($params[$key]); | ||
| 127 | self::filterSpecial($param, $query); | 189 | self::filterSpecial($param, $query); |
| 128 | break; | 190 | break; |
| 129 | case 'brands': | 191 | case 'brands': |
| 130 | - unset($params[$key]); | ||
| 131 | self::filterBrands($param, $query); | 192 | self::filterBrands($param, $query); |
| 132 | break; | 193 | break; |
| 133 | case 'keywords': | 194 | case 'keywords': |
| 134 | - unset($params[$key]); | ||
| 135 | self::filterKeywords($param, $query); | 195 | self::filterKeywords($param, $query); |
| 136 | break; | 196 | break; |
| 137 | case 'prices': | 197 | case 'prices': |
| 138 | - unset($params[$key]); | ||
| 139 | self::filterPrices($param, $query); | 198 | self::filterPrices($param, $query); |
| 140 | break; | 199 | break; |
| 200 | + default: | ||
| 201 | + $last_query = self::filterOptions($param, $last_query); | ||
| 202 | + break; | ||
| 141 | } | 203 | } |
| 142 | } | 204 | } |
| 143 | - $last_query = self::filterOptions($params, $last_query); | ||
| 144 | // If tax option filters were provided filter query with them | 205 | // If tax option filters were provided filter query with them |
| 145 | if (!empty( $last_query )) { | 206 | if (!empty( $last_query )) { |
| 146 | $query->andWhere([ 'product.id' => $last_query ]); | 207 | $query->andWhere([ 'product.id' => $last_query ]); |
| @@ -148,84 +209,46 @@ | @@ -148,84 +209,46 @@ | ||
| 148 | } | 209 | } |
| 149 | 210 | ||
| 150 | 211 | ||
| 151 | - | ||
| 152 | - | 212 | + |
| 153 | /** | 213 | /** |
| 154 | * Tax Option filter | 214 | * Tax Option filter |
| 155 | * | 215 | * |
| 156 | * @param string[] $params | 216 | * @param string[] $params |
| 157 | * @param \yii\db\Query|null $last_query | 217 | * @param \yii\db\Query|null $last_query |
| 158 | - * @param bool $in_stock | ||
| 159 | * | 218 | * |
| 160 | - * @return \yii\db\Query | 219 | + * @return Query |
| 161 | */ | 220 | */ |
| 162 | - private static function filterOptions(array $params, Query $last_query = null, bool $in_stock = true): Query | 221 | + private static function filterOptions(array $params, Query $last_query = null): Query |
| 163 | { | 222 | { |
| 223 | + | ||
| 164 | $variant_query = ( new Query() )->distinct() | 224 | $variant_query = ( new Query() )->distinct() |
| 165 | ->select('product_variant.product_id as products') | 225 | ->select('product_variant.product_id as products') |
| 166 | ->from('product_variant_option') | 226 | ->from('product_variant_option') |
| 167 | ->innerJoin( | 227 | ->innerJoin( |
| 168 | 'product_variant', | 228 | 'product_variant', |
| 169 | 'product_variant_option.product_variant_id = product_variant.id' | 229 | 'product_variant_option.product_variant_id = product_variant.id' |
| 170 | - ); | ||
| 171 | - | ||
| 172 | - foreach ($params as $key=>$param){ | ||
| 173 | - $product_variant_id = ( new Query() )->distinct()->select('product_variant_option.product_variant_id as id') | ||
| 174 | - ->from('product_variant_option') | ||
| 175 | - ->innerJoin( | ||
| 176 | - 'tax_option', | ||
| 177 | - 'tax_option.id = product_variant_option.option_id' | ||
| 178 | - ) | ||
| 179 | - ->innerJoin( | ||
| 180 | - 'tax_option_lang', | ||
| 181 | - 'tax_option_lang.tax_option_id = tax_option.id' | ||
| 182 | - ) | ||
| 183 | - ->innerJoin( | ||
| 184 | - 'tax_group', | ||
| 185 | - 'tax_group.id = tax_option.tax_group_id' | ||
| 186 | - ) | ||
| 187 | - ->innerJoin( | ||
| 188 | - 'tax_group_lang', | ||
| 189 | - 'tax_group_lang.tax_group_id = tax_group.id' | ||
| 190 | - ) | ||
| 191 | - ->where([ 'tax_group_lang.alias' => $key ]) | ||
| 192 | - ->andWhere([ 'tax_option_lang.alias' => $param ]); | ||
| 193 | - $variant_query->andWhere(['product_variant_option.product_variant_id'=>$product_variant_id]); | ||
| 194 | - | ||
| 195 | - } | ||
| 196 | - | ||
| 197 | - | ||
| 198 | - if($in_stock) { | ||
| 199 | - $variant_query->andWhere(['!=', 'product_variant.stock', 0]); | ||
| 200 | - } | 230 | + ) |
| 231 | + ->innerJoin( | ||
| 232 | + 'tax_option', | ||
| 233 | + 'tax_option.id = product_variant_option.option_id' | ||
| 234 | + ) | ||
| 235 | + ->innerJoin( | ||
| 236 | + 'tax_option_lang', | ||
| 237 | + 'tax_option_lang.tax_option_id = tax_option.id' | ||
| 238 | + ) | ||
| 239 | + ->where([ 'tax_option_lang.alias' => $params ]); | ||
| 201 | $product_query = ( new Query() )->distinct() | 240 | $product_query = ( new Query() )->distinct() |
| 202 | ->select('product_option.product_id as products') | 241 | ->select('product_option.product_id as products') |
| 203 | - ->from('product_option'); | ||
| 204 | - foreach ($params as $key=>$param){ | ||
| 205 | - $product_id = ( new Query() )->distinct()->select('product_option.product_id as id') | ||
| 206 | - ->from('product_option') | ||
| 207 | - ->innerJoin( | ||
| 208 | - 'tax_option', | ||
| 209 | - 'tax_option.id = product_option.option_id' | ||
| 210 | - ) | ||
| 211 | - ->innerJoin( | ||
| 212 | - 'tax_option_lang', | ||
| 213 | - 'tax_option_lang.tax_option_id = tax_option.id' | ||
| 214 | - ) | ||
| 215 | - ->innerJoin( | ||
| 216 | - 'tax_group', | ||
| 217 | - 'tax_group.id = tax_option.tax_group_id' | ||
| 218 | - ) | ||
| 219 | - ->innerJoin( | ||
| 220 | - 'tax_group_lang', | ||
| 221 | - 'tax_group_lang.tax_group_id = tax_group.id' | ||
| 222 | - ) | ||
| 223 | - ->where([ 'tax_group_lang.alias' => $key ]) | ||
| 224 | - ->andWhere([ 'tax_option_lang.alias' => $param ]); | ||
| 225 | - $product_query->andWhere(['product_option.product_id'=>$product_id]); | ||
| 226 | - | ||
| 227 | - } | ||
| 228 | - $product_query->union($variant_query); | 242 | + ->from('product_option') |
| 243 | + ->innerJoin('tax_option', 'product_option.option_id = tax_option.id') | ||
| 244 | + ->innerJoin( | ||
| 245 | + 'tax_option_lang', | ||
| 246 | + 'tax_option_lang.tax_option_id = tax_option.id' | ||
| 247 | + ) | ||
| 248 | + ->where( | ||
| 249 | + [ 'tax_option_lang.alias' => $params ] | ||
| 250 | + ) | ||
| 251 | + ->union($variant_query); | ||
| 229 | $query = ( new Query() )->select('products') | 252 | $query = ( new Query() )->select('products') |
| 230 | ->from([ 'result_table' => $product_query ]); | 253 | ->from([ 'result_table' => $product_query ]); |
| 231 | if (!empty( $last_query )) { | 254 | if (!empty( $last_query )) { |