Commit 72a1aa2da789ddf3685e2633b4e0e4b4f91d8fe3

Authored by Yarik
1 parent 18fd989c

Catalog optimize

models/Category.php
@@ -149,7 +149,7 @@ @@ -149,7 +149,7 @@
149 public function getProducts() 149 public function getProducts()
150 { 150 {
151 return $this->hasMany(Product::className(), [ 'id' => 'product_id' ]) 151 return $this->hasMany(Product::className(), [ 'id' => 'product_id' ])
152 - ->viaTable('product_category', [ 'category_id' => 'id' ]); 152 + ->viaTable('product_category', [ 'category_id' => 'id' ])->inverseOf('categories');
153 } 153 }
154 154
155 /** 155 /**
models/Product.php
@@ -121,7 +121,7 @@ @@ -121,7 +121,7 @@
121 'product_id' => 'id', 121 'product_id' => 'id',
122 ], 122 ],
123 'conditions' => [ 123 'conditions' => [
124 - 'product_variant_id' => null, 124 + 'product_image.product_variant_id' => null,
125 ], 125 ],
126 'model' => ProductImage::className(), 126 'model' => ProductImage::className(),
127 'config' => [ 127 'config' => [
@@ -365,7 +365,7 @@ @@ -365,7 +365,7 @@
365 public function getCategories() 365 public function getCategories()
366 { 366 {
367 return $this->hasMany(Category::className(), [ 'id' => 'category_id' ]) 367 return $this->hasMany(Category::className(), [ 'id' => 'category_id' ])
368 - ->viaTable('product_category', [ 'product_id' => 'id' ]); 368 + ->viaTable('product_category', [ 'product_id' => 'id' ])->inverseOf('products');
369 } 369 }
370 370
371 /** 371 /**
models/ProductFrontendSearch.php
1 <?php 1 <?php
2 -  
3 -namespace artweb\artbox\ecommerce\models;  
4 -  
5 -use artweb\artbox\ecommerce\helpers\FilterHelper;  
6 -use artweb\artbox\ecommerce\models\Category;  
7 -use yii\base\Model;  
8 -use yii\data\ActiveDataProvider;  
9 -use yii\data\ArrayDataProvider;  
10 -use yii\db\ActiveQuery;  
11 -  
12 -use artweb\artbox\ecommerce\models\Product;  
13 -use artweb\artbox\ecommerce\models\ProductVariant;  
14 -  
15 -class ProductFrontendSearch extends Product {  
16 -  
17 -  
18 - public $price_interval;  
19 - public $brands;  
20 -  
21 - public function behaviors() 2 +
  3 + namespace artweb\artbox\ecommerce\models;
  4 +
  5 + use artweb\artbox\ecommerce\helpers\FilterHelper;
  6 + use artweb\artbox\ecommerce\models\Category;
  7 + use yii\base\Model;
  8 + use yii\data\ActiveDataProvider;
  9 + use yii\data\ArrayDataProvider;
  10 + use yii\db\ActiveQuery;
  11 +
  12 + use artweb\artbox\ecommerce\models\Product;
  13 + use artweb\artbox\ecommerce\models\ProductVariant;
  14 +
  15 + class ProductFrontendSearch extends Product
22 { 16 {
23 - $behaviors = parent::behaviors();  
24 17
25 - if (isset($behaviors['language'])) 18 + public $price_interval;
  19 + public $brands;
  20 +
  21 + public function behaviors()
26 { 22 {
27 - unset($behaviors['language']); 23 + $behaviors = parent::behaviors();
  24 +
  25 + if (isset( $behaviors[ 'language' ] )) {
  26 + unset( $behaviors[ 'language' ] );
  27 + }
  28 + return $behaviors;
28 } 29 }
29 - return $behaviors;  
30 - }  
31 -  
32 - /**  
33 - * @inheritdoc  
34 - */  
35 - public function rules()  
36 - {  
37 - return [  
38 - [['price_interval', 'brands'], 'safe'],  
39 - ];  
40 - }  
41 -  
42 - /**  
43 - * @inheritdoc  
44 - */  
45 - public function scenarios()  
46 - {  
47 - // bypass scenarios() implementation in the parent class  
48 - return Model::scenarios();  
49 - }  
50 -  
51 - /**  
52 - * Creates data provider instance with search query applied for frontend  
53 - *  
54 - * @param array $params  
55 - *  
56 - * @return ArrayDataProvider  
57 - */  
58 - public function search($category = null, $params = [], $in_stock = true) {  
59 -  
60 -  
61 - $dataProvider = new ArrayDataProvider([  
62 - 'allModels' => $this->getSearchQuery($category, $params, $in_stock)->with([  
63 - 'images',  
64 - 'variant',  
65 - 'variant.image',  
66 - 'comments',  
67 -// 'averageRating',  
68 - ])->all(),  
69 - 'pagination' => [  
70 - 'pageSize' => 15,  
71 - ],  
72 - 'sort' => [  
73 - 'attributes' => [  
74 - 'name_asc' => [  
75 - 'asc' => ['name' => SORT_ASC],  
76 - 'desc' => ['name' => SORT_ASC],  
77 - 'default' => SORT_ASC,  
78 - 'label' => 'ะธะผะตะฝะธ ะพั‚ ะ ะดะพ ะฏ',  
79 - ],  
80 - 'name_desc' => [  
81 - 'asc' => ['name' => SORT_DESC],  
82 - 'desc' => ['name' => SORT_DESC],  
83 - 'default' => SORT_DESC,  
84 - 'label' => 'ะธะผะตะฝะธ ะพั‚ ะฏ ะดะพ ะ',  
85 - ],  
86 - 'price' => [  
87 - 'asc' => ['price' => SORT_ASC],  
88 - 'desc' => ['price' => SORT_DESC],  
89 - 'default' => SORT_DESC,  
90 - 'label' => 'ะฟะพ ั†ะตะฝะต', 30 +
  31 + /**
  32 + * @inheritdoc
  33 + */
  34 + public function rules()
  35 + {
  36 + return [
  37 + [
  38 + [
  39 + 'price_interval',
  40 + 'brands',
91 ], 41 ],
  42 + 'safe',
92 ], 43 ],
93 - ]  
94 - ]); 44 + ];
  45 + }
  46 +
  47 + /**
  48 + * @inheritdoc
  49 + */
  50 + public function scenarios()
  51 + {
  52 + // bypass scenarios() implementation in the parent class
  53 + return Model::scenarios();
  54 + }
95 55
96 -  
97 - return $dataProvider;  
98 - }  
99 -  
100 - public function getSearchQuery($category = null, $params = [], $in_stock = true) {  
101 -  
102 - if (!empty($category)) {  
103 - /** @var ActiveQuery $query */  
104 - /**@var Category $category **/  
105 - $query = $category->getProducts();  
106 -  
107 - } else {  
108 - $query = Product::find(); 56 + /**
  57 + * Creates data provider instance with search query applied for frontend
  58 + *
  59 + * @param array $params
  60 + *
  61 + * @return ArrayDataProvider
  62 + */
  63 + public function search($category = null, $params = [], $in_stock = true)
  64 + {
  65 +
  66 + $dataProvider = new ArrayDataProvider(
  67 + [
  68 + 'allModels' => $this->getSearchQuery($category, $params, $in_stock)
  69 + ->all(),
  70 + 'pagination' => [
  71 + 'pageSize' => 10,
  72 + ],
  73 + 'sort' => [
  74 + 'attributes' => [
  75 + 'name_asc' => [
  76 + 'asc' => [ 'name' => SORT_ASC ],
  77 + 'desc' => [ 'name' => SORT_ASC ],
  78 + 'default' => SORT_ASC,
  79 + 'label' => 'ะธะผะตะฝะธ ะพั‚ ะ ะดะพ ะฏ',
  80 + ],
  81 + 'name_desc' => [
  82 + 'asc' => [ 'name' => SORT_DESC ],
  83 + 'desc' => [ 'name' => SORT_DESC ],
  84 + 'default' => SORT_DESC,
  85 + 'label' => 'ะธะผะตะฝะธ ะพั‚ ะฏ ะดะพ ะ',
  86 + ],
  87 + 'price' => [
  88 + 'asc' => [ 'price' => SORT_ASC ],
  89 + 'desc' => [ 'price' => SORT_DESC ],
  90 + 'default' => SORT_DESC,
  91 + 'label' => 'ะฟะพ ั†ะตะฝะต',
  92 + ],
  93 + ],
  94 + ],
  95 + ]
  96 + );
  97 +
  98 + return $dataProvider;
109 } 99 }
110 -  
111 - $query->select(['product.*']);  
112 - $query->joinWith(['enabledVariants.lang','brand','options', 'category']);  
113 -  
114 - $query->groupBy(['product.id', 'product_variant.price']);  
115 -  
116 - FilterHelper::setQueryParams($query, $params);  
117 - if($in_stock){  
118 - $query->andWhere(['>=', ProductVariant::tableName() .'.stock', 1]); 100 +
  101 + public function getSearchQuery($category = null, $params = [], $in_stock = true)
  102 + {
  103 +
  104 + if (!empty( $category )) {
  105 + /** @var ActiveQuery $query */
  106 + /**@var Category $category * */
  107 + $query = $category->getProducts();
  108 +
  109 + } else {
  110 + $query = Product::find();
  111 + }
  112 +
  113 + $query->select([ 'product.*' ]);
  114 + $query->joinWith(
  115 + [
  116 + 'lang',
  117 + 'brand.lang',
  118 + 'options',
  119 + ]
  120 + )
  121 + ->innerJoinWith(
  122 + [
  123 + 'enabledVariants' => function ($query) {
  124 + /**
  125 + * @var ActiveQuery $query
  126 + */
  127 + $query->joinWith('lang')
  128 + ->with('images');
  129 + },
  130 + ]
  131 + );
  132 +
  133 + $query->groupBy(
  134 + [
  135 + 'product.id',
  136 + 'product_variant.price',
  137 + ]
  138 + );
  139 +
  140 + FilterHelper::setQueryParams($query, $params);
  141 + if ($in_stock) {
  142 + $query->andWhere(
  143 + [
  144 + '>=',
  145 + ProductVariant::tableName() . '.stock',
  146 + 1,
  147 + ]
  148 + );
  149 + }
  150 +
  151 + return $query;
119 } 152 }
120 -  
121 -  
122 - return $query;  
123 - }  
124 -  
125 -  
126 - /**  
127 - * @param Category|null $category  
128 - * @return array  
129 - */  
130 -  
131 - public function priceLimits($category = null) {  
132 - if (!empty($category)) {  
133 - /** @var ActiveQuery $query */  
134 - $query = $category->getProducts();  
135 - } else {  
136 - $query = Product::find(); 153 +
  154 + /**
  155 + * @param Category|null $category
  156 + *
  157 + * @return array
  158 + */
  159 +
  160 + public function priceLimits($category = null)
  161 + {
  162 + if (!empty( $category )) {
  163 + /** @var ActiveQuery $query */
  164 + $query = $category->getProducts();
  165 + } else {
  166 + $query = Product::find();
  167 + }
  168 + $query->joinWith('variant');
  169 +
  170 + return [
  171 + 'min' => $query->min(ProductVariant::tableName() . '.price'),
  172 + 'max' => $query->max(ProductVariant::tableName() . '.price'),
  173 + ];
137 } 174 }
138 - $query->joinWith('variant');  
139 -  
140 - return [  
141 - 'min' => $query->min(ProductVariant::tableName() .'.price'),  
142 - 'max' => $query->max(ProductVariant::tableName() .'.price'),  
143 - ];  
144 - }  
145 -}  
146 \ No newline at end of file 175 \ No newline at end of file
  176 + }
147 \ No newline at end of file 177 \ No newline at end of file