Blame view

models/ProductFrontendSearch.php 7.71 KB
8a7e6ecf   Yarik   Namespaces
1
  <?php

72a1aa2d   Yarik   Catalog optimize
2
3
4
      

      namespace artweb\artbox\ecommerce\models;

      

8b83e9d1   Administrator   add variantSku
5
      use artweb\artbox\ecommerce\helpers\CatalogFilterHelper;

72a1aa2d   Yarik   Catalog optimize
6
7
      use artweb\artbox\ecommerce\helpers\FilterHelper;

      use artweb\artbox\ecommerce\models\Category;

ee3dba29   Administrator   add variantSku
8
      use artweb\artbox\language\models\Language;

72a1aa2d   Yarik   Catalog optimize
9
10
11
      use yii\base\Model;

      use yii\data\ActiveDataProvider;

      use yii\data\ArrayDataProvider;

183a715c   Yarik   Sort fix
12
      use yii\data\Sort;

72a1aa2d   Yarik   Catalog optimize
13
14
15
16
      use yii\db\ActiveQuery;

      

      use artweb\artbox\ecommerce\models\Product;

      use artweb\artbox\ecommerce\models\ProductVariant;

d75b9d34   Administrator   add variantSku
17
18
      use yii\helpers\ArrayHelper;

  

72a1aa2d   Yarik   Catalog optimize
19
      class ProductFrontendSearch extends Product

8a7e6ecf   Yarik   Namespaces
20
      {

8a7e6ecf   Yarik   Namespaces
21
          

72a1aa2d   Yarik   Catalog optimize
22
23
24
25
          public $price_interval;

          public $brands;

          

          public function behaviors()

8a7e6ecf   Yarik   Namespaces
26
          {

72a1aa2d   Yarik   Catalog optimize
27
28
29
30
31
32
              $behaviors = parent::behaviors();

              

              if (isset( $behaviors[ 'language' ] )) {

                  unset( $behaviors[ 'language' ] );

              }

              return $behaviors;

8a7e6ecf   Yarik   Namespaces
33
          }

72a1aa2d   Yarik   Catalog optimize
34
35
36
37
38
39
40
41
42
43
44
          

          /**

           * @inheritdoc

           */

          public function rules()

          {

              return [

                  [

                      [

                          'price_interval',

                          'brands',

8a7e6ecf   Yarik   Namespaces
45
                      ],

72a1aa2d   Yarik   Catalog optimize
46
                      'safe',

8a7e6ecf   Yarik   Namespaces
47
                  ],

72a1aa2d   Yarik   Catalog optimize
48
49
50
51
52
53
54
55
56
57
58
              ];

          }

          

          /**

           * @inheritdoc

           */

          public function scenarios()

          {

              // bypass scenarios() implementation in the parent class

              return Model::scenarios();

          }

4a447a24   Yarik   Catalog begin
59
          

72a1aa2d   Yarik   Catalog optimize
60
61
62
63
64
          /**

           * Creates data provider instance with search query applied for frontend

           *

           * @param array $params

           *

f447738b   Administrator   add variantSku
65
           * @return ActiveDataProvider

72a1aa2d   Yarik   Catalog optimize
66
67
68
69
           */

          public function search($category = null, $params = [], $in_stock = true)

          {

              

183a715c   Yarik   Sort fix
70
71
72
              $sort = new Sort(

                  [

                      'attributes' => [

bf70a380   Yarik   Not in stock
73
                          'name_asc'   => [

f447738b   Administrator   add variantSku
74
75
                              'asc'     => [ 'product_lang.title' => SORT_ASC ],

                              'desc'    => [ 'product_lang.title' => SORT_ASC ],

183a715c   Yarik   Sort fix
76
77
78
                              'default' => SORT_ASC,

                              'label'   => 'имени от А до Я',

                          ],

bf70a380   Yarik   Not in stock
79
                          'name_desc'  => [

f447738b   Administrator   add variantSku
80
81
                              'asc'     => [ 'product_lang.title' => SORT_DESC ],

                              'desc'    => [ 'product_lang.title' => SORT_DESC ],

183a715c   Yarik   Sort fix
82
83
84
                              'default' => SORT_DESC,

                              'label'   => 'имени от Я до А',

                          ],

bf70a380   Yarik   Not in stock
85
                          'price_asc'  => [

f447738b   Administrator   add variantSku
86
87
                              'asc'     => [ 'product_variant.price' => SORT_ASC ],

                              'desc'    => [ 'product_variant.price' => SORT_ASC ],

f4e641d8   Yarik   Order frontend
88
89
90
                              'default' => SORT_ASC,

                              'label'   => 'по цене по возрастанию',

                          ],

bf70a380   Yarik   Not in stock
91
                          'price_desc' => [

f447738b   Administrator   add variantSku
92
93
                              'asc'     => [ 'product_variant.price' => SORT_DESC ],

                              'desc'    => [ 'product_variant.price' => SORT_DESC ],

183a715c   Yarik   Sort fix
94
                              'default' => SORT_DESC,

f4e641d8   Yarik   Order frontend
95
                              'label'   => 'по цене по уменшению',

183a715c   Yarik   Sort fix
96
97
98
99
                          ],

                      ],

                  ]

              );

bf70a380   Yarik   Not in stock
100
              

ac8d2b24   Administrator   add variantSku
101
              $dataProvider = new ActiveDataProvider(

72a1aa2d   Yarik   Catalog optimize
102
                  [

bf70a380   Yarik   Not in stock
103
                      'query'      => $this->getSearchQuery($category, $params, $in_stock)

a6a5ff12   Administrator   add variantSku
104
                                           ->with('variant', 'videos','category.lang')

bf70a380   Yarik   Not in stock
105
106
107
108
109
110
111
                                           ->groupBy(

                                               [

                                                   'product_lang.title',

                                                   'product_variant.price',

                                                   'product.id',

                                               ]

                                           ),

72a1aa2d   Yarik   Catalog optimize
112
                      'pagination' => [

66386df5   Administrator   add variantSku
113
                          'pageSize' => 9,

72a1aa2d   Yarik   Catalog optimize
114
                      ],

183a715c   Yarik   Sort fix
115
                      'sort'       => $sort,

72a1aa2d   Yarik   Catalog optimize
116
117
118
119
                  ]

              );

              

              return $dataProvider;

8a7e6ecf   Yarik   Namespaces
120
          }

2f5c8d11   Administrator   add variantSku
121
  

ee3dba29   Administrator   add variantSku
122
123
124
125
126
127
128
129
  

          /**

           * @param Category $category

           * @param array $params

           * @param bool $in_stock

           * @return mixed

           */

          public function getSearchQuery($category, $params = [], $in_stock = true)

72a1aa2d   Yarik   Catalog optimize
130
          {

2f5c8d11   Administrator   add variantSku
131
  

ee3dba29   Administrator   add variantSku
132
              $query = $category->getProducts();

c3d12ab0   Administrator   add variantSku
133
  

72a1aa2d   Yarik   Catalog optimize
134
135
136
137
138
139
140
141
              

              $query->select([ 'product.*' ]);

              $query->joinWith(

                  [

                      'lang',

                      'brand.lang',

                      'options',

                  ]

bf70a380   Yarik   Not in stock
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
              );

              

              if ($in_stock) {

                  $query->innerJoinWith(

                      [

                          'enabledVariants' => function ($query) {

                              /**

                               * @var ActiveQuery $query

                               */

                              $query->joinWith('lang')

                                    ->with('images');

                          },

                      ]

                  );

              } else {

                  $query->innerJoinWith(

                      [

                          'variants' => function ($query) {

                              /**

                               * @var ActiveQuery $query

                               */

                              $query->joinWith('lang')

                                    ->with('images');

                          },

                      ]

                  );

              }

72a1aa2d   Yarik   Catalog optimize
169
170
171
172
173
174
175
              

              $query->groupBy(

                  [

                      'product.id',

                      'product_variant.price',

                  ]

              );

2f5c8d11   Administrator   add variantSku
176
  

ee3dba29   Administrator   add variantSku
177
              $lang = Language::getCurrent();

8b83e9d1   Administrator   add variantSku
178
179
180
181
182
183
184
185
186
187
188
189
190
  

              /**

               * @var $catalog \yii\elasticsearch\Query;

               */

              if($params){

                  $catalog = CatalogFilterHelper::setQueryParams($params, $category->id, $lang->id);

                  $catalog->limit(9999);

                  $catalog->createCommand();

                  $result = $catalog->column('id');

                  $query->andWhere(['product.id'=>$result]);

              }

  

  

72a1aa2d   Yarik   Catalog optimize
191
              return $query;

8a7e6ecf   Yarik   Namespaces
192
          }

72a1aa2d   Yarik   Catalog optimize
193
194
195
196
197
198
          

          /**

           * @param Category|null $category

           *

           * @return array

           */

bf70a380   Yarik   Not in stock
199
200
201
          

          public function priceLimits($category = null, $params = [])

          {

c3d12ab0   Administrator   add variantSku
202
203
204
205
206
207
208
              if (!empty( $category )) {

                  /** @var ActiveQuery $query */

                  //            $query = $category->getRelations('product_categories');

                  $query = $category->getProducts();

              } else {

                  $query = Product::find();

              }

d75b9d34   Administrator   add variantSku
209
  

8b83e9d1   Administrator   add variantSku
210
211
  

  

d75b9d34   Administrator   add variantSku
212
              $query->select(['MAX('.ProductVariant::tableName() . '.price) as max', 'MIN('.ProductVariant::tableName() . '.price) as min']);

72a1aa2d   Yarik   Catalog optimize
213
              $query->joinWith('variant');

8b83e9d1   Administrator   add variantSku
214
  

93015018   Administrator   full commit
215
              // Price filter fix

bf70a380   Yarik   Not in stock
216
              unset( $params[ 'prices' ] );

ee3dba29   Administrator   add variantSku
217
              $lang = Language::getCurrent();

8b83e9d1   Administrator   add variantSku
218
219
220
221
222
223
224
225
226
227
228
229
230
  

              /**

               * @var $catalog \yii\elasticsearch\Query;

               */

              if($params){

                  $catalog = CatalogFilterHelper::setQueryParams($params, $category->id, $lang->id);

                  $catalog->limit(9999);

                  $catalog->createCommand();

                  $result = $catalog->column('id');

                  $query->andWhere(['product.id'=>$result]);

              }

  

  

d75b9d34   Administrator   add variantSku
231
              return $query->one();

8a7e6ecf   Yarik   Namespaces
232
          }

72a1aa2d   Yarik   Catalog optimize
233
      }