Commit 439a548391f274291578ab2485f7dbe6518442b2

Authored by Alexey Boroda
2 parents 2ad65823 04c33f07

Merge remote-tracking branch 'origin/master'

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
... ... @@ -98,7 +98,7 @@
98 98 $dataProvider = new ArrayDataProvider(
99 99 [
100 100 'allModels' => $this->getSearchQuery($category, $params, $in_stock)
101   - ->with('variant')->all(),
  101 + ->with('variant', 'videos')->all(),
102 102 'pagination' => [
103 103 'pageSize' => 10,
104 104 ],
... ...