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 )) { |