Blame view

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

72a1aa2d   Yarik   Catalog optimize
2
3
4
5
6
7
8
9
      

      namespace artweb\artbox\ecommerce\models;

      

      use artweb\artbox\ecommerce\helpers\FilterHelper;

      use artweb\artbox\ecommerce\models\Category;

      use yii\base\Model;

      use yii\data\ActiveDataProvider;

      use yii\data\ArrayDataProvider;

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

72a1aa2d   Yarik   Catalog optimize
11
12
13
14
      use yii\db\ActiveQuery;

      

      use artweb\artbox\ecommerce\models\Product;

      use artweb\artbox\ecommerce\models\ProductVariant;

d75b9d34   Administrator   add variantSku
15
16
      use yii\helpers\ArrayHelper;

  

72a1aa2d   Yarik   Catalog optimize
17
      class ProductFrontendSearch extends Product

8a7e6ecf   Yarik   Namespaces
18
      {

8a7e6ecf   Yarik   Namespaces
19
          

72a1aa2d   Yarik   Catalog optimize
20
21
22
23
          public $price_interval;

          public $brands;

          

          public function behaviors()

8a7e6ecf   Yarik   Namespaces
24
          {

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

              

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

                  unset( $behaviors[ 'language' ] );

              }

              return $behaviors;

8a7e6ecf   Yarik   Namespaces
31
          }

72a1aa2d   Yarik   Catalog optimize
32
33
34
35
36
37
38
39
40
41
42
          

          /**

           * @inheritdoc

           */

          public function rules()

          {

              return [

                  [

                      [

                          'price_interval',

                          'brands',

8a7e6ecf   Yarik   Namespaces
43
                      ],

72a1aa2d   Yarik   Catalog optimize
44
                      'safe',

8a7e6ecf   Yarik   Namespaces
45
                  ],

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

          }

          

          /**

           * @inheritdoc

           */

          public function scenarios()

          {

              // bypass scenarios() implementation in the parent class

              return Model::scenarios();

          }

4a447a24   Yarik   Catalog begin
57
          

72a1aa2d   Yarik   Catalog optimize
58
59
60
61
62
          /**

           * Creates data provider instance with search query applied for frontend

           *

           * @param array $params

           *

f447738b   Administrator   add variantSku
63
           * @return ActiveDataProvider

72a1aa2d   Yarik   Catalog optimize
64
65
66
67
           */

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

          {

              

183a715c   Yarik   Sort fix
68
69
70
              $sort = new Sort(

                  [

                      'attributes' => [

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

f447738b   Administrator   add variantSku
72
73
                              'asc'     => [ 'product_lang.title' => SORT_ASC ],

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

183a715c   Yarik   Sort fix
74
75
76
                              'default' => SORT_ASC,

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

                          ],

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

f447738b   Administrator   add variantSku
78
79
                              'asc'     => [ 'product_lang.title' => SORT_DESC ],

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

183a715c   Yarik   Sort fix
80
81
82
                              'default' => SORT_DESC,

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

                          ],

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

f447738b   Administrator   add variantSku
84
85
                              'asc'     => [ 'product_variant.price' => SORT_ASC ],

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

f4e641d8   Yarik   Order frontend
86
87
88
                              'default' => SORT_ASC,

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

                          ],

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

f447738b   Administrator   add variantSku
90
91
                              'asc'     => [ 'product_variant.price' => SORT_DESC ],

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

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

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

183a715c   Yarik   Sort fix
94
95
96
97
                          ],

                      ],

                  ]

              );

bf70a380   Yarik   Not in stock
98
              

ac8d2b24   Administrator   add variantSku
99
              $dataProvider = new ActiveDataProvider(

72a1aa2d   Yarik   Catalog optimize
100
                  [

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

f447738b   Administrator   add variantSku
102
                                           ->with('variant', 'videos')

bf70a380   Yarik   Not in stock
103
104
105
106
107
108
109
                                           ->groupBy(

                                               [

                                                   'product_lang.title',

                                                   'product_variant.price',

                                                   'product.id',

                                               ]

                                           ),

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

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

72a1aa2d   Yarik   Catalog optimize
112
                      ],

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

72a1aa2d   Yarik   Catalog optimize
114
115
116
117
                  ]

              );

              

              return $dataProvider;

8a7e6ecf   Yarik   Namespaces
118
          }

72a1aa2d   Yarik   Catalog optimize
119
120
121
122
123
124
125
126
127
128
          

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

          {

              

              if (!empty( $category )) {

                  /** @var ActiveQuery $query */

                  /**@var Category $category * */

                  $query = $category->getProducts();

                  

              } else {

13b04c5b   Administrator   add variantSku
129
                  $query = Product::find()

bf70a380   Yarik   Not in stock
130
131
132
133
134
135
                                  ->joinWith(

                                      [

                                          'category',

                                          'category.lang',

                                      ]

                                  );

72a1aa2d   Yarik   Catalog optimize
136
137
138
139
140
141
142
143
144
              }

              

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

              $query->joinWith(

                  [

                      'lang',

                      'brand.lang',

                      'options',

                  ]

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

              

              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
172
173
174
175
176
177
178
179
180
              

              $query->groupBy(

                  [

                      'product.id',

                      'product_variant.price',

                  ]

              );

              

              FilterHelper::setQueryParams($query, $params);

bf70a380   Yarik   Not in stock
181
              

72a1aa2d   Yarik   Catalog optimize
182
              return $query;

8a7e6ecf   Yarik   Namespaces
183
          }

72a1aa2d   Yarik   Catalog optimize
184
185
186
187
188
189
          

          /**

           * @param Category|null $category

           *

           * @return array

           */

bf70a380   Yarik   Not in stock
190
191
192
193
          

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

          {

              if (!empty( $category )) {

72a1aa2d   Yarik   Catalog optimize
194
                  /** @var ActiveQuery $query */

bf70a380   Yarik   Not in stock
195
                  //            $query = $category->getRelations('product_categories');

72a1aa2d   Yarik   Catalog optimize
196
197
198
199
                  $query = $category->getProducts();

              } else {

                  $query = Product::find();

              }

d75b9d34   Administrator   add variantSku
200
201
  

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

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

bf70a380   Yarik   Not in stock
203
              

93015018   Administrator   full commit
204
              // Price filter fix

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

              

93015018   Administrator   full commit
207
208
209
210
211
212
213
214
              FilterHelper::setQueryParams($query, $params);

              $query->andWhere(

                  [

                      '>=',

                      ProductVariant::tableName() . '.stock',

                      1,

                  ]

              );

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

8a7e6ecf   Yarik   Namespaces
216
          }

72a1aa2d   Yarik   Catalog optimize
217
      }