From 6c8e3423c3e98a9c21fa11c1f719c227645e5784 Mon Sep 17 00:00:00 2001 From: Yarik Date: Wed, 10 May 2017 17:53:01 +0300 Subject: [PATCH] Fast buy --- frontend/controllers/CheckoutController.php | 29 ++++++++++++++++++++++++++++- frontend/models/Order.php | 50 ++++++++++++++++++++++++++++++++++++++++++++------ frontend/views/product/view.php | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- frontend/web/js/script.js | 309 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------- 4 files changed, 317 insertions(+), 163 deletions(-) diff --git a/frontend/controllers/CheckoutController.php b/frontend/controllers/CheckoutController.php index 84bed77..ef236be 100755 --- a/frontend/controllers/CheckoutController.php +++ b/frontend/controllers/CheckoutController.php @@ -174,6 +174,33 @@ ] ); } + + public function actionFast() + { + $this->enableCsrfValidation = false; + $response = \Yii::$app->response; + $response->format = $response::FORMAT_JSON; + $model = new Order( + [ + 'scenario' => Order::SCENARIO_FAST, + ] + ); + if ($model->load(\Yii::$app->request->post())) { + $model->label_id = 1; + $model->delivery_id = 5; + $model->payment_id = 3; + if ($model->save()) { + return [ + 'success' => true, + 'msg' => \Yii::t( + 'app', + 'Заказ успешно оформлен. Вашему заказу присвоен номер ' . $model->id . '.' + ), + ]; + } + } + return $model->getErrors(); + } public function beforeAction($action) { @@ -181,7 +208,7 @@ * @var \artbox\order\models\Basket $basket */ $basket = \Yii::$app->get('basket'); - if ($action->id !== 'index' && empty($basket->getData())) { + if ($action->id !== 'index' && $action->id !== 'fast' && empty($basket->getData())) { return $this->redirect([ 'site/index' ]); } return parent::beforeAction($action); diff --git a/frontend/models/Order.php b/frontend/models/Order.php index 0cb2f66..ca68364 100644 --- a/frontend/models/Order.php +++ b/frontend/models/Order.php @@ -1,17 +1,21 @@ [ 'payment_id', ], + self::SCENARIO_FAST => [ + 'name', + 'phone', + 'variantId', + ], ] ); } - + /** * @inheritdoc */ @@ -51,6 +60,7 @@ 'email', 'delivery_id', 'payment_id', + 'variantId', ], 'required', ], @@ -94,9 +104,37 @@ 'targetClass' => Payment::className(), 'targetAttribute' => 'id', ], + [ + [ + 'variant_id', + ], + 'exist', + 'targetClass' => Variant::className(), + 'targetAttribute' => 'id', + 'filter' => function ($query) { + /** + * @var \yii\db\Query $query + */ + $query->andWhere( + [ + '>', + 'price', + 0, + ] + ) + ->andWhere([ 'status' => true ]) + ->andWhere( + [ + '>', + 'stock', + 0, + ] + ); + }, + ], ]; } - + /** * Save active attributes to session variable 'order' */ @@ -108,7 +146,7 @@ } \Yii::$app->session[ 'order' ] = $order; } - + /** * Load active attributes from session variable 'order' */ diff --git a/frontend/views/product/view.php b/frontend/views/product/view.php index 6cd0de6..71eeb06 100755 --- a/frontend/views/product/view.php +++ b/frontend/views/product/view.php @@ -4,6 +4,8 @@ use artbox\catalog\models\Variant; use artbox\core\components\SeoComponent; use artbox\core\helpers\ImageHelper; + use frontend\models\Order; + use yii\bootstrap\ActiveForm; use yii\bootstrap\Html; use yii\helpers\ArrayHelper; use yii\web\View; @@ -209,14 +211,28 @@


'fa fa-', + ] + ) . \Yii::t('app', 'Купить в один клик'), + '#', + [ + 'data' => [ + 'toggle' => 'modal', + 'target' => '#oneclick-modal', + ], + 'class' => 'btn btn-template-main', + ] + ) + ?> + - -   +   */ ?> @@ -311,3 +327,65 @@ + diff --git a/frontend/web/js/script.js b/frontend/web/js/script.js index 84b3b3a..6d2e962 100755 --- a/frontend/web/js/script.js +++ b/frontend/web/js/script.js @@ -1,166 +1,177 @@ -$( - function() { - var basket = new ArtboxBasket({ - 'cartSelector': '#cart' - }); - /** - * Modal form submit code - */ - $(document) - .on( - 'beforeSubmit', '#feedback-form', function(e) { - var f = this; - var form = $(this); - var formData = form.serialize(); - $.ajax( - { - url: form.attr("action"), - type: form.attr("method"), - data: formData, - success: function(data) { - f.reset(); - $('#feedback-modal') - .modal('hide'); - $('#success-modal') - .modal('show'); - }, - error: function() { - $('#feedback-modal') - .modal('hide'); - } - } - ); - } - ) - .on( - 'submit', '#feedback-form', function(e) { - e.preventDefault(); +$(function() { + var basket = new ArtboxBasket({ + 'cartSelector': '#cart' + }); + /** + * Modal form submit code + */ + $(document) + .on('beforeSubmit', '#feedback-form', function(e) { + var f = this; + var form = $(this); + var formData = form.serialize(); + $.ajax({ + url: form.attr("action"), + type: form.attr("method"), + data: formData, + success: function(data) { + f.reset(); + $('#feedback-modal') + .modal('hide'); + $('#success-modal') + .modal('show'); + }, + error: function() { + $('#feedback-modal') + .modal('hide'); } - ); + }); + }) + .on('submit', '#feedback-form', function(e) { + e.preventDefault(); + }); - /** - * Contact form submitting - */ - $(document) - .on( - 'beforeSubmit', '#contact-form', function(e) { - var f = this; - var form = $(this); - var formData = form.serialize(); - $.ajax( - { - url: form.attr("action"), - type: form.attr("method"), - data: formData, - success: function(data) { - f.reset(); - form.replaceWith(data.alert); - }, - error: function() { + /** + * Contact form submitting + */ + $(document) + .on('beforeSubmit', '#contact-form', function(e) { + var f = this; + var form = $(this); + var formData = form.serialize(); + $.ajax({ + url: form.attr("action"), + type: form.attr("method"), + data: formData, + success: function(data) { + f.reset(); + form.replaceWith(data.alert); + }, + error: function() { - } - } - ); } - ) - .on( - 'submit', '#contact-form', function(e) { - e.preventDefault(); - } - ); - - /** - * Button UP code - */ - if ($('#back-to-top').length) { - var scrollTrigger = 100, // px - backToTop = function() { - var scrollTop = $(window) - .scrollTop(); - if (scrollTop > scrollTrigger) { - $('#back-to-top') - .addClass('show'); - } else { - $('#back-to-top') - .removeClass('show'); - } - }; - backToTop(); - $(window) - .on( - 'scroll', function() { - backToTop(); - } - ); - $('#back-to-top') - .on( - 'click', function(e) { - e.preventDefault(); - $('html,body') - .animate( - { - scrollTop: 0 - }, 700 - ); - } - ); - } + }); + }) + .on('submit', '#contact-form', function(e) { + e.preventDefault(); + }); - $(document) - .on('click', '.add-to-basket', function(e) { - e.preventDefault(); - var id = $(this) - .data('id'); - basket.add(id, 1); - if ($('.alert-cart').length > 0) { + /** + * Button UP code + */ + if ($('#back-to-top').length) { + var scrollTrigger = 100, // px + backToTop = function() { + var scrollTop = $(window) + .scrollTop(); + if (scrollTop > scrollTrigger) { + $('#back-to-top') + .addClass('show'); } else { - $('body').prepend($("
Товар добавлен в корзину.
")); - setTimeout(function(){$(".alert-cart").addClass("active");},100); - setTimeout(function(){$(".alert-cart").removeClass("active");},3500); - setTimeout(function(){$(".alert-cart").remove();},3600); + $('#back-to-top') + .removeClass('show'); } + }; + backToTop(); + $(window) + .on('scroll', function() { + backToTop(); }); - - $(document) - .on('click', '.remove-product-cart', function(e) { + $('#back-to-top') + .on('click', function(e) { e.preventDefault(); - var id = $(this) - .parents('.product-row-basket') - .data('id'); - showLoader('#basket'); - var xhr = basket.remove(id); - xhr.done(function() { - $.pjax.reload({ - container: '#basket', - fragment: '#basket', - timeout: 5000 - }); - }) + $('html,body') + .animate({ + scrollTop: 0 + }, 700); }); + } + + $(document) + .on('click', '.add-to-basket', function(e) { + e.preventDefault(); + var id = $(this) + .data('id'); + basket.add(id, 1); + if ($('.alert-cart').length > 0) { + } else { + $('body') + .prepend($("
Товар добавлен в корзину.
")); + setTimeout(function() { + $(".alert-cart") + .addClass("active"); + }, 100); + setTimeout(function() { + $(".alert-cart") + .removeClass("active"); + }, 3500); + setTimeout(function() { + $(".alert-cart") + .remove(); + }, 3600); + } + }); - $(document) - .on('change', '.increase-product-basket', function(e) { - var id = $(this) - .parents('.product-row-basket') - .data('id'); - showLoader('#basket'); - var xhr = basket.set(id, $(this) - .val()); - xhr.done(function() { - $.pjax.reload({ - container: '#basket', - fragment: '#basket', - timeout: 5000 - }); + $(document) + .on('click', '.remove-product-cart', function(e) { + e.preventDefault(); + var id = $(this) + .parents('.product-row-basket') + .data('id'); + showLoader('#basket'); + var xhr = basket.remove(id); + xhr.done(function() { + $.pjax.reload({ + container: '#basket', + fragment: '#basket', + timeout: 5000 }); - }); + }) + }); - $(document) - .on('click', 'li.disabled a', function(e) { - e.preventDefault(); + $(document) + .on('change', '.increase-product-basket', function(e) { + var id = $(this) + .parents('.product-row-basket') + .data('id'); + showLoader('#basket'); + var xhr = basket.set(id, $(this) + .val()); + xhr.done(function() { + $.pjax.reload({ + container: '#basket', + fragment: '#basket', + timeout: 5000 + }); }); - } -); + }); + + $(document) + .on('click', 'li.disabled a', function(e) { + e.preventDefault(); + }); + + $(document) + .on('submit', '#fast-buy-form', function(e) { + e.preventDefault(); + }); + + $(document) + .on('afterValidate', '#fast-buy-form', function(e, m, errors) { + if (!errors.length) { + var form = $(e.target); + var action = form.attr('action'); + $.post(action, form.serialize(), function(data) { + if (data.success) { + $('#oneclick-modal') + .find('.modal-body') + .text(data.msg); + } + }); + } + }.bind(this)); + +}); function showLoader(container) { $(container) .prepend('
'); -- libgit2 0.21.4