Blame view

frontend/models/ProductFrontendSearch.php 3.67 KB
4253cbec   root   first commit
1
2
3
4
  <?php

  

  namespace frontend\models;

  

a95ce595   Administrator   big commti
5
  use common\modules\product\helpers\FilterHelper;

4253cbec   root   first commit
6
  use common\modules\product\helpers\ProductHelper;

db2894a2   Administrator   big commti
7
  use common\modules\product\models\Category;

4253cbec   root   first commit
8
9
10
  use Yii;

  use yii\base\Model;

  use yii\data\ActiveDataProvider;

5765cb7c   Administrator   big commti
11
  use yii\data\ArrayDataProvider;

4253cbec   root   first commit
12
  use yii\db\ActiveQuery;

771f8d54   Administrator   big commti
13
  

4253cbec   root   first commit
14
15
  use common\modules\product\models\Product;

  use common\modules\product\models\ProductVariant;

1504a699   Administrator   big commti
16
  use yii\helpers\ArrayHelper;

4253cbec   root   first commit
17
18
  

  class ProductFrontendSearch extends Product {

771f8d54   Administrator   big commti
19
20
21
22
23
24
  

  

      public $price_interval;

      public $brands;

  

  

4253cbec   root   first commit
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
      /**

       * @inheritdoc

       */

      public function rules()

      {

          return [

              [['price_interval', 'brands'], 'safe'],

          ];

      }

  

      /**

       * @inheritdoc

       */

      public function scenarios()

      {

          // bypass scenarios() implementation in the parent class

          return Model::scenarios();

      }

  

      /**

       * Creates data provider instance with search query applied for frontend

       *

       * @param array $params

       *

       * @return ActiveDataProvider

       */

97edb6ce   Administrator   big commti
51
      public function search($category = null, $params = [], $in_stock = true) {

950470c1   Administrator   big commti
52
  

c8ee17e4   Administrator   big commti
53
  

5765cb7c   Administrator   big commti
54
55
56
57
58
59
60
61
62
          $dataProvider = new ArrayDataProvider([

              'allModels' => $this->getSearchQuery($category, $params, $in_stock)->with([

                  'images',

                  'events',

                  'variant',

                  'variant.image',

                  'comments',

                  'averageRating',

              ])->all(),

4253cbec   root   first commit
63
              'pagination' => [

d09f430f   Administrator   big commti
64
                  'pageSize' => 15,

4253cbec   root   first commit
65
66
67
68
69
70
71
72
73
74
              ],

              'sort' => [

                  'attributes' => [

                      'name' => [

                          'asc' => ['name' => SORT_ASC],

                          'desc' => ['name' => SORT_DESC],

                          'default' => SORT_DESC,

                          'label' => 'имени',

                      ],

                      'price' => [

950470c1   Administrator   big commti
75
76
                          'asc' => ['price' => SORT_ASC],

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

4253cbec   root   first commit
77
78
79
80
81
82
83
                          'default' => SORT_DESC,

                          'label' => 'по цене',

                      ],

                  ],

              ]

          ]);

  

a95ce595   Administrator   big commti
84
  

4253cbec   root   first commit
85
86
87
88
89
90
  

  

  

          return $dataProvider;

      }

  

97edb6ce   Administrator   big commti
91
      public function getSearchQuery($category = null, $params = [], $in_stock = true) {

c8ee17e4   Administrator   big commti
92
  

4253cbec   root   first commit
93
94
          if (!empty($category)) {

              /** @var ActiveQuery $query */

db2894a2   Administrator   big commti
95
              /**@var Category $category **/

4253cbec   root   first commit
96
              $query = $category->getProducts();

c8ee17e4   Administrator   big commti
97
  

4253cbec   root   first commit
98
99
100
          } else {

              $query = Product::find();

          }

c8ee17e4   Administrator   big commti
101
  

4253cbec   root   first commit
102
          $query->select(['product.*']);

d09f430f   Administrator   big commti
103
          $query->joinWith(['enabledVariants','brand','options', 'category']);

4253cbec   root   first commit
104
  

4d5dbae3   Administrator   big commti
105
          $query->groupBy(['product.product_id', 'product_variant.price']);

4253cbec   root   first commit
106
  

a95ce595   Administrator   big commti
107
          FilterHelper::setNewQueryParams($query, $params);

97edb6ce   Administrator   big commti
108
109
110
          if($in_stock){

              $query->andWhere(['!=', ProductVariant::tableName() .'.status', 1]);

          }

4253cbec   root   first commit
111
  

4253cbec   root   first commit
112
113
114
115
  

          return $query;

      }

  

4253cbec   root   first commit
116
  

1504a699   Administrator   big commti
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
      /**

       * @param Category|null $category

       * @param array $params

       * @return array

       */

  

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

          if (!empty($category)) {

              /** @var ActiveQuery $query */

              $query = $category->getProducts();

          } else {

              $query = Product::find();

          }

          $query->joinWith('variant');

  

          // Price filter fix

          unset($params['prices']);

  

          ProductHelper::_setQueryParams($query, $params, false);

  

4253cbec   root   first commit
137
138
139
140
141
142
143
  

          return [

              'min' => $query->min(ProductVariant::tableName() .'.price'),

              'max' => $query->max(ProductVariant::tableName() .'.price'),

          ];

      }

  }