Commit 42883b835bd566a5e2afdfe48eb3eb6edc451aa4

Authored by Alexey Boroda
1 parent b8e6a5c4

-Order form beta test

controllers/OrderController.php
... ... @@ -136,16 +136,16 @@
136 136 return $this->redirect([ 'index' ]);
137 137 }
138 138  
139   - public function actionDeleteProduct($id)
140   - {
141   - $model = OrderProduct::findOne($id);
142   - $model->removed = true;
143   - $orderId = $model->order_id;
144   - if ($model->save()) {
145   - $model->order->totalRecount();
146   - return $this->actionUpdate($orderId);
147   - }
148   - }
  139 + // public function actionDeleteProduct($id)
  140 + // {
  141 + // $model = OrderProduct::findOne($id);
  142 + // $model->removed = true;
  143 + // $orderId = $model->order_id;
  144 + // if ($model->save()) {
  145 + // $model->order->totalRecount();
  146 + // return $this->actionUpdate($orderId);
  147 + // }
  148 + // }
149 149  
150 150 public function actionAdd()
151 151 {
... ... @@ -330,7 +330,8 @@
330 330 $dataProvider = new ActiveDataProvider(
331 331 [
332 332 'query' => $model->getProducts()
333   - ->joinWith('productVariant.product.brand'),
  333 + ->joinWith('productVariant.product.brand')
  334 + ->with('productVariant.variantStocks'),
334 335 'sort' => [ 'defaultOrder' => [ 'id' => SORT_ASC ] ],
335 336 ]
336 337 );
... ... @@ -402,16 +403,19 @@
402 403 return $phone . $content . $result;
403 404 }
404 405  
405   - // public function actionDeleteProduct($id, $order_id)
406   - // {
407   - // $model = OrderProduct::findOne($id);
408   - // $model->delete();
409   - // \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
410   - // return [
411   - // 'result' => 'success',
412   - // 'id' => $id,
413   - // ];
414   - // }
  406 + public function actionDeleteProduct($id, $order_id)
  407 + {
  408 + $model = OrderProduct::findOne($id);
  409 + $model->removed = true;
  410 + $model->save();
  411 + $order = Order::findOne($order_id);
  412 + $order->totalRecount();
  413 + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
  414 + return [
  415 + 'status' => 'success',
  416 + 'id' => $id,
  417 + ];
  418 + }
415 419  
416 420 protected function findModel($id)
417 421 {
... ...
models/ProductVariant.php
... ... @@ -35,6 +35,7 @@
35 35 * @property Stock[] $stocks
36 36 * @property TaxGroup[] $properties
37 37 * @property TaxGroup[] $taxGroupsByLevel
  38 + * @property string $size
38 39 * * From language behavior *
39 40 * @property ProductVariantLang $lang
40 41 * @property ProductVariantLang[] $langs
... ... @@ -70,7 +71,6 @@
70 71  
71 72 public $customOption = [];
72 73  
73   -
74 74 /**
75 75 * @var int[] $options
76 76 */
... ... @@ -104,8 +104,8 @@
104 104 'directory' => 'products',
105 105 'column' => 'image',
106 106 'links' => [
107   - 'product_id' => 'product_id',
108   - 'id' => 'product_variant_id',
  107 + 'product_id' => 'product_id',
  108 + 'id' => 'product_variant_id',
109 109 ],
110 110 'model' => ProductImage::className(),
111 111 ],
... ... @@ -240,7 +240,7 @@
240 240 } else {
241 241 $quantity = $this->getProductStocks()
242 242 ->sum('quantity');
243   - if (empty( $quantity )) {
  243 + if (empty($quantity)) {
244 244 $this->stock = 0;
245 245 } else {
246 246 $this->stock = (int) $quantity;
... ... @@ -279,7 +279,7 @@
279 279 return $this->hasMany(TaxOption::className(), [ 'id' => 'option_id' ])
280 280 ->viaTable('product_variant_option', [ 'product_variant_id' => 'id' ]);
281 281 }
282   -
  282 +
283 283 /**
284 284 * Get one variant's option whith needed conditions, or random if condition is empty
285 285 *
... ... @@ -290,11 +290,9 @@
290 290 public function getOption(array $conditions = [])
291 291 {
292 292 $query = $this->hasOne(TaxOption::className(), [ 'id' => 'option_id' ])
293   - ->viaTable('product_variant_option', [ 'product_variant_id' => 'id' ]);
294   - foreach ($conditions as $condition)
295   - {
296   - if (!empty($condition) && is_array($condition))
297   - {
  293 + ->viaTable('product_variant_option', [ 'product_variant_id' => 'id' ]);
  294 + foreach ($conditions as $condition) {
  295 + if (!empty($condition) && is_array($condition)) {
298 296 $query->andFilterWhere($condition);
299 297 }
300 298 }
... ... @@ -333,7 +331,7 @@
333 331 {
334 332 $this->options = $values;
335 333 }
336   -
  334 +
337 335 /**
338 336 * Get all TaxGroups for current ProductVariant filled with $customOptions that satisfy current ProductVariant
339 337 *
... ... @@ -362,12 +360,11 @@
362 360 $query->andFilterWhere($condition);
363 361 }
364 362 }
365   - foreach (
366   - $query->all() as $group) {
  363 + foreach ($query->all() as $group) {
367 364 /**
368 365 * @var TaxGroup $group
369 366 */
370   - if (!empty( $options[ $group->id ] )) {
  367 + if (!empty($options[ $group->id ])) {
371 368 $group->customOptions = $options[ $group->id ];
372 369 $groups[] = $group;
373 370 }
... ... @@ -421,7 +418,7 @@
421 418 public function afterSave($insert, $changedAttributes)
422 419 {
423 420 parent::afterSave($insert, $changedAttributes);
424   - if (!empty( $this->options )) {
  421 + if (!empty($this->options)) {
425 422 $options = TaxOption::findAll($this->options);
426 423 $this->unlinkAll('options', true);
427 424 foreach ($options as $option) {
... ... @@ -429,7 +426,7 @@
429 426 }
430 427 }
431 428  
432   - if (!empty( $this->stocks )) {
  429 + if (!empty($this->stocks)) {
433 430 ProductStock::deleteAll([ 'product_variant_id' => $this->id ]);
434 431 foreach ($this->stocks as $id => $quantity) {
435 432 /**
... ... @@ -448,4 +445,25 @@
448 445 }
449 446 }
450 447 }
  448 +
  449 + /**
  450 + * @return string
  451 + */
  452 + public function getSize()
  453 + {
  454 + $option = $this->getOptions()
  455 + ->with('lang')
  456 + ->joinWith('group')
  457 + ->where(
  458 + [
  459 + 'tax_group.position' => 1,
  460 + ]
  461 + )
  462 + ->one();
  463 + if (empty($option)) {
  464 + return '';
  465 + } else {
  466 + return $option->lang->value;
  467 + }
  468 + }
451 469 }
... ...
views/order/_form.php
... ... @@ -7,6 +7,7 @@
7 7 use backend\models\SmsTemplate;
8 8 use common\models\User;
9 9 use kartik\grid\GridView;
  10 + use kartik\grid\SerialColumn;
10 11 use kartik\widgets\DatePicker;
11 12 use kartik\widgets\Select2;
12 13 use kartik\widgets\SwitchInput;
... ... @@ -15,8 +16,10 @@
15 16 use yii\bootstrap\ActiveForm;
16 17 use yii\helpers\ArrayHelper;
17 18 use artweb\artbox\ecommerce\models\Delivery;
  19 + use yii\helpers\StringHelper;
18 20 use yii\web\View;
19 21 use yii\web\JsExpression;
  22 + use yii\widgets\Pjax;
20 23  
21 24 /**
22 25 * @var View $this
... ... @@ -39,7 +42,23 @@ $(document).on('submit', '#add-product-form', function(e) {
39 42 data: addFormData,
40 43 success: function (data) {
41 44 if (data.status === "success") {
42   - $.pjax.reload({container:"#order-products-grid"}); //Reload GridView
  45 + $.pjax.reload({container:"#order-products-grid"});
  46 + }
  47 + },
  48 + error: function () {
  49 + }
  50 + });
  51 +});
  52 +$(document).on('click', '.delete-button', function(e) {
  53 + e.preventDefault();
  54 + var link = $(this).attr('href') + '&order_id=' + {$model->id};
  55 + $.ajax({
  56 + url: link,
  57 + type: "GET",
  58 + success: function (data) {
  59 + if (data.status === "success") {
  60 + $.pjax.reload({container:"#order-products-grid"});
  61 + $('[data-toggle="popover"]').popover();
43 62 }
44 63 },
45 64 error: function () {
... ... @@ -54,6 +73,11 @@ JS;
54 73 $('#order-phone, #order-phone2').mask('+38(000)000-00-00', {
55 74 placeholder: '+38(___)___-__-__'
56 75 });
  76 +$('[data-toggle="popover"]').popover();
  77 +$(document).on('pjax:end', '#order-products-grid', function() {
  78 + $('[data-toggle="popover"]').popover();
  79 + $.pjax.reload({container: '#total-cost'});
  80 +});
57 81 JS;
58 82  
59 83 $this->registerJs($js, View::POS_READY);
... ... @@ -120,480 +144,538 @@ JS;
120 144  
121 145 <?php $form = ActiveForm::begin([ 'id' => 'main-form' ]); ?>
122 146 <div class="container">
123   - <div class="form-group">
124   - <br>
125   - <div class="row">
126   - <div class="col-sm-6">
127   -
128   - <?= $form->field($model, 'deadline')
129   - ->widget(
130   - DatePicker::className(),
131   - [
132   -
133   - ]
134   - ) ?>
135   -
136   - <?php
137   - if ($user->isAdmin()) {
138   - echo $form->field($model, 'pay')
139   - ->widget(
140   - SwitchInput::className(),
141   - [
142   - 'name' => 'pay',
143   - 'pluginOptions' => [
144   - 'onText' => \Yii::t('app', 'Оплачено'),
145   - 'offText' => \Yii::t('app', 'Не оплачено'),
146   - ],
147   - ]
148   - );
149   - }
150   - ?>
151   -
152   - <?= $form->field($model, 'reason')
153   - ->dropDownList(
154   - Order::REASONS,
155   - [ 'prompt' => 'Выберите причину' ]
156   - ) ?>
157   -
158   - <?= $form->field($model, 'label')
159   - ->dropDownList(
160   - ArrayHelper::map(
161   - Label::find()
162   - ->asArray()
163   - ->all(),
164   - 'id',
165   - 'label'
166   - ),
167   - [ 'prompt' => 'Выберите метку' ]
168   - ); ?>
169   -
170   - <?= $form->field($model, 'name') ?>
171   -
172   - <?= $form->field($model, 'phone')
173   - ->textInput([ 'readonly' => $user->isAdmin() ? false : true ]) ?>
174   -
175   - <?= $form->field($model, 'phone2') ?>
176   -
177   - <?= $form->field($model, 'email')
178   - ->textInput([ 'readonly' => $user->isAdmin() ? false : true ]) ?>
179   -
180   - <?= $form->field(
181   - $model,
182   - 'numbercard'
183   - )
184   - ->textInput([ 'readonly' => true ]) ?>
185   -
186   - <?= $form->field($model, 'comment')
187   - ->textarea([ 'rows' => '3' ]) ?>
188   - <?= $form->field($model, 'delivery')
189   - ->dropDownList(
190   - ArrayHelper::map(
191   - Delivery::find()
192   - ->joinWith('lang')
193   - ->asArray()
194   - ->all(),
195   - 'id',
196   - 'lang.title'
197   - ),
198   - [ 'prompt' => \Yii::t('app', 'Выберите доставку ...') ]
199   - ) ?>
200   -
201   - <?php
202   -
203   - if ($user->isAdmin()) {
204   - echo $form->field($model, 'manager_id')
205   - ->dropDownList(
206   - ArrayHelper::map(
207   - User::find()
208   - ->asArray()
209   - ->all(),
210   - 'id',
211   - 'username'
212   - ),
213   - [ 'prompt' => \Yii::t('app', 'Менеджер') ]
214   - );
215   - }
216   - ?>
217   -
218   - <h2><?php echo \Yii::t('app', 'Отправить смс'); ?></h2>
219   - <?php
220   - echo Select2::widget(
221   - [
222   - 'id' => 'sms-template-selector',
223   - 'name' => 'select-sms-template',
224   - 'data' => ArrayHelper::map(
225   - SmsTemplate::find()
226   - ->asArray()
227   - ->all(),
228   - 'text',
229   - 'title'
230   - ),
231   - 'options' => [ 'placeholder' => \Yii::t('app', 'Выберите шаблон') ],
232   - 'pluginOptions' => [
233   - 'allowClear' => true,
234   - ],
235   - ]
236   - );
237   -
238   - ?>
239   - <br>
240   - <?php
241   - echo Html::textarea(
242   - 'sms-text',
243   - '',
244   - [
245   - 'rows' => 3,
246   - 'id' => 'sms-text-area',
247   - 'class' => 'form-control',
248   - ]
249   - );
250   - ?>
251   - <br>
252   - <div class="row">
253   - <div class="col-md-6">
254   - <?php
255   - if ($model->isNewRecord) {
256   - echo Html::button(
257   - \Yii::t('app', 'Отправить'),
258   - [
259   - 'class' => 'btn btn-warning disabled',
260   - ]
261   - );
262   - } else {
263   - echo Html::button(
264   - \Yii::t('app', 'Отправить'),
265   - [
266   - 'class' => 'btn btn-warning',
267   - 'id' => 'send-sms-action',
268   - ]
269   - );
270   - }
271   - ?>
272   - </div>
273   - <div class="col-md-6">
274   - <?php
275   - echo Html::radioList(
276   - 'send-phone',
277   - '1',
  147 + <div class="form-group">
  148 + <br>
  149 + <div class="row">
  150 + <div class="col-sm-6">
  151 +
  152 + <?= $form->field($model, 'deadline')
  153 + ->widget(
  154 + DatePicker::className(),
  155 + [
  156 +
  157 + ]
  158 + ) ?>
  159 +
  160 + <?php
  161 + if ($user->isAdmin()) {
  162 + echo $form->field($model, 'pay')
  163 + ->widget(
  164 + SwitchInput::className(),
278 165 [
279   - '1' => 'Первый номер',
280   - '2' => 'Второй номер',
  166 + 'name' => 'pay',
  167 + 'pluginOptions' => [
  168 + 'onText' => \Yii::t('app', 'Оплачено'),
  169 + 'offText' => \Yii::t('app', 'Не оплачено'),
  170 + ],
281 171 ]
282 172 );
283   - ?>
284   - </div>
285   - </div>
286   -
287   - </div>
288   - <div class="col-sm-6">
289   -
290   - <?= $form->field($model, 'declaration') ?>
291   -
292   - <?= $form->field($model, 'stock') ?>
293   -
294   - <?= $form->field($model, 'consignment') ?>
295   -
296   - <?= $form->field($model, 'payment')
297   - ->dropDownList(
298   - ArrayHelper::map(
299   - OrderPayment::find()
300   - ->where([ 'status' => OrderPayment::ACTIVE ])
301   - ->asArray()
302   - ->all(),
303   - 'id',
304   - 'short'
305   - ),
306   - [ 'prompt' => 'Способ оплаты ...' ]
307   - ); ?>
308   -
309   - <?= $form->field($model, 'insurance') ?>
310   -
311   - <?= $form->field($model, 'amount_imposed') ?>
312   -
313   - <?= $form->field($model, 'shipping_by')
314   - ->dropDownList(
315   - ArrayHelper::getColumn(Order::SHIPPING_BY, 'label'),
316   - [ 'prompt' => 'Оплата доставки ...' ]
317   - ); ?>
318   -
319   - <?= $form->field($model, 'city') ?>
320   -
321   - <?= $form->field($model, 'adress') ?>
322   -
323   - <?= $form->field($model, 'body')
324   - ->textarea([ 'rows' => '3' ]) ?>
325   -
326   - <?= $form->field($model, 'check') ?>
327   -
328   - <?= $form->field($model, 'sms') ?>
329   -
330   - <?= $form->field($model, 'delivery_cost') ?>
331   -
332   - </div>
  173 + }
  174 + ?>
  175 +
  176 + <?= $form->field($model, 'reason')
  177 + ->dropDownList(
  178 + Order::REASONS,
  179 + [ 'prompt' => 'Выберите причину' ]
  180 + ) ?>
  181 +
  182 + <?= $form->field($model, 'label')
  183 + ->dropDownList(
  184 + ArrayHelper::map(
  185 + Label::find()
  186 + ->asArray()
  187 + ->all(),
  188 + 'id',
  189 + 'label'
  190 + ),
  191 + [ 'prompt' => 'Выберите метку' ]
  192 + ); ?>
  193 +
  194 + <?= $form->field($model, 'name') ?>
  195 +
  196 + <?= $form->field($model, 'phone')
  197 + ->textInput([ 'readonly' => $user->isAdmin() ? false : true ]) ?>
  198 +
  199 + <?= $form->field($model, 'phone2') ?>
  200 +
  201 + <?= $form->field($model, 'email')
  202 + ->textInput([ 'readonly' => $user->isAdmin() ? false : true ]) ?>
  203 +
  204 + <?= $form->field(
  205 + $model,
  206 + 'numbercard'
  207 + )
  208 + ->textInput([ 'readonly' => true ]) ?>
  209 +
  210 + <?= $form->field($model, 'comment')
  211 + ->textarea([ 'rows' => '3' ]) ?>
  212 + <?= $form->field($model, 'delivery')
  213 + ->dropDownList(
  214 + ArrayHelper::map(
  215 + Delivery::find()
  216 + ->joinWith('lang')
  217 + ->asArray()
  218 + ->all(),
  219 + 'id',
  220 + 'lang.title'
  221 + ),
  222 + [ 'prompt' => \Yii::t('app', 'Выберите доставку ...') ]
  223 + ) ?>
  224 +
  225 + <?php
  226 +
  227 + if ($user->isAdmin()) {
  228 + echo $form->field($model, 'manager_id')
  229 + ->dropDownList(
  230 + ArrayHelper::map(
  231 + User::find()
  232 + ->asArray()
  233 + ->all(),
  234 + 'id',
  235 + 'username'
  236 + ),
  237 + [ 'prompt' => \Yii::t('app', 'Менеджер') ]
  238 + );
  239 + }
  240 + ?>
  241 +
  242 + <h2><?php echo \Yii::t('app', 'Отправить смс'); ?></h2>
  243 + <?php
  244 + echo Select2::widget(
  245 + [
  246 + 'id' => 'sms-template-selector',
  247 + 'name' => 'select-sms-template',
  248 + 'data' => ArrayHelper::map(
  249 + SmsTemplate::find()
  250 + ->asArray()
  251 + ->all(),
  252 + 'text',
  253 + 'title'
  254 + ),
  255 + 'options' => [ 'placeholder' => \Yii::t('app', 'Выберите шаблон') ],
  256 + 'pluginOptions' => [
  257 + 'allowClear' => true,
  258 + ],
  259 + ]
  260 + );
  261 +
  262 + ?>
  263 + <br>
  264 + <?php
  265 + echo Html::textarea(
  266 + 'sms-text',
  267 + '',
  268 + [
  269 + 'rows' => 3,
  270 + 'id' => 'sms-text-area',
  271 + 'class' => 'form-control',
  272 + ]
  273 + );
  274 + ?>
  275 + <br>
  276 + <div class="row">
  277 + <div class="col-md-6">
  278 + <?php
  279 + if ($model->isNewRecord) {
  280 + echo Html::button(
  281 + \Yii::t('app', 'Отправить'),
  282 + [
  283 + 'class' => 'btn btn-warning disabled',
  284 + ]
  285 + );
  286 + } else {
  287 + echo Html::button(
  288 + \Yii::t('app', 'Отправить'),
  289 + [
  290 + 'class' => 'btn btn-warning',
  291 + 'id' => 'send-sms-action',
  292 + ]
  293 + );
  294 + }
  295 + ?>
  296 + </div>
  297 + <div class="col-md-6">
  298 + <?php
  299 + echo Html::radioList(
  300 + 'send-phone',
  301 + '1',
  302 + [
  303 + '1' => 'Первый номер',
  304 + '2' => 'Второй номер',
  305 + ]
  306 + );
  307 + ?>
  308 + </div>
333 309 </div>
  310 +
  311 + </div>
  312 + <div class="col-sm-6">
  313 +
  314 + <?= $form->field($model, 'declaration') ?>
  315 +
  316 + <?= $form->field($model, 'stock') ?>
  317 +
  318 + <?= $form->field($model, 'consignment') ?>
  319 +
  320 + <?= $form->field($model, 'payment')
  321 + ->dropDownList(
  322 + ArrayHelper::map(
  323 + OrderPayment::find()
  324 + ->where([ 'status' => OrderPayment::ACTIVE ])
  325 + ->asArray()
  326 + ->all(),
  327 + 'id',
  328 + 'short'
  329 + ),
  330 + [ 'prompt' => 'Способ оплаты ...' ]
  331 + ); ?>
  332 +
  333 + <?= $form->field($model, 'insurance') ?>
  334 +
  335 + <?= $form->field($model, 'amount_imposed') ?>
  336 +
  337 + <?= $form->field($model, 'shipping_by')
  338 + ->dropDownList(
  339 + ArrayHelper::getColumn(Order::SHIPPING_BY, 'label'),
  340 + [ 'prompt' => 'Оплата доставки ...' ]
  341 + ); ?>
  342 +
  343 + <?= $form->field($model, 'city') ?>
  344 +
  345 + <?= $form->field($model, 'adress') ?>
  346 +
  347 + <?= $form->field($model, 'body')
  348 + ->textarea([ 'rows' => '3' ]) ?>
  349 +
  350 + <?= $form->field($model, 'check') ?>
  351 +
  352 + <?= $form->field($model, 'sms') ?>
  353 +
  354 + <?= $form->field($model, 'delivery_cost') ?>
  355 +
  356 + </div>
334 357 </div>
  358 + </div>
335 359 </div>
336 360  
337 361 <?php ActiveForm::end(); ?>
338 362 <br>
339 363 <br>
340 364 <div class="container">
341   - <div class="row">
342   - <?php
343   - echo GridView::widget(
344   - [
345   - 'dataProvider' => $dataProvider,
346   - 'rowOptions' => function($model) {
347   - if ($model->removed) {
348   - return [ 'class' => 'danger' ];
349   - } else {
350   - return [];
351   - }
352   - },
353   - 'layout' => '{items}{pager}',
354   - 'columns' => [
355   - 'id',
356   - 'sku',
357   - 'product_name',
358   - 'productVariant.product.brand.lang.title',
359   - 'productVariant.lang.title',
360   - 'price',
361   - [
362   - 'class' => 'kartik\grid\EditableColumn',
363   - 'attribute' => 'count',
364   - 'editableOptions' => [
365   - 'header' => \Yii::t('app', 'Количество'),
366   - 'inputType' => kartik\editable\Editable::INPUT_SPIN,
367   - 'options' => [
368   - 'pluginOptions' => [
369   - 'min' => 0,
370   - 'max' => 5000,
371   - ],
372   - ],
373   - 'pluginEvents' => [
374   - 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
375   - ],
376   - ],
377   - 'format' => [
378   - 'decimal',
379   - 0,
380   - ],
381   - 'pageSummary' => false,
382   - ],
383   - 'sum_cost',
384   - [
385   - 'class' => 'kartik\grid\EditableColumn',
386   - 'attribute' => 'booking',
387   - 'editableOptions' => [
388   - 'header' => \Yii::t('app', 'Бронь'),
389   - 'inputType' => kartik\editable\Editable::INPUT_TEXT,
390   - 'options' => [
391   - 'class' => 'booking-typeahead',
392   - 'pluginOptions' => [
393   - 'min' => 0,
394   - 'max' => 20,
395   - ],
396   - ],
397   - 'pluginEvents' => [
398   - 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
399   - ],
400   - ],
401   - 'format' => [
402   - 'text',
403   - ],
404   - 'pageSummary' => false,
405   - ],
406   - [
407   - 'class' => 'kartik\grid\EditableColumn',
408   - 'attribute' => 'status',
409   - 'editableOptions' => [
410   - 'header' => \Yii::t('app', 'Статус'),
411   - 'inputType' => kartik\editable\Editable::INPUT_TEXT,
412   - 'options' => [
413   - 'class' => 'status-typeahead',
414   - 'pluginOptions' => [
415   - 'min' => 0,
416   - 'max' => 20,
417   - ],
418   - ],
419   - 'pluginEvents' => [
420   - 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
421   - ],
422   - ],
423   - 'format' => [
424   - 'text',
425   - ],
426   - 'pageSummary' => false,
427   - ],
428   - [
429   - 'class' => 'kartik\grid\EditableColumn',
430   - 'attribute' => 'return',
431   - 'editableOptions' => [
432   - 'header' => \Yii::t('app', 'Возврат'),
433   - 'inputType' => kartik\editable\Editable::INPUT_CHECKBOX,
434   - 'options' => [],
435   - 'pluginEvents' => [
436   - 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
437   - ],
438   - ],
439   - 'format' => [
440   - 'boolean',
441   - ],
442   - 'pageSummary' => false,
443   - ],
444   - [
445   - 'class' => 'yii\grid\ActionColumn',
446   - 'template' => '{delete}',
447   - 'buttons' => [
448   - 'delete' => function($url, $model) {
449   - if ($model->removed) {
450   - return '';
451   - } else {
452   - return Html::a(
453   - Html::tag('span', '', [ 'class' => 'glyphicon glyphicon-trash' ]),
454   - [
455   - 'delete-product',
456   - 'id' => $model->id,
457   - ],
458   - [
459   - 'data' => [
460   - 'confirm' => 'Вы уверены, что хотите удалить этот элемент?',
461   - 'method' => 'POST',
462   - ],
463   - ]
464   - );
465   - }
466   - },
467   - ],
468   - ],
469   - ],
470   - 'responsive' => true,
471   - 'hover' => true,
472   - 'pjax' => true,
473   - 'pjaxSettings' => [
474   - 'options' => [
475   - 'scrollTo' => 'false',
476   - 'id' => 'order-products-grid',
477   - ],
478   - ],
479   - ]
480   - );
481   - ?>
482   - </div>
  365 + <div class="row">
  366 + <?php
  367 + echo GridView::widget(
  368 + [
  369 + 'dataProvider' => $dataProvider,
  370 + 'rowOptions' => function($model) {
  371 + if ($model->removed) {
  372 + return [ 'class' => 'danger' ];
  373 + } else {
  374 + return [];
  375 + }
  376 + },
  377 + 'layout' => '{items}{pager}',
  378 + 'columns' => [
  379 + [
  380 + 'class' => SerialColumn::className(),
  381 + ],
  382 + 'sku',
  383 + [
  384 + 'attribute' => 'product_name',
  385 + 'content' => function($model) {
  386 + if (!empty($model->product_name)) {
  387 + return Html::a(
  388 + StringHelper::truncate($model->product_name, 10, '...'),
  389 + '#',
  390 + [
  391 + 'data-toggle' => 'tooltip',
  392 + 'title' => $model->product_name,
  393 + 'onclick' => 'event.preventDefault();',
  394 + ]
  395 + );
  396 + } else {
  397 + return '';
  398 + }
  399 + },
  400 + ],
  401 + 'productVariant.product.brand.lang.title',
  402 + [
  403 + 'attribute' => 'productVariant.lang.title',
  404 + 'label' => \Yii::t('app', 'Цвет'),
  405 + 'content' => function($model) {
  406 + if (preg_match('@.*\.(png|jpg|gif)@i', $model->productVariant->lang->title)) {
  407 + return '';
  408 + } else {
  409 + return $model->productVariant->lang->title;
  410 + }
  411 + },
  412 + ],
  413 + 'productVariant.size',
  414 + 'price',
  415 + [
  416 + 'class' => 'kartik\grid\EditableColumn',
  417 + 'attribute' => 'count',
  418 + 'editableOptions' => [
  419 + 'header' => \Yii::t('app', 'Количество'),
  420 + 'inputType' => kartik\editable\Editable::INPUT_SPIN,
  421 + 'options' => [
  422 + 'pluginOptions' => [
  423 + 'min' => 0,
  424 + 'max' => 5000,
  425 + ],
  426 + ],
  427 + 'pluginEvents' => [
  428 + 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
  429 + ],
  430 + ],
  431 + 'format' => [
  432 + 'decimal',
  433 + 0,
  434 + ],
  435 + 'pageSummary' => false,
  436 + ],
  437 + 'sum_cost',
  438 + [
  439 + 'class' => 'kartik\grid\EditableColumn',
  440 + 'attribute' => 'booking',
  441 + 'editableOptions' => [
  442 + 'header' => \Yii::t('app', 'Бронь'),
  443 + 'inputType' => kartik\editable\Editable::INPUT_TEXT,
  444 + 'options' => [
  445 + 'class' => 'booking-typeahead',
  446 + 'pluginOptions' => [
  447 + 'min' => 0,
  448 + 'max' => 20,
  449 + ],
  450 + ],
  451 + 'pluginEvents' => [
  452 + 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
  453 + ],
  454 + ],
  455 + 'format' => [
  456 + 'text',
  457 + ],
  458 + 'pageSummary' => false,
  459 + ],
  460 + [
  461 + 'class' => 'kartik\grid\EditableColumn',
  462 + 'attribute' => 'status',
  463 + 'editableOptions' => [
  464 + 'header' => \Yii::t('app', 'Статус'),
  465 + 'inputType' => kartik\editable\Editable::INPUT_TEXT,
  466 + 'options' => [
  467 + 'class' => 'status-typeahead',
  468 + 'pluginOptions' => [
  469 + 'min' => 0,
  470 + 'max' => 20,
  471 + ],
  472 + ],
  473 + 'pluginEvents' => [
  474 + 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
  475 + ],
  476 + ],
  477 + 'format' => [
  478 + 'text',
  479 + ],
  480 + 'pageSummary' => false,
  481 + ],
  482 + [
  483 + 'class' => 'kartik\grid\EditableColumn',
  484 + 'attribute' => 'return',
  485 + 'editableOptions' => [
  486 + 'header' => \Yii::t('app', 'Возврат'),
  487 + 'inputType' => kartik\editable\Editable::INPUT_CHECKBOX,
  488 + 'options' => [],
  489 + 'pluginEvents' => [
  490 + 'editableSuccess' => 'function(event) { $.pjax.reload({container:"#order-products-grid"}); }',
  491 + ],
  492 + ],
  493 + 'format' => [
  494 + 'boolean',
  495 + ],
  496 + 'pageSummary' => false,
  497 + ],
  498 + [
  499 +// 'label' => \Yii::t('app', 'Склады'),
  500 + 'content' => function($model) {
  501 + $content = '<table class="table"><tbody><tr><th>Склад</th><th>кол.</th></tr>';
  502 + foreach ($model->productVariant->variantStocks as $stock) {
  503 + $content .= '<tr><td>' . $stock->stock->title . '</td><td>' . $stock->quantity . '</td></tr>';
  504 + }
  505 + return Html::a(
  506 + '<i class="glyphicon glyphicon-home"></i>',
  507 + '#',
  508 + [
  509 + 'onclick' => 'event.preventDefault();',
  510 + 'data-toggle' => 'popover',
  511 + 'data-placement' => 'left',
  512 + 'data-html' => 'true',
  513 + 'data-content' => $content . '</tbody></table>',
  514 + ]
  515 + );
  516 + },
  517 + ],
  518 + [
  519 + 'class' => 'yii\grid\ActionColumn',
  520 + 'template' => '{delete}',
  521 + 'buttons' => [
  522 + 'delete' => function($url, $product) {
  523 + if ($product->removed) {
  524 + return '';
  525 + } else {
  526 + return Html::a(
  527 + Html::tag('span', '', [ 'class' => 'glyphicon glyphicon-trash' ]),
  528 + [
  529 + 'delete-product',
  530 + 'id' => $product->id,
  531 + ],
  532 + [
  533 + 'class' => 'delete-button',
  534 + // 'data' => [
  535 + // 'confirm' => 'Вы уверены, что хотите удалить этот элемент?',
  536 + // 'method' => 'GET',
  537 + // ],
  538 + ]
  539 + );
  540 + }
  541 + },
  542 + ],
  543 + ],
  544 + ],
  545 + 'responsive' => true,
  546 + 'hover' => true,
  547 + 'pjax' => true,
  548 + 'pjaxSettings' => [
  549 + 'options' => [
  550 + 'scrollTo' => 'false',
  551 + 'id' => 'order-products-grid',
  552 + ],
  553 + ],
  554 + ]
  555 + );
  556 + ?>
  557 + </div>
483 558 </div>
484   -
485 559 <div class="container">
486   - <div class="row">
487   - <?php $newProductForm = ActiveForm::begin(
488   - [
489   - 'action' => yii\helpers\Url::to([ 'add' ]),
490   - 'id' => 'add-product-form',
491   - ]
492   - );
493   - $newOrderProduct = new OrderProduct();
494   - ?>
495   - <div class="col-md-8">
496   - <?php echo $newProductForm->field($newOrderProduct, 'id')
497   - ->widget(
498   - Select2::className(),
499   - [
500   - 'options' => [ 'placeholder' => 'Search for a product ...' ],
501   - 'pluginOptions' => [
502   - 'allowClear' => true,
503   - 'disabled' => $model->isNewRecord ? true : false,
504   - 'minimumInputLength' => 3,
505   - 'language' => [
506   - 'errorLoading' => new JsExpression(
507   - "function () { return 'Waiting for results...'; }"
508   - ),
509   - ],
510   - 'ajax' => [
511   - 'url' => \yii\helpers\Url::to([ 'find-product' ]),
512   - 'dataType' => 'json',
513   - 'data' => new JsExpression(
514   - 'function(params) { return {q:params.term}; }'
515   - ),
516   - ],
517   - 'escapeMarkup' => new JsExpression(
518   - 'function (markup) { return markup; }'
519   - ),
520   - 'templateResult' => new JsExpression(
521   - 'function(data) { return data.sku; }'
  560 + <?php Pjax::begin([ 'id' => 'total-cost' ]); ?>
  561 + <h2>Сумма заказа : <span class="label label-success"><?php echo $model->total; ?><?php echo \Yii::t(
  562 + 'app',
  563 + 'грн'
  564 + ) ?></span></h2>
  565 + <?php Pjax::end(); ?>
  566 +</div>
  567 +<div class="container">
  568 + <div class="row">
  569 + <?php $newProductForm = ActiveForm::begin(
  570 + [
  571 + 'action' => yii\helpers\Url::to([ 'add' ]),
  572 + 'id' => 'add-product-form',
  573 + ]
  574 + );
  575 + $newOrderProduct = new OrderProduct();
  576 + ?>
  577 + <div class="col-md-8">
  578 + <?php echo $newProductForm->field($newOrderProduct, 'id')
  579 + ->widget(
  580 + Select2::className(),
  581 + [
  582 + 'options' => [ 'placeholder' => 'Search for a product ...' ],
  583 + 'pluginOptions' => [
  584 + 'allowClear' => true,
  585 + 'disabled' => $model->isNewRecord ? true : false,
  586 + 'minimumInputLength' => 3,
  587 + 'language' => [
  588 + 'errorLoading' => new JsExpression(
  589 + "function () { return 'Waiting for results...'; }"
522 590 ),
523   - 'templateSelection' => new JsExpression(
524   - 'function (data) { return data.sku; }'
  591 + ],
  592 + 'ajax' => [
  593 + 'url' => \yii\helpers\Url::to([ 'find-product' ]),
  594 + 'dataType' => 'json',
  595 + 'data' => new JsExpression(
  596 + 'function(params) { return {q:params.term}; }'
525 597 ),
526 598 ],
527   - ]
528   - );
529   -
530   - ?>
531   - </div>
532   - <div class="col-md-2">
533   - <?php echo $newProductForm->field(
534   - $newOrderProduct,
535   - 'count'
536   - )
537   - ->input(
538   - 'number',
539   - [
540   - 'disabled' => $model->isNewRecord ? true : false,
541   - ]
542   - ); ?>
543   - </div>
544   - <div class="col-md-2" style="margin-top: 23px">
545   - <?php echo Html::submitButton(
546   - 'Add',
547   - [
548   - 'class' => $model->isNewRecord ? 'btn btn-primary disabled' : 'btn btn-primary',
549   - ]
550   - ) ?>
551   - </div>
552   - <?php echo $newProductForm->field($newOrderProduct, 'order_id')
553   - ->hiddenInput(
  599 + 'escapeMarkup' => new JsExpression(
  600 + 'function (markup) { return markup; }'
  601 + ),
  602 + 'templateResult' => new JsExpression(
  603 + 'function(data) { return data.sku; }'
  604 + ),
  605 + 'templateSelection' => new JsExpression(
  606 + 'function (data) { return data.sku; }'
  607 + ),
  608 + ],
  609 + ]
  610 + );
  611 +
  612 + ?>
  613 + </div>
  614 + <div class="col-md-2">
  615 + <?php echo $newProductForm->field(
  616 + $newOrderProduct,
  617 + 'count'
  618 + )
  619 + ->input(
  620 + 'number',
554 621 [
555   - 'value' => $model->id,
  622 + 'disabled' => $model->isNewRecord ? true : false,
556 623 ]
557   - )
558   - ->label(false) ?>
559   - <?php ActiveForm::end(); ?>
  624 + ); ?>
560 625 </div>
561   -
562   - <br>
563   - <div class="row">
564   - <?= Html::button(
565   - $model->isNewRecord ? \Yii::t('app', 'Создать') : \Yii::t('app', 'Сохранить'),
566   - [
567   - 'class' => $model->isNewRecord ? 'btn btn-success btn-lg' : 'btn btn-primary btn-lg',
568   - 'id' => 'page-submit',
569   - ]
570   - ) ?>
571   - <?= Html::a(
572   - \Yii::t('app', 'Печать'),
573   - yii\helpers\Url::to(
574   - [
575   - 'order/print',
576   - 'order_id' => $model->id,
577   - ]
578   - ),
  626 + <div class="col-md-2" style="margin-top: 23px">
  627 + <?php echo Html::submitButton(
  628 + 'Add',
579 629 [
580   - 'class' => $model->isNewRecord ? 'btn btn-info disabled btn-lg' : 'btn btn-info btn-lg',
581   - 'target' => '_blank',
582   - ]
583   - ) ?>
584   - <?= Html::a(
585   - \Yii::t('app', 'Выйти'),
586   - yii\helpers\Url::to(
587   - [
588   - 'exit-order',
589   - 'id' => $model->id,
590   - ]
591   - ),
592   - [
593   - 'class' => $model->isNewRecord ? 'btn btn-info disabled btn-lg' : 'btn btn-info btn-lg',
  630 + 'class' => $model->isNewRecord ? 'btn btn-primary disabled' : 'btn btn-primary',
594 631 ]
595 632 ) ?>
596 633 </div>
  634 + <?php echo $newProductForm->field($newOrderProduct, 'order_id')
  635 + ->hiddenInput(
  636 + [
  637 + 'value' => $model->id,
  638 + ]
  639 + )
  640 + ->label(false) ?>
  641 + <?php ActiveForm::end(); ?>
  642 + </div>
  643 +
  644 + <br>
  645 + <div class="row">
  646 + <?= Html::button(
  647 + $model->isNewRecord ? \Yii::t('app', 'Создать') : \Yii::t('app', 'Сохранить'),
  648 + [
  649 + 'class' => $model->isNewRecord ? 'btn btn-success btn-lg' : 'btn btn-primary btn-lg',
  650 + 'id' => 'page-submit',
  651 + ]
  652 + ) ?>
  653 + <?= Html::a(
  654 + \Yii::t('app', 'Печать'),
  655 + yii\helpers\Url::to(
  656 + [
  657 + 'order/print',
  658 + 'order_id' => $model->id,
  659 + ]
  660 + ),
  661 + [
  662 + 'class' => $model->isNewRecord ? 'btn btn-info disabled btn-lg' : 'btn btn-info btn-lg',
  663 + 'target' => '_blank',
  664 + ]
  665 + ) ?>
  666 + <?= Html::a(
  667 + \Yii::t('app', 'Выйти'),
  668 + yii\helpers\Url::to(
  669 + [
  670 + 'exit-order',
  671 + 'id' => $model->id,
  672 + ]
  673 + ),
  674 + [
  675 + 'class' => $model->isNewRecord ? 'btn btn-info disabled btn-lg' : 'btn btn-info btn-lg',
  676 + ]
  677 + ) ?>
  678 + </div>
597 679  
598 680 </div>
599 681 <br>
... ...