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 @@
+
+
+
+
+
+
+ Order::SCENARIO_FAST,
+ 'variantId' => $variant->id,
+ ]
+ );
+ $form = ActiveForm::begin(
+ [
+ 'action' => [ 'checkout/fast' ],
+ 'id' => 'fast-buy-form',
+ ]
+ );
+ echo $form->field($order, 'variantId')
+ ->label(false)
+ ->hiddenInput();
+ echo $form->field($order, 'name')
+ ->label(false)
+ ->textInput(
+ [
+ 'placeholder' => $order->getAttributeLabel('name'),
+ ]
+ );
+ echo $form->field($order, 'phone')
+ ->label(false)
+ ->textInput(
+ [
+ 'placeholder' => $order->getAttributeLabel('phone'),
+ ]
+ );
+ echo Html::tag(
+ 'p',
+ Html::submitButton(
+ Html::icon(
+ 'shopping-cart',
+ [
+ 'prefix' => 'fa fa-',
+ ]
+ ) . \Yii::t('app', ' Отправить'),
+ [
+ 'class' => 'btn btn-template-main',
+ ]
+ ),
+ [
+ 'class' => 'text-center',
+ ]
+ );
+ $form::end();
+ ?>
+
+
+
+
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