Blame view

common/modules/product/controllers/VariantController.php 10.9 KB
d8c1a2e0   Yarik   Big commit artbox
1
  <?php
d55d2fe0   Yarik   Multilanguage
2
3
4
5
6
7
8
9
10
11
      
      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;
      use common\modules\product\models\ProductVariantListSearch;
      use common\modules\product\models\Stock;
      use Yii;
d55d2fe0   Yarik   Multilanguage
12
13
14
      use yii\web\Controller;
      use yii\web\NotFoundHttpException;
      use yii\filters\VerbFilter;
d55d2fe0   Yarik   Multilanguage
15
      
d8c1a2e0   Yarik   Big commit artbox
16
      /**
d55d2fe0   Yarik   Multilanguage
17
       * ManageController implements the CRUD actions for ProductVariant model.
d8c1a2e0   Yarik   Big commit artbox
18
       */
d55d2fe0   Yarik   Multilanguage
19
      class VariantController extends Controller
d8c1a2e0   Yarik   Big commit artbox
20
      {
d55d2fe0   Yarik   Multilanguage
21
22
23
24
25
26
27
28
29
30
31
32
          
          /**
           * @inheritdoc
           */
          public function behaviors()
          {
              return [
                  'verbs' => [
                      'class'   => VerbFilter::className(),
                      'actions' => [
                          'delete' => [ 'POST' ],
                      ],
d8c1a2e0   Yarik   Big commit artbox
33
                  ],
d55d2fe0   Yarik   Multilanguage
34
              ];
d8c1a2e0   Yarik   Big commit artbox
35
          }
36d1807a   Yarik   Big commit.
36
          
d55d2fe0   Yarik   Multilanguage
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
          /**
           * Lists all ProductVariant models.
           * @return mixed
           */
          public function actionIndex($product_id)
          {
              $searchModel = new ProductVariantListSearch();
              $dataProvider = $searchModel->search(Yii::$app->request->queryParams, $product_id);
              
              if(( $product = Yii::$app->request->get('product_id') ) !== NULL) {
                  $product = Product::findOne($product);
              }
              
              return $this->render('index', [
                  'searchModel'  => $searchModel,
                  'dataProvider' => $dataProvider,
                  'product'      => $product,
                  'product_id'   => $product_id,
              ]);
          }
36d1807a   Yarik   Big commit.
57
          
d55d2fe0   Yarik   Multilanguage
58
59
60
61
62
63
64
65
66
67
68
69
70
          /**
           * Displays a single ProductVariant model.
           *
           * @param integer $id
           *
           * @return mixed
           */
          public function actionView($id)
          {
              return $this->render('view', [
                  'model' => $this->findModel($id),
              ]);
          }
36d1807a   Yarik   Big commit.
71
          
d55d2fe0   Yarik   Multilanguage
72
73
74
75
76
77
78
79
80
          /**
           * Creates a new ProductVariant model.
           * If creation is successful, the browser will be redirected to the 'view' page.
           * @return mixed
           */
          public function actionCreate($product_id)
          {
              $model = new ProductVariant();
              $model->product_id = $product_id;
72a992f5   Yarik   Import browser v1.0
81
              $model->generateLangs();
d55d2fe0   Yarik   Multilanguage
82
              if($model->load(Yii::$app->request->post())) {
72a992f5   Yarik   Import browser v1.0
83
                  $model->loadLangs(\Yii::$app->request);
72a992f5   Yarik   Import browser v1.0
84
                  if($model->save() && $model->transactionStatus) {
d55d2fe0   Yarik   Multilanguage
85
                      $ProductStocks = Yii::$app->request->post('ProductStock');
d55d2fe0   Yarik   Multilanguage
86
                      $total_quantity = 0;
d55d2fe0   Yarik   Multilanguage
87
88
89
90
91
92
93
94
95
96
                      if(!empty( $ProductStocks ) && is_array($ProductStocks)) {
                          $model->unlinkAll('stocks', true);
                          $sorted_array = [];
                          foreach($ProductStocks as $subArray) {
                              if(!empty( $subArray[ 'name' ] ) && !empty( $subArray[ 'quantity' ] )) {
                                  if(!empty( $sorted_array[ $subArray[ 'name' ] ] )) {
                                      $sorted_array[ $subArray[ 'name' ] ] += $subArray[ 'quantity' ];
                                  } else {
                                      $sorted_array[ $subArray[ 'name' ] ] = $subArray[ 'quantity' ];
                                  }
36d1807a   Yarik   Big commit.
97
98
                              }
                          }
d55d2fe0   Yarik   Multilanguage
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
                          $ProductStocks = $sorted_array;
                          $stock_names = array_keys($ProductStocks);
                          $stocks = Stock::find()
                                         ->where([ 'name' => $stock_names ])
                                         ->indexBy('name')
                                         ->all();
                          foreach($ProductStocks as $name => $quantity) {
                              $quantity = (int) $quantity;
                              if(!array_key_exists($name, $stocks)) {
                                  $stock = new Stock([
                                      'name' => $name,
                                  ]);
                                  if(!$stock->save()) {
                                      continue;
                                  }
                              } else {
                                  $stock = $stocks[ $name ];
                              }
                              $psModel = new ProductStock([
                                  'product_id'         => $model->product_id,
                                  'product_variant_id' => $model->product_variant_id,
                                  'stock_id'           => $stock->stock_id,
                                  'quantity'           => $quantity,
36d1807a   Yarik   Big commit.
122
                              ]);
d55d2fe0   Yarik   Multilanguage
123
124
                              if($psModel->save()) {
                                  $total_quantity += $quantity;
36d1807a   Yarik   Big commit.
125
                              }
36d1807a   Yarik   Big commit.
126
                          }
d55d2fe0   Yarik   Multilanguage
127
128
129
130
131
                      } else {
                          $model->unlinkAll('stocks', true);
                      }
                      
                      $model->stock = $total_quantity;
72a992f5   Yarik   Import browser v1.0
132
                      if($model->save() && $model->transactionStatus) {
d55d2fe0   Yarik   Multilanguage
133
134
135
136
                          return $this->redirect([
                              'index',
                              'product_id' => $product_id,
                          ]);
36d1807a   Yarik   Big commit.
137
                      }
d8c1a2e0   Yarik   Big commit artbox
138
                  }
d8c1a2e0   Yarik   Big commit artbox
139
              }
d8c1a2e0   Yarik   Big commit artbox
140
              $groups = $model->getTaxGroupsByLevel(1);
d8c1a2e0   Yarik   Big commit artbox
141
              return $this->render('create', [
d55d2fe0   Yarik   Multilanguage
142
                  'model'       => $model,
72a992f5   Yarik   Import browser v1.0
143
                  'model_langs' => $model->model_langs,
d55d2fe0   Yarik   Multilanguage
144
145
                  'groups'      => $groups,
                  'stocks'      => [ new ProductStock() ],
d8c1a2e0   Yarik   Big commit artbox
146
147
              ]);
          }
d55d2fe0   Yarik   Multilanguage
148
149
150
151
152
153
154
155
156
157
158
159
160
          
          /**
           * 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)
          {
              $model = $this->findModel($id);
72a992f5   Yarik   Import browser v1.0
161
              $model->generateLangs();
d55d2fe0   Yarik   Multilanguage
162
              if($model->load(Yii::$app->request->post())) {
72a992f5   Yarik   Import browser v1.0
163
164
                  $model->loadLangs(\Yii::$app->request);
                  if($model->save() && $model->transactionStatus) {
d55d2fe0   Yarik   Multilanguage
165
                      $ProductStocks = Yii::$app->request->post('ProductStock');
d55d2fe0   Yarik   Multilanguage
166
                      $total_quantity = 0;
d55d2fe0   Yarik   Multilanguage
167
168
169
170
171
172
173
174
175
176
                      if(!empty( $ProductStocks ) && is_array($ProductStocks)) {
                          $model->unlinkAll('stocks', true);
                          $sorted_array = [];
                          foreach($ProductStocks as $subArray) {
                              if(!empty( $subArray[ 'name' ] ) && !empty( $subArray[ 'quantity' ] )) {
                                  if(!empty( $sorted_array[ $subArray[ 'name' ] ] )) {
                                      $sorted_array[ $subArray[ 'name' ] ] += $subArray[ 'quantity' ];
                                  } else {
                                      $sorted_array[ $subArray[ 'name' ] ] = $subArray[ 'quantity' ];
                                  }
36d1807a   Yarik   Big commit.
177
                              }
d8c1a2e0   Yarik   Big commit artbox
178
                          }
d55d2fe0   Yarik   Multilanguage
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
                          $ProductStocks = $sorted_array;
                          $stock_names = array_keys($ProductStocks);
                          $stocks = Stock::find()
                                         ->where([ 'name' => $stock_names ])
                                         ->indexBy('name')
                                         ->all();
                          foreach($ProductStocks as $name => $quantity) {
                              $quantity = (int) $quantity;
                              if(!array_key_exists($name, $stocks)) {
                                  $stock = new Stock([
                                      'name' => $name,
                                  ]);
                                  if(!$stock->save()) {
                                      continue;
                                  }
                              } else {
                                  $stock = $stocks[ $name ];
                              }
                              $psModel = new ProductStock([
                                  'product_id'         => $model->product_id,
                                  'product_variant_id' => $model->product_variant_id,
                                  'stock_id'           => $stock->stock_id,
                                  'quantity'           => $quantity,
36d1807a   Yarik   Big commit.
202
                              ]);
d55d2fe0   Yarik   Multilanguage
203
204
                              if($psModel->save()) {
                                  $total_quantity += $quantity;
36d1807a   Yarik   Big commit.
205
                              }
36d1807a   Yarik   Big commit.
206
                          }
d55d2fe0   Yarik   Multilanguage
207
208
209
                      } else {
                          $model->unlinkAll('stocks', true);
                      }
d55d2fe0   Yarik   Multilanguage
210
                      $model->stock = $total_quantity;
72a992f5   Yarik   Import browser v1.0
211
                      if($model->save() && $model->transactionStatus) {
d55d2fe0   Yarik   Multilanguage
212
213
214
                          return $this->redirect([
                              'index',
                              'product_id' => $product_id,
36d1807a   Yarik   Big commit.
215
                          ]);
d8c1a2e0   Yarik   Big commit artbox
216
                      }
d8c1a2e0   Yarik   Big commit artbox
217
                  }
d8c1a2e0   Yarik   Big commit artbox
218
              }
d8c1a2e0   Yarik   Big commit artbox
219
              $groups = $model->getTaxGroupsByLevel(1);
d8c1a2e0   Yarik   Big commit artbox
220
              return $this->render('update', [
d55d2fe0   Yarik   Multilanguage
221
                  'model'       => $model,
72a992f5   Yarik   Import browser v1.0
222
                  'model_langs' => $model->model_langs,
d55d2fe0   Yarik   Multilanguage
223
224
                  'groups'      => $groups,
                  'stocks'      => ( !empty( $model->variantStocks ) ) ? $model->variantStocks : [ new ProductStock ],
d8c1a2e0   Yarik   Big commit artbox
225
              ]);
d8c1a2e0   Yarik   Big commit artbox
226
          }
d55d2fe0   Yarik   Multilanguage
227
228
229
230
231
          
          /**
           * Deletes an existing ProductVariant model.
           * If deletion is successful, the browser will be redirected to the 'index' page.
           *
72a992f5   Yarik   Import browser v1.0
232
           * @param integer $product_id
d55d2fe0   Yarik   Multilanguage
233
234
235
236
237
238
239
240
241
242
243
244
245
246
           * @param integer $id
           *
           * @return mixed
           */
          public function actionDelete($product_id, $id)
          {
              
              $this->findModel($id)
                   ->delete();
              
              return $this->redirect([
                  'index',
                  'product_id' => $product_id,
              ]);
d8c1a2e0   Yarik   Big commit artbox
247
          }
d55d2fe0   Yarik   Multilanguage
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
          
          public function actionDelimg($id)
          {
              $image = ProductImage::findOne($id);
              
              if($image) {
                  $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)
          {
              if(( $model = ProductVariant::findOne($id) ) !== NULL) {
                  return $model;
              } else {
                  throw new NotFoundHttpException('The requested page does not exist.');
              }
d8c1a2e0   Yarik   Big commit artbox
277
278
          }
      }