Commit 439a548391f274291578ab2485f7dbe6518442b2
Merge remote-tracking branch 'origin/master'
Showing
3 changed files
with
130 additions
and
6 deletions
Show diff stats
helpers/ProductHelper.php
... | ... | @@ -4,6 +4,8 @@ |
4 | 4 | |
5 | 5 | use artweb\artbox\ecommerce\models\Category; |
6 | 6 | use artweb\artbox\ecommerce\models\Product; |
7 | + use yii\base\InvalidConfigException; | |
8 | + use yii\base\InvalidParamException; | |
7 | 9 | use yii\base\Object; |
8 | 10 | use Yii; |
9 | 11 | use yii\db\ActiveQuery; |
... | ... | @@ -23,7 +25,7 @@ |
23 | 25 | } |
24 | 26 | |
25 | 27 | /** |
26 | - * Add $product_id to last products in session. Limit 16 products. | |
28 | + * Add $product_id to last products in session. | |
27 | 29 | * |
28 | 30 | * @param int $product_id |
29 | 31 | */ |
... | ... | @@ -32,9 +34,6 @@ |
32 | 34 | $last_products = self::getLastProducts(); |
33 | 35 | if (!in_array($product_id, $last_products)) { |
34 | 36 | $last_products[] = intval($product_id); |
35 | - if (count($last_products) > 16) { | |
36 | - array_shift($last_products); | |
37 | - } | |
38 | 37 | Yii::$app->session->set('last_products', $last_products); |
39 | 38 | } |
40 | 39 | } |
... | ... | @@ -52,7 +51,17 @@ |
52 | 51 | $last_products = Yii::$app->session->get('last_products', []); |
53 | 52 | if ($as_object) { |
54 | 53 | $last_products = Product::find() |
55 | - ->joinWith([ 'variant' ]) | |
54 | + ->innerJoinWith( | |
55 | + [ | |
56 | + 'enabledVariants' => function ($query) { | |
57 | + /** | |
58 | + * @var ActiveQuery $query | |
59 | + */ | |
60 | + $query->joinWith('lang') | |
61 | + ->with('images'); | |
62 | + }, | |
63 | + ] | |
64 | + ) | |
56 | 65 | ->where([ 'product.id' => $last_products ]) |
57 | 66 | ->andWhere( |
58 | 67 | [ |
... | ... | @@ -66,6 +75,19 @@ |
66 | 75 | } |
67 | 76 | return array_reverse($last_products); |
68 | 77 | } |
78 | + | |
79 | + | |
80 | + public static function trueWordForm($num, $form_for_1, $form_for_2, $form_for_5){ | |
81 | + $num = abs($num) % 100; | |
82 | + $num_x = $num % 10; | |
83 | + if ($num > 10 && $num < 20) | |
84 | + return $form_for_5; | |
85 | + if ($num_x > 1 && $num_x < 5) | |
86 | + return $form_for_2; | |
87 | + if ($num_x == 1) | |
88 | + return $form_for_1; | |
89 | + return $form_for_5; | |
90 | + } | |
69 | 91 | |
70 | 92 | /** |
71 | 93 | * Get special Products array with ProductVariants, which are in stock |
... | ... | @@ -181,4 +203,95 @@ |
181 | 203 | { |
182 | 204 | return \Yii::$app->session->get('last_category_id'); |
183 | 205 | } |
206 | + | |
207 | + /** | |
208 | + * Group Product[] by Categories | |
209 | + * Array of categories with 2 levels: | |
210 | + * <code> | |
211 | + * [ | |
212 | + * 'parent_id' => [ | |
213 | + * 'id', | |
214 | + * 'name', | |
215 | + * 'count', | |
216 | + * 'children' => [ | |
217 | + * 'id' => [ | |
218 | + * 'id', | |
219 | + * 'name', | |
220 | + * 'count', | |
221 | + * ] | |
222 | + * ] | |
223 | + * ] | |
224 | + * ] | |
225 | + * </code> | |
226 | + * | |
227 | + * @param Product[] $products | |
228 | + * | |
229 | + * @return array | |
230 | + * @throws InvalidConfigException | |
231 | + */ | |
232 | + public static function groupByCategories(array $products): array | |
233 | + { | |
234 | + $categoryList = []; | |
235 | + foreach ($products as $product) { | |
236 | + if (!( $product instanceof Product )) { | |
237 | + throw new InvalidParamException('$products must be array of ' . Product::className()); | |
238 | + } | |
239 | + foreach ($product->categories as $category) { | |
240 | + /** | |
241 | + * @var Category|null $parentCategory | |
242 | + */ | |
243 | + $parentCategory = $category->parentAR; | |
244 | + /* If category has parent add current category to parents children array, | |
245 | + else create current category as root category */ | |
246 | + if ($parentCategory) { | |
247 | + /* If parent category already in $categoryList search current category in its array, | |
248 | + else create it in $categoryList and add current category to it */ | |
249 | + if (array_key_exists($parentCategory->id, $categoryList)) { | |
250 | + /* If current category already in parent category array increament count by 1, | |
251 | + else add current category to parent category children array */ | |
252 | + if (array_key_exists($category->id, $categoryList[ $parentCategory->id ][ 'children' ])) { | |
253 | + $categoryList[ $parentCategory->id ][ 'children' ][ $category->id ][ 'count' ] += 1; | |
254 | + } else { | |
255 | + $categoryList[ $parentCategory->id ][ 'children' ][ $category->id ] = [ | |
256 | + 'id' => $category->id, | |
257 | + 'name' => $category->lang->title, | |
258 | + 'alias' => $category->lang->alias, | |
259 | + 'count' => 1, | |
260 | + ]; | |
261 | + } | |
262 | + } else { | |
263 | + $categoryList[ $parentCategory->id ] = [ | |
264 | + 'id' => $parentCategory->id, | |
265 | + 'name' => $parentCategory->lang->title, | |
266 | + 'alias' => $parentCategory->lang->alias, | |
267 | + 'children' => [ | |
268 | + $category->id => [ | |
269 | + 'id' => $category->id, | |
270 | + 'name' => $category->lang->title, | |
271 | + 'alias' => $category->lang->alias, | |
272 | + 'count' => 1, | |
273 | + ], | |
274 | + ], | |
275 | + 'count' => 0, | |
276 | + ]; | |
277 | + } | |
278 | + } else { | |
279 | + /* If current category already in $categoryList increment its count by 1, | |
280 | + else add it to $categoryList */ | |
281 | + if (array_key_exists($category->id, $categoryList)) { | |
282 | + $categoryList[ $category->id ][ 'count' ] += 1; | |
283 | + } else { | |
284 | + $categoryList[ $category->id ] = [ | |
285 | + 'id' => $category->id, | |
286 | + 'name' => $category->lang->title, | |
287 | + 'alias' => $category->lang->alias, | |
288 | + 'count' => 1, | |
289 | + 'children' => [], | |
290 | + ]; | |
291 | + } | |
292 | + } | |
293 | + } | |
294 | + } | |
295 | + return $categoryList; | |
296 | + } | |
184 | 297 | } |
185 | 298 | \ No newline at end of file | ... | ... |
models/Category.php
... | ... | @@ -31,6 +31,7 @@ |
31 | 31 | * @property Brand[] $brands |
32 | 32 | * @property TaxGroup[] $taxGroups |
33 | 33 | * @property Category[] $siblings |
34 | + * @property Category $parentAR | |
34 | 35 | * * From language behavior * |
35 | 36 | * @property CategoryLang $lang |
36 | 37 | * @property CategoryLang[] $langs |
... | ... | @@ -334,4 +335,14 @@ |
334 | 335 | ] |
335 | 336 | ); |
336 | 337 | } |
338 | + | |
339 | + /** | |
340 | + * Return Active query to obtain parent category | |
341 | + * | |
342 | + * @return ActiveQuery | |
343 | + */ | |
344 | + public function getParentAR() | |
345 | + { | |
346 | + return $this->hasOne(self::className(), [ 'id' => 'parent_id' ]); | |
347 | + } | |
337 | 348 | } | ... | ... |
models/ProductFrontendSearch.php