Blame view

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

72a1aa2d   Yarik   Catalog optimize
2
3
4
5
6
      

      namespace artweb\artbox\ecommerce\models;

      

      use artweb\artbox\ecommerce\helpers\FilterHelper;

      use artweb\artbox\ecommerce\models\Category;

72a1aa2d   Yarik   Catalog optimize
7
8
9
      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)

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

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
          }

2f5c8d11   Administrator   add variantSku
119
  

1a954235   Administrator   add variantSku
120
          public function getSearchQuery($category = null, $params = [], $in_stock = true)

72a1aa2d   Yarik   Catalog optimize
121
          {

2f5c8d11   Administrator   add variantSku
122
  

1a954235   Administrator   add variantSku
123
124
125
126
              if (!empty( $category )) {

                  /** @var ActiveQuery $query */

                  /**@var Category $category * */

                  $query = $category->getProducts();

c3d12ab0   Administrator   add variantSku
127
  

1a954235   Administrator   add variantSku
128
129
130
131
132
133
134
135
              } else {

                  $query = Product::find()

                                  ->joinWith(

                                      [

                                          'category.lang',

                                      ]

                                  );

              }

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

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

              $query->joinWith(

                  [

                      'lang',

                      'brand.lang',

                      'options',

                  ]

bf70a380   Yarik   Not in stock
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
169
170
              );

              

              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
171
172
173
174
175
176
177
              

              $query->groupBy(

                  [

                      'product.id',

                      'product_variant.price',

                  ]

              );

2f5c8d11   Administrator   add variantSku
178
  

1a954235   Administrator   add variantSku
179
              FilterHelper::setQueryParams($query, $params);

72a1aa2d   Yarik   Catalog optimize
180
              return $query;

8a7e6ecf   Yarik   Namespaces
181
          }

72a1aa2d   Yarik   Catalog optimize
182
183
184
185
186
187
          

          /**

           * @param Category|null $category

           *

           * @return array

           */

bf70a380   Yarik   Not in stock
188
189
190
          

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

          {

c3d12ab0   Administrator   add variantSku
191
192
193
194
195
196
197
              if (!empty( $category )) {

                  /** @var ActiveQuery $query */

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

                  $query = $category->getProducts();

              } else {

                  $query = Product::find();

              }

d75b9d34   Administrator   add variantSku
198
199
  

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

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

bf70a380   Yarik   Not in stock
201
              

93015018   Administrator   full commit
202
              // Price filter fix

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

2f5c8d11   Administrator   add variantSku
204
  

1a954235   Administrator   add variantSku
205
              FilterHelper::setQueryParams($query, $params);

93015018   Administrator   full commit
206
207
208
209
210
211
212
              $query->andWhere(

                  [

                      '>=',

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

                      1,

                  ]

              );

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

8a7e6ecf   Yarik   Namespaces
214
          }

72a1aa2d   Yarik   Catalog optimize
215
      }