Blame view

common/modules/product/controllers/VariantController.php 12.7 KB
d8c1a2e0   Yarik   Big commit artbox
1
  <?php
d55d2fe0   Yarik   Multilanguage
2
3
4
5
6
7
8
      
      namespace common\modules\product\controllers;
      
      use common\modules\product\models\Product;
      use common\modules\product\models\ProductImage;
      use common\modules\product\models\ProductStock;
      use common\modules\product\models\ProductVariant;
4e55ce81   Yarik   Another one admin...
9
      use common\modules\product\models\ProductVariantSearch;
d55d2fe0   Yarik   Multilanguage
10
11
      use common\modules\product\models\Stock;
      use Yii;
5c2eb7c8   Yarik   Big commit almost...
12
      use yii\db\ActiveQuery;
d55d2fe0   Yarik   Multilanguage
13
14
15
      use yii\web\Controller;
      use yii\web\NotFoundHttpException;
      use yii\filters\VerbFilter;
d55d2fe0   Yarik   Multilanguage
16
      
d8c1a2e0   Yarik   Big commit artbox
17
      /**
4e55ce81   Yarik   Another one admin...
18
       * VartiantController implements the CRUD actions for ProductVariant model.
d8c1a2e0   Yarik   Big commit artbox
19
       */
d55d2fe0   Yarik   Multilanguage
20
      class VariantController extends Controller
d8c1a2e0   Yarik   Big commit artbox
21
      {
d55d2fe0   Yarik   Multilanguage
22
23
24
25
26
27
28
29
30
31
32
33
          
          /**
           * @inheritdoc
           */
          public function behaviors()
          {
              return [
                  'verbs' => [
                      'class'   => VerbFilter::className(),
                      'actions' => [
                          'delete' => [ 'POST' ],
                      ],
d8c1a2e0   Yarik   Big commit artbox
34
                  ],
d55d2fe0   Yarik   Multilanguage
35
              ];
d8c1a2e0   Yarik   Big commit artbox
36
          }
36d1807a   Yarik   Big commit.
37
          
d55d2fe0   Yarik   Multilanguage
38
39
          /**
           * Lists all ProductVariant models.
5c2eb7c8   Yarik   Big commit almost...
40
41
42
           *
           * @param int $product_id
           *
d55d2fe0   Yarik   Multilanguage
43
44
45
46
           * @return mixed
           */
          public function actionIndex($product_id)
          {
4e55ce81   Yarik   Another one admin...
47
48
49
              $product = $this->findProduct($product_id);
              $searchModel = new ProductVariantSearch();
              $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
5c2eb7c8   Yarik   Big commit almost...
50
51
52
53
54
              /**
               * @var ActiveQuery $query
               */
              $query = $dataProvider->query;
              $query->with('image')
8af13427   Yarik   For leha commit.
55
                    ->andWhere([ 'product_id' => $product->id ]);
d55d2fe0   Yarik   Multilanguage
56
              
4428da8c   Yarik   Almost all databa...
57
58
59
60
61
62
63
64
              return $this->render(
                  'index',
                  [
                      'searchModel'  => $searchModel,
                      'dataProvider' => $dataProvider,
                      'product'      => $product,
                  ]
              );
d55d2fe0   Yarik   Multilanguage
65
          }
36d1807a   Yarik   Big commit.
66
          
d55d2fe0   Yarik   Multilanguage
67
68
69
70
71
72
73
74
75
          /**
           * Displays a single ProductVariant model.
           *
           * @param integer $id
           *
           * @return mixed
           */
          public function actionView($id)
          {
4e55ce81   Yarik   Another one admin...
76
77
              $model = $this->findModel($id);
              $properties = $model->getProperties();
4428da8c   Yarik   Almost all databa...
78
79
80
81
82
83
84
              return $this->render(
                  'view',
                  [
                      'model'      => $model,
                      'properties' => $properties,
                  ]
              );
d55d2fe0   Yarik   Multilanguage
85
          }
36d1807a   Yarik   Big commit.
86
          
d55d2fe0   Yarik   Multilanguage
87
88
89
          /**
           * Creates a new ProductVariant model.
           * If creation is successful, the browser will be redirected to the 'view' page.
5c2eb7c8   Yarik   Big commit almost...
90
91
92
           *
           * @param int $product_id
           *
d55d2fe0   Yarik   Multilanguage
93
94
95
96
           * @return mixed
           */
          public function actionCreate($product_id)
          {
4e55ce81   Yarik   Another one admin...
97
              $product = $this->findProduct($product_id);
d55d2fe0   Yarik   Multilanguage
98
              $model = new ProductVariant();
8af13427   Yarik   For leha commit.
99
              $model->product_id = $product->id;
72a992f5   Yarik   Import browser v1.0
100
              $model->generateLangs();
4428da8c   Yarik   Almost all databa...
101
              if ($model->load(Yii::$app->request->post())) {
72a992f5   Yarik   Import browser v1.0
102
                  $model->loadLangs(\Yii::$app->request);
4428da8c   Yarik   Almost all databa...
103
                  if ($model->save() && $model->transactionStatus) {
d55d2fe0   Yarik   Multilanguage
104
                      $ProductStocks = Yii::$app->request->post('ProductStock');
d55d2fe0   Yarik   Multilanguage
105
                      $total_quantity = 0;
4428da8c   Yarik   Almost all databa...
106
                      if (!empty( $ProductStocks ) && is_array($ProductStocks)) {
d55d2fe0   Yarik   Multilanguage
107
108
                          $model->unlinkAll('stocks', true);
                          $sorted_array = [];
4428da8c   Yarik   Almost all databa...
109
110
111
                          foreach ($ProductStocks as $subArray) {
                              if (!empty( $subArray[ 'title' ] ) && !empty( $subArray[ 'quantity' ] )) {
                                  if (!empty( $sorted_array[ $subArray[ 'title' ] ] )) {
8af13427   Yarik   For leha commit.
112
                                      $sorted_array[ $subArray[ 'title' ] ] += $subArray[ 'quantity' ];
d55d2fe0   Yarik   Multilanguage
113
                                  } else {
8af13427   Yarik   For leha commit.
114
                                      $sorted_array[ $subArray[ 'title' ] ] = $subArray[ 'quantity' ];
d55d2fe0   Yarik   Multilanguage
115
                                  }
36d1807a   Yarik   Big commit.
116
117
                              }
                          }
d55d2fe0   Yarik   Multilanguage
118
119
120
                          $ProductStocks = $sorted_array;
                          $stock_names = array_keys($ProductStocks);
                          $stocks = Stock::find()
8af13427   Yarik   For leha commit.
121
122
                                         ->where([ 'title' => $stock_names ])
                                         ->indexBy('title')
d55d2fe0   Yarik   Multilanguage
123
                                         ->all();
4428da8c   Yarik   Almost all databa...
124
                          foreach ($ProductStocks as $name => $quantity) {
d55d2fe0   Yarik   Multilanguage
125
                              $quantity = (int) $quantity;
4428da8c   Yarik   Almost all databa...
126
127
128
129
130
131
132
                              if (!array_key_exists($name, $stocks)) {
                                  $stock = new Stock(
                                      [
                                          'title' => $name,
                                      ]
                                  );
                                  if (!$stock->save()) {
d55d2fe0   Yarik   Multilanguage
133
134
135
136
137
                                      continue;
                                  }
                              } else {
                                  $stock = $stocks[ $name ];
                              }
4428da8c   Yarik   Almost all databa...
138
139
140
141
142
143
144
145
                              $psModel = new ProductStock(
                                  [
                                      'product_variant_id' => $model->id,
                                      'stock_id'           => $stock->id,
                                      'quantity'           => $quantity,
                                  ]
                              );
                              if ($psModel->save()) {
d55d2fe0   Yarik   Multilanguage
146
                                  $total_quantity += $quantity;
36d1807a   Yarik   Big commit.
147
                              }
36d1807a   Yarik   Big commit.
148
                          }
d55d2fe0   Yarik   Multilanguage
149
150
151
152
153
                      } else {
                          $model->unlinkAll('stocks', true);
                      }
                      
                      $model->stock = $total_quantity;
4428da8c   Yarik   Almost all databa...
154
155
156
157
158
159
160
                      if ($model->save() && $model->transactionStatus) {
                          return $this->redirect(
                              [
                                  'index',
                                  'product_id' => $product->id,
                              ]
                          );
36d1807a   Yarik   Big commit.
161
                      }
d8c1a2e0   Yarik   Big commit artbox
162
                  }
d8c1a2e0   Yarik   Big commit artbox
163
              }
d8c1a2e0   Yarik   Big commit artbox
164
              $groups = $model->getTaxGroupsByLevel(1);
4428da8c   Yarik   Almost all databa...
165
166
167
168
169
170
171
172
173
174
              return $this->render(
                  'create',
                  [
                      'model'      => $model,
                      'modelLangs' => $model->modelLangs,
                      'groups'     => $groups,
                      'stocks'     => [ new ProductStock() ],
                      'product'    => $product,
                  ]
              );
d8c1a2e0   Yarik   Big commit artbox
175
          }
d55d2fe0   Yarik   Multilanguage
176
177
178
179
180
181
182
183
184
185
186
187
          
          /**
           * Updates an existing ProductVariant model.
           * If update is successful, the browser will be redirected to the 'view' page.
           *
           * @param integer $product_id
           * @param integer $id
           *
           * @return mixed
           */
          public function actionUpdate($product_id, $id)
          {
4e55ce81   Yarik   Another one admin...
188
              $product = $this->findProduct($product_id);
d55d2fe0   Yarik   Multilanguage
189
              $model = $this->findModel($id);
72a992f5   Yarik   Import browser v1.0
190
              $model->generateLangs();
4428da8c   Yarik   Almost all databa...
191
              if ($model->load(Yii::$app->request->post())) {
72a992f5   Yarik   Import browser v1.0
192
                  $model->loadLangs(\Yii::$app->request);
4428da8c   Yarik   Almost all databa...
193
                  if ($model->save() && $model->transactionStatus) {
d55d2fe0   Yarik   Multilanguage
194
                      $ProductStocks = Yii::$app->request->post('ProductStock');
d55d2fe0   Yarik   Multilanguage
195
                      $total_quantity = 0;
4428da8c   Yarik   Almost all databa...
196
                      if (!empty( $ProductStocks ) && is_array($ProductStocks)) {
d55d2fe0   Yarik   Multilanguage
197
198
                          $model->unlinkAll('stocks', true);
                          $sorted_array = [];
4428da8c   Yarik   Almost all databa...
199
200
201
                          foreach ($ProductStocks as $subArray) {
                              if (!empty( $subArray[ 'title' ] ) && !empty( $subArray[ 'quantity' ] )) {
                                  if (!empty( $sorted_array[ $subArray[ 'title' ] ] )) {
8af13427   Yarik   For leha commit.
202
                                      $sorted_array[ $subArray[ 'title' ] ] += $subArray[ 'quantity' ];
d55d2fe0   Yarik   Multilanguage
203
                                  } else {
8af13427   Yarik   For leha commit.
204
                                      $sorted_array[ $subArray[ 'title' ] ] = $subArray[ 'quantity' ];
d55d2fe0   Yarik   Multilanguage
205
                                  }
36d1807a   Yarik   Big commit.
206
                              }
d8c1a2e0   Yarik   Big commit artbox
207
                          }
d55d2fe0   Yarik   Multilanguage
208
209
210
                          $ProductStocks = $sorted_array;
                          $stock_names = array_keys($ProductStocks);
                          $stocks = Stock::find()
8af13427   Yarik   For leha commit.
211
212
                                         ->where([ 'title' => $stock_names ])
                                         ->indexBy('title')
d55d2fe0   Yarik   Multilanguage
213
                                         ->all();
4428da8c   Yarik   Almost all databa...
214
                          foreach ($ProductStocks as $name => $quantity) {
d55d2fe0   Yarik   Multilanguage
215
                              $quantity = (int) $quantity;
4428da8c   Yarik   Almost all databa...
216
217
218
219
220
221
222
                              if (!array_key_exists($name, $stocks)) {
                                  $stock = new Stock(
                                      [
                                          'title' => $name,
                                      ]
                                  );
                                  if (!$stock->save()) {
d55d2fe0   Yarik   Multilanguage
223
224
225
226
227
                                      continue;
                                  }
                              } else {
                                  $stock = $stocks[ $name ];
                              }
4428da8c   Yarik   Almost all databa...
228
229
230
231
232
233
234
235
                              $psModel = new ProductStock(
                                  [
                                      'product_variant_id' => $model->id,
                                      'stock_id'           => $stock->id,
                                      'quantity'           => $quantity,
                                  ]
                              );
                              if ($psModel->save()) {
d55d2fe0   Yarik   Multilanguage
236
                                  $total_quantity += $quantity;
36d1807a   Yarik   Big commit.
237
                              }
36d1807a   Yarik   Big commit.
238
                          }
d55d2fe0   Yarik   Multilanguage
239
240
241
                      } else {
                          $model->unlinkAll('stocks', true);
                      }
d55d2fe0   Yarik   Multilanguage
242
                      $model->stock = $total_quantity;
4428da8c   Yarik   Almost all databa...
243
244
245
246
247
248
249
                      if ($model->save() && $model->transactionStatus) {
                          return $this->redirect(
                              [
                                  'index',
                                  'product_id' => $product_id,
                              ]
                          );
d8c1a2e0   Yarik   Big commit artbox
250
                      }
d8c1a2e0   Yarik   Big commit artbox
251
                  }
d8c1a2e0   Yarik   Big commit artbox
252
              }
d8c1a2e0   Yarik   Big commit artbox
253
              $groups = $model->getTaxGroupsByLevel(1);
4428da8c   Yarik   Almost all databa...
254
255
256
257
258
259
260
261
262
263
              return $this->render(
                  'update',
                  [
                      'model'      => $model,
                      'modelLangs' => $model->modelLangs,
                      'groups'     => $groups,
                      'stocks'     => ( !empty( $model->variantStocks ) ) ? $model->variantStocks : [ new ProductStock ],
                      'product'    => $product,
                  ]
              );
d8c1a2e0   Yarik   Big commit artbox
264
          }
d55d2fe0   Yarik   Multilanguage
265
266
267
268
269
          
          /**
           * Deletes an existing ProductVariant model.
           * If deletion is successful, the browser will be redirected to the 'index' page.
           *
72a992f5   Yarik   Import browser v1.0
270
           * @param integer $product_id
d55d2fe0   Yarik   Multilanguage
271
272
273
274
275
276
277
278
279
280
           * @param integer $id
           *
           * @return mixed
           */
          public function actionDelete($product_id, $id)
          {
              
              $this->findModel($id)
                   ->delete();
              
4428da8c   Yarik   Almost all databa...
281
282
283
284
285
286
              return $this->redirect(
                  [
                      'index',
                      'product_id' => $product_id,
                  ]
              );
d8c1a2e0   Yarik   Big commit artbox
287
          }
d55d2fe0   Yarik   Multilanguage
288
289
290
291
292
          
          public function actionDelimg($id)
          {
              $image = ProductImage::findOne($id);
              
4428da8c   Yarik   Almost all databa...
293
              if ($image) {
d55d2fe0   Yarik   Multilanguage
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
                  $image->delete();
              }
              
              print '1';
              exit;
          }
          
          /**
           * Finds the ProductVariant model based on its primary key value.
           * If the model is not found, a 404 HTTP exception will be thrown.
           *
           * @param integer $id
           *
           * @return ProductVariant the loaded model
           * @throws NotFoundHttpException if the model cannot be found
           */
          protected function findModel($id)
          {
4428da8c   Yarik   Almost all databa...
312
313
314
315
              if (( $model = ProductVariant::find()
                                           ->where([ 'id' => $id ])
                                           ->with('lang')
                                           ->one() ) !== null
4e55ce81   Yarik   Another one admin...
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
              ) {
                  return $model;
              } else {
                  throw new NotFoundHttpException('The requested page does not exist.');
              }
          }
          
          /**
           * @param int $product_id
           *
           * @return Product
           * @throws NotFoundHttpException
           */
          protected function findProduct($product_id)
          {
4428da8c   Yarik   Almost all databa...
331
332
333
334
              if (( $model = Product::find()
                                    ->with('lang')
                                    ->where([ 'id' => $product_id ])
                                    ->one() ) !== null
4e55ce81   Yarik   Another one admin...
335
              ) {
d55d2fe0   Yarik   Multilanguage
336
337
338
339
                  return $model;
              } else {
                  throw new NotFoundHttpException('The requested page does not exist.');
              }
d8c1a2e0   Yarik   Big commit artbox
340
341
          }
      }