Commit 2f5c8d1163900a70aca795cf6c8c266361902480

Authored by Administrator
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 '>=',
... ...