Blame view

frontend/controllers/CatalogController.php 7.87 KB
550eac02   Administrator   second
1
2
3
4
  <?php
  
  namespace frontend\controllers;
  
055ecc3b   Karnovsky A   Karnovsky 11052016
5
6
7
8
  use common\modules\product\Filter;
  use common\modules\product\helpers\ProductHelper;
  use common\modules\rubrication\models\TaxOptionSearch;
  use frontend\models\ProductFrontendSearch;
550eac02   Administrator   second
9
  use Yii;
055ecc3b   Karnovsky A   Karnovsky 11052016
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  use common\modules\product\models\Brand;
  use common\modules\product\models\BrandSearch;
  use common\modules\product\models\Category;
  use common\modules\product\models\CategorySearch;
  use common\modules\product\models\Product;
  use common\modules\product\models\ProductCategory;
  use common\modules\product\models\ProductOption;
  use common\modules\product\models\ProductSearch;
  use common\modules\product\models\ProductVariant;
  use common\modules\rubrication\models\TaxGroup;
  use common\modules\rubrication\models\TaxOption;
  use common\modules\rubrication\models\TaxValueString;
  use yii\data\ActiveDataProvider;
  use yii\data\Pagination;
  use yii\data\Sort;
  use yii\db\ActiveQuery;
550eac02   Administrator   second
26
27
  use yii\web\HttpException;
  
055ecc3b   Karnovsky A   Karnovsky 11052016
28
  class CatalogController extends \yii\web\Controller
550eac02   Administrator   second
29
  {
055ecc3b   Karnovsky A   Karnovsky 11052016
30
31
32
      public function actionSearch() {
          // @todo
      }
550eac02   Administrator   second
33
  
055ecc3b   Karnovsky A   Karnovsky 11052016
34
      public function actionCategory()
550eac02   Administrator   second
35
      {
055ecc3b   Karnovsky A   Karnovsky 11052016
36
37
38
39
40
41
          /** @var Category $category */
          $category = Yii::$app->request->get('category');
          $filter = Yii::$app->request->get('filter', []);
          $word = trim(Yii::$app->request->get('word', ''));
  
          if (empty($category->category_id) && empty($word)) {
8724ec1f   Karnovsky A   -
42
43
44
              return $this->render(
                  'catalog'
              );
055ecc3b   Karnovsky A   Karnovsky 11052016
45
46
          }
  
8724ec1f   Karnovsky A   -
47
48
          if (!empty($word))
          {
055ecc3b   Karnovsky A   Karnovsky 11052016
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
              $params = [];
  
              $params['keywords'] = explode(' ', preg_replace("|[\s,.!:&?~();-]|i", " ", $word));
              foreach($params['keywords'] as $i => &$keyword) {
                  $keyword = trim($keyword);
                  if (empty($keyword)) {
                      unset($params['keywords'][$i]);
                  }
              }
  
              $productModel = new ProductFrontendSearch();
              $productProvider = $productModel->search($category, $params);
  
              $categoriesQuery = Category::find()
                  ->innerJoin(ProductCategory::tableName(), ProductCategory::tableName() .'.category_id = '. Category::tableName() .'.category_id')
3147aab1   Karnovsky A   Fix search with s...
64
65
                  ->innerJoin(Product::tableName(), Product::tableName() .'.product_id = '. ProductCategory::tableName() .'.product_id')
                  ->innerJoin(ProductVariant::tableName(), ProductVariant::tableName() .'.product_id = '. ProductCategory::tableName() .'.product_id');
055ecc3b   Karnovsky A   Karnovsky 11052016
66
67
68
              foreach ($params['keywords'] as $keyword) {
                  $categoriesQuery->andWhere(['ilike', 'product.name', $keyword]);
              }
3147aab1   Karnovsky A   Fix search with s...
69
              $categoriesQuery->andWhere(['!=', ProductVariant::tableName() .'.stock', 0]);
055ecc3b   Karnovsky A   Karnovsky 11052016
70
71
72
73
74
75
76
77
78
              $categories = $categoriesQuery->all();
  
              return $this->render(
                  'search',
                  [
                      'keywords'          => $params['keywords'],
                      'category'          => $category,
                      'productModel'      => $productModel,
                      'productProvider'   => $productProvider,
055ecc3b   Karnovsky A   Karnovsky 11052016
79
80
81
82
                      'categories'        => $categories,
                  ]
              );
  
8724ec1f   Karnovsky A   -
83
84
85
          }
          else
          {
055ecc3b   Karnovsky A   Karnovsky 11052016
86
87
88
89
90
91
92
93
94
95
              $params = [];
  
              if ( !empty($filter['brands']) ) {
                  $brands = Brand::find()->select('brand_id')->where(['in', 'alias', $filter['brands']])->all();
                  $params['brands'] = [];
                  foreach ($brands as $brand) {
                      $params['brands'][] = $brand->brand_id;
                  }
              }
  
e2651dcd   Karnovsky A   Special-product-f...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
              if ( !empty($filter['special']) ) {
                  if (!is_array($filter['special'])) {
                      $filter['special'] = [$filter['special']];
                  }
                  if (in_array('new', $filter['special'])) {
                      $params['special']['is_new'] = true;
                  }
                  if (in_array('top', $filter['special'])) {
                      $params['special']['is_top'] = true;
                  }
                  if (in_array('promo', $filter['special'])) {
                      $params['special']['akciya'] = true;
                  }
              }
  
055ecc3b   Karnovsky A   Karnovsky 11052016
111
112
              if ( !empty($filter['options']) ) {
                  $params['options'] = $filter['options'];
055ecc3b   Karnovsky A   Karnovsky 11052016
113
114
115
116
117
118
119
120
121
122
              }
  
              if ( !empty($filter['prices']) ) {
                  $params['prices'] = $filter['prices'];
              }
  
              $productModel = new ProductFrontendSearch();
              $productProvider = $productModel->search($category, $params);
  
              $brandModel = new BrandSearch();
8724ec1f   Karnovsky A   -
123
              $brands = $brandModel->getBrands($category, $params)->all();
055ecc3b   Karnovsky A   Karnovsky 11052016
124
  
8724ec1f   Karnovsky A   -
125
              $optionsQuery = $productModel->optionsForCategory($category, $params);
055ecc3b   Karnovsky A   Karnovsky 11052016
126
              $groups = [];
8724ec1f   Karnovsky A   -
127
              foreach ($optionsQuery->all() as $option) {
055ecc3b   Karnovsky A   Karnovsky 11052016
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
                  if (!isset($groups[$option->tax_group_id])) {
                      $groups[$option->tax_group_id] = $option->taxGroup;
                      $groups[$option->tax_group_id]->_options = [];
                  }
                  $groups[$option->tax_group_id]->_options[] = $option;
              }
              foreach($groups as $i => $group) {
                  if (empty($group->_options))
                      unset($groups[$i]);
              }
  
              $priceLimits = $productModel->priceLimits($category, $params);
  
              return $this->render(
                  'products',
                  [
                      'category'          => $category,
                      'brandModel'        => $brandModel,
8724ec1f   Karnovsky A   -
146
                      'brands'            => $brands,
055ecc3b   Karnovsky A   Karnovsky 11052016
147
148
149
                      'filter'            => $filter,
                      'productModel'      => $productModel,
                      'productProvider'   => $productProvider,
055ecc3b   Karnovsky A   Karnovsky 11052016
150
151
                      'groups'            => $groups,
                      'priceLimits'       => $priceLimits,
055ecc3b   Karnovsky A   Karnovsky 11052016
152
153
154
155
156
157
158
                  ]
              );
          }
      }
  
      public function actionProduct()
      {
ccc7a9d3   Karnovsky A   Karnovsky 12052016
159
          /** @var Product $product */
055ecc3b   Karnovsky A   Karnovsky 11052016
160
161
          $product = Yii::$app->request->get('product');
  
3147aab1   Karnovsky A   Fix search with s...
162
163
164
165
          if(!$product->enabledVariant) {
              throw new HttpException(404, 'Товар не найден');
          }
  
055ecc3b   Karnovsky A   Karnovsky 11052016
166
167
168
169
          ProductHelper::addLastProsucts($product->product_id);
  
          return $this->render('product', [
              'product' => $product,
c7852657   Karnovsky A   -
170
              'category' => $product->category,
055ecc3b   Karnovsky A   Karnovsky 11052016
171
          ]);
550eac02   Administrator   second
172
      }
055ecc3b   Karnovsky A   Karnovsky 11052016
173
174
  
      public function actionBrands()
550eac02   Administrator   second
175
      {
38828295   Karnovsky A   -
176
177
178
179
180
181
182
183
184
185
          $dataProvider = new ActiveDataProvider([
              'query' => Brand::find()->joinWith('brandName')->orderBy('brand_name.value'),
              'pagination' => [
                  'pageSize' => -1,
              ]
          ]);
  
          return $this->render('brands', [
              'dataProvider' => $dataProvider,
          ]);
055ecc3b   Karnovsky A   Karnovsky 11052016
186
187
      }
  
868680ca   Karnovsky A   -
188
      public function actionBrand($brand)
055ecc3b   Karnovsky A   Karnovsky 11052016
189
      {
868680ca   Karnovsky A   -
190
191
192
193
194
195
196
197
198
199
          $filter = Yii::$app->request->get('filter', []);
  
          $params = [
              'brand_id' => $brand->brand_id,
          ];
  
          if ( !empty($filter['prices']) ) {
              $params['prices'] = $filter['prices'];
          }
  
c9d723d7   Karnovsky A   -
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
          if ( !empty($filter['special']) ) {
              if (!is_array($filter['special'])) {
                  $filter['special'] = [$filter['special']];
              }
              if (in_array('new', $filter['special'])) {
                  $params['special']['is_new'] = true;
              }
              if (in_array('top', $filter['special'])) {
                  $params['special']['is_top'] = true;
              }
              if (in_array('promo', $filter['special'])) {
                  $params['special']['akciya'] = true;
              }
          }
  
868680ca   Karnovsky A   -
215
216
217
218
219
220
221
222
223
224
225
226
          $productModel = new ProductFrontendSearch();
          $productProvider = $productModel->search(null, $params);
  
          $priceLimits = $productModel->priceLimits(null, $params);
  
          return $this->render('brand', [
              'productModel'      => $productModel,
              'productProvider'   => $productProvider,
              'brand'             => $brand,
              'priceLimits'       => $priceLimits,
              'filter'            => $filter,
          ]);
055ecc3b   Karnovsky A   Karnovsky 11052016
227
228
229
      }
  
  }