Blame view

frontend/controllers/FilterController.php 9.85 KB
d8c1a2e0   Yarik   Big commit artbox
1
2
3
4
  <?php
      
      namespace frontend\controllers;
      
cc658b4c   Yarik   Big commit
5
6
7
8
      use common\modules\product\models\Brand;
      use common\modules\product\models\Category;
      use common\modules\product\models\ProductSearch;
      use common\modules\rubrication\models\TaxOption;
c67585d7   Yarik   Category path fixes
9
      use yii\db\ActiveQuery;
d8c1a2e0   Yarik   Big commit artbox
10
      use yii\web\Controller;
cc658b4c   Yarik   Big commit
11
      use yii\web\NotFoundHttpException;
d8c1a2e0   Yarik   Big commit artbox
12
13
14
15
16
17
18
      
      /**
       * Filter controller
       */
      class FilterController extends Controller
      {
          
cc658b4c   Yarik   Big commit
19
20
21
22
23
          public function actionIndex($category_id, $purpose_id)
          {
              $category = $this->findCategory($category_id);
              $purpose = $this->findPurpose($purpose_id);
              $brands = Brand::find()
d55d2fe0   Yarik   Multilanguage
24
25
26
27
                             ->joinWith('lang', true, 'INNER JOIN')
                             ->joinWith('products.lang')
                             ->joinWith('products.categories.lang')
                             ->joinWith('products.options.lang')
cc658b4c   Yarik   Big commit
28
29
30
31
32
33
34
35
36
37
38
39
                             ->where([
                                 'category.category_id'     => $category->category_id,
                                 'tax_option.tax_option_id' => $purpose->tax_option_id,
                             ])
                             ->all();
              return $this->render('index', [
                  'category' => $category,
                  'purpose'  => $purpose,
                  'brands'   => $brands,
              ]);
          }
          
d8c1a2e0   Yarik   Big commit artbox
40
41
          /**
           * Filter by type.
c67585d7   Yarik   Category path fixes
42
           *
d8c1a2e0   Yarik   Big commit artbox
43
44
           * @return string
           */
cc658b4c   Yarik   Big commit
45
          public function actionCategory($id)
d8c1a2e0   Yarik   Big commit artbox
46
          {
cc658b4c   Yarik   Big commit
47
              $category = $this->findCategory($id);
c67585d7   Yarik   Category path fixes
48
              $brandsAll = $category->activeBrands;
cc658b4c   Yarik   Big commit
49
              $purposes = TaxOption::find()
d55d2fe0   Yarik   Multilanguage
50
                                   ->joinWith('lang', true, 'INNER JOIN')
887985c7   Yarik   Filter fix
51
52
53
54
55
56
57
58
59
                                   ->joinWith([
                                       'products' => function($query) use ($category) {
                                           $query->joinWith([
                                               'categories' => function($query) use ($category) {
                                                   $query->andWhere([ 'category.category_id' => $category->category_id ]);
                                               },
                                           ]);
                                       },
                                   ])
d55d2fe0   Yarik   Multilanguage
60
                                   ->joinWith('products.categories.lang')
887985c7   Yarik   Filter fix
61
                                   ->joinWith('products.lang')
d55d2fe0   Yarik   Multilanguage
62
                                   ->joinWith('products.brand.lang')
cc658b4c   Yarik   Big commit
63
64
                                   ->joinWith('taxGroup')
                                   ->where([
27ad59d9   Yarik   Purpose public fix.
65
66
                                       'category.category_id'   => $category->category_id,
                                       'tax_group.tax_group_id' => 5,
cc658b4c   Yarik   Big commit
67
68
                                   ])
                                   ->all();
cc658b4c   Yarik   Big commit
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
              $brands = [];
              foreach($purposes as $purpose) {
                  /**
                   * @var TaxOption $purpose
                   */
                  $brands[ $purpose->tax_option_id ] = [];
                  foreach($purpose->products as $product) {
                      /**
                       * @var Brand $brand
                       */
                      $brand = $product->brand;
                      if(!empty( $brand )) {
                          $brands[ $purpose->tax_option_id ][ $brand->brand_id ] = $brand;
                      }
                  }
              }
              return $this->render('category', [
c67585d7   Yarik   Category path fixes
86
87
88
89
                  'category'  => $category,
                  'purposes'  => $purposes,
                  'brands'    => $brands,
                  'brandsAll' => $brandsAll,
cc658b4c   Yarik   Big commit
90
              ]);
d8c1a2e0   Yarik   Big commit artbox
91
92
93
94
          }
          
          /**
           * Filter by purpose.
c67585d7   Yarik   Category path fixes
95
           *
d8c1a2e0   Yarik   Big commit artbox
96
97
           * @return string
           */
cc658b4c   Yarik   Big commit
98
99
100
101
          public function actionPurpose($id)
          {
              $purpose = $this->findPurpose($id);
              $categories = Category::find()
d55d2fe0   Yarik   Multilanguage
102
103
                                    ->joinWith('products.lang')
                                    ->joinWith('products.brand.lang')
887985c7   Yarik   Filter fix
104
105
106
107
108
109
110
111
112
                                    ->joinWith([
                                        'products' => function($query) use ($purpose) {
                                            $query->joinWith([
                                                'options' => function($query) use ($purpose) {
                                                    $query->andWhere([ 'tax_option.tax_option_id' => $purpose->tax_option_id ]);
                                                },
                                            ]);
                                        },
                                    ])
d55d2fe0   Yarik   Multilanguage
113
114
                                    ->joinWith('products.options.lang')
                                    ->where([ 'tax_option.tax_option_id' => $purpose->tax_option_id ])
cc658b4c   Yarik   Big commit
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
                                    ->all();
              $brands = [];
              foreach($categories as $category) {
                  $brands[ $category->category_id ] = [];
                  foreach($category->products as $product) {
                      /**
                       * @var Brand $brand
                       */
                      $brand = $product->brand;
                      if(!empty( $brand )) {
                          $brands[ $category->category_id ][ $brand->brand_id ] = $brand;
                      }
                  }
              }
              return $this->render('purpose', [
                  'purpose'    => $purpose,
                  'categories' => $categories,
                  'brands'     => $brands,
              ]);
          }
          
          public function actionBrand($category_id, $purpose_id, $brand_id)
          {
              $category = $this->findCategory($category_id);
              $purpose = $this->findPurpose($purpose_id);
              $brand = $this->findBrand($brand_id);
              $searchModel = new ProductSearch();
              $dataProvider = $searchModel->search(\Yii::$app->request->queryParams);
              $dataProvider->pagination = false;
c67585d7   Yarik   Category path fixes
144
145
146
              /**
               * @var ActiveQuery $query
               */
cc658b4c   Yarik   Big commit
147
              $query = $dataProvider->query;
d55d2fe0   Yarik   Multilanguage
148
              $query->with('variants.lang')
d55d2fe0   Yarik   Multilanguage
149
150
151
                    ->joinWith('brand.lang')
                    ->joinWith('options.lang')
                    ->joinWith('categories.lang')
cc658b4c   Yarik   Big commit
152
153
154
155
156
157
158
159
160
161
162
163
164
165
                    ->andWhere([
                        'category.category_id'     => $category->category_id,
                        'tax_option.tax_option_id' => $purpose->tax_option_id,
                        'brand.brand_id'           => $brand->brand_id,
                    ]);
              return $this->render('brand', [
                  'category'     => $category,
                  'purpose'      => $purpose,
                  'brand'        => $brand,
                  'searchModel'  => $searchModel,
                  'dataProvider' => $dataProvider,
              ]);
          }
          
c67585d7   Yarik   Category path fixes
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
          public function actionCategoryBrand($category_id, $brand_id)
          {
              $category = $this->findCategory($category_id);
              $brand = $this->findBrand($brand_id);
              $searchModel = new ProductSearch();
              $dataProvider = $searchModel->search(\Yii::$app->request->queryParams);
              $dataProvider->pagination = false;
              /**
               * @var ActiveQuery $query
               */
              $query = $dataProvider->query;
              $query->with('variants.lang')
                    ->joinWith('brand.lang')
                    ->joinWith('categories.lang')
                    ->andWhere([
                        'category.category_id' => $category->category_id,
                        'brand.brand_id'       => $brand->brand_id,
                    ]);
              return $this->render('category-brand', [
                  'category'     => $category,
                  'brand'        => $brand,
                  'searchModel'  => $searchModel,
                  'dataProvider' => $dataProvider,
              ]);
          }
          
          public function actionCategoryBrands($category_id)
          {
              $category = $this->findCategory($category_id);
              $brands = $category->activeBrands;
              return $this->render('category-brands', [
                  'category' => $category,
                  'brands'   => $brands,
              ]);
          }
          
cc658b4c   Yarik   Big commit
202
203
204
205
206
207
208
209
210
211
212
          /**
           * @param $id
           *
           * @return TaxOption
           * @throws NotFoundHttpException
           */
          private function findPurpose($id)
          {
              $model = TaxOption::find()
                                ->joinWith('taxGroup')
                                ->where([
d55d2fe0   Yarik   Multilanguage
213
                                    'tax_option.tax_option_id' => $id,
27ad59d9   Yarik   Purpose public fix.
214
                                    'tax_group.tax_group_id'   => 5,
cc658b4c   Yarik   Big commit
215
                                ])
cc658b4c   Yarik   Big commit
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
                                ->one();
              if(empty( $model )) {
                  throw new NotFoundHttpException();
              }
              return $model;
          }
          
          /**
           * @param $id
           *
           * @return Category
           * @throws NotFoundHttpException
           */
          private function findCategory($id)
          {
              $model = Category::find()
                               ->where([
d55d2fe0   Yarik   Multilanguage
233
                                   'category.category_id' => $id,
cc658b4c   Yarik   Big commit
234
                               ])
cc658b4c   Yarik   Big commit
235
236
237
238
239
240
241
242
243
244
245
246
247
248
                               ->one();
              if(empty( $model )) {
                  throw new NotFoundHttpException();
              }
              return $model;
          }
          
          /**
           * @param $id
           *
           * @return Brand
           * @throws NotFoundHttpException
           */
          private function findBrand($id)
d8c1a2e0   Yarik   Big commit artbox
249
          {
cc658b4c   Yarik   Big commit
250
251
252
253
254
              /**
               * @var Brand $model
               */
              $model = Brand::find()
                            ->where([
d55d2fe0   Yarik   Multilanguage
255
                                'brand.brand_id' => $id,
cc658b4c   Yarik   Big commit
256
                            ])
cc658b4c   Yarik   Big commit
257
258
259
260
261
                            ->one();
              if(empty( $model )) {
                  throw new NotFoundHttpException();
              }
              return $model;
d8c1a2e0   Yarik   Big commit artbox
262
263
          }
      }