Blame view

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

  

  namespace frontend\models;

  

  use common\modules\product\helpers\ProductHelper;

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

4253cbec   root   first commit
7
8
9
  use Yii;

  use yii\base\Model;

  use yii\data\ActiveDataProvider;

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

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

771f8d54   Administrator   big commti
12
  

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

  use common\modules\product\models\ProductVariant;

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

4253cbec   root   first commit
16
17
  

  class ProductFrontendSearch extends Product {

771f8d54   Administrator   big commti
18
19
20
21
22
23
  

  

      public $price_interval;

      public $brands;

  

  

4253cbec   root   first commit
24
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
      /**

       * @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
50
      public function search($category = null, $params = [], $in_stock = true) {

950470c1   Administrator   big commti
51
  

c8ee17e4   Administrator   big commti
52
  

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

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

                  'images',

                  'events',

                  'variant',

                  'variant.image',

                  'comments',

                  'averageRating',

              ])->all(),

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

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

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

              'sort' => [

                  'attributes' => [

                      'name' => [

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

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

                          'default' => SORT_DESC,

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

                      ],

                      'price' => [

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

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

4253cbec   root   first commit
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
                          'default' => SORT_DESC,

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

                      ],

                  ],

              ]

          ]);

  

          if (!$this->validate()) {

              return $dataProvider;

          }

  

  

  

          return $dataProvider;

      }

  

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

c8ee17e4   Administrator   big commti
93
  

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

              /** @var ActiveQuery $query */

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

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

c8ee17e4   Administrator   big commti
98
  

4253cbec   root   first commit
99
100
101
          } else {

              $query = Product::find();

          }

c8ee17e4   Administrator   big commti
102
  

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

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

4253cbec   root   first commit
105
  

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

4253cbec   root   first commit
107
108
  

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

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

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

          }

4253cbec   root   first commit
112
  

4253cbec   root   first commit
113
114
115
116
  

          return $query;

      }

  

4253cbec   root   first commit
117
  

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

       * @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
138
139
140
141
142
143
144
  

          return [

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

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

          ];

      }

  }