Tôi cần trợ giúp để thêm nút "Mua ngay" trên trang chi tiết sản phẩm. Cảm ơn.
Tôi cần trợ giúp để thêm nút "Mua ngay" trên trang chi tiết sản phẩm. Cảm ơn.
Câu trả lời:
Dưới đây là mô-đun có thêm nút 'Mua ngay' để khách hàng trực tiếp thanh toán với sản phẩm được chọn trong giỏ hàng.
Thư mục mô-đun:
| registration.php
|
+---Controller
| \---Cart
| Add.php
|
+---etc
| | module.xml
| |
| \---frontend
| routes.xml
| sections.xml
|
\---view
\---frontend
+---layout
| catalog_product_view.xml
|
+---templates
| buynow.phtml
|
\---web
\---js
buy-now.js
Thêm.php
<?php
namespace AAllen\BuyNow\Controller\Cart;
class Add extends \Magento\Checkout\Controller\Cart\Add
{
/**
* Add product to shopping cart action
*
* @return \Magento\Framework\Controller\Result\Redirect
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function execute()
{
if (!$this->_formKeyValidator->validate($this->getRequest())) {
return $this->resultRedirectFactory->create()->setPath('*/*/');
}
$params = $this->getRequest()->getParams();
try {
if (isset($params['qty'])) {
$filter = new \Zend_Filter_LocalizedToNormalized(
['locale' => $this->_objectManager->get('Magento\Framework\Locale\ResolverInterface')->getLocale()]
);
$params['qty'] = $filter->filter($params['qty']);
}
$product = $this->_initProduct();
$related = $this->getRequest()->getParam('related_product');
/**
* Check product availability
*/
if (!$product) {
return $this->goBack();
}
// empty the cart.
$this->cart->truncate();
$this->cart->addProduct($product, $params);
if (!empty($related)) {
$this->cart->addProductsByIds(explode(',', $related));
}
$this->cart->save();
/**
* @todo remove wishlist observer \Magento\Wishlist\Observer\AddToCart
*/
$this->_eventManager->dispatch(
'checkout_cart_add_product_complete',
['product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse()]
);
if (!$this->_checkoutSession->getNoCartRedirect(true)) {
$baseUrl = $this->_objectManager->get('\Magento\Store\Model\StoreManagerInterface')
->getStore()->getBaseUrl();
// redirect to checkout page
return $this->goBack($baseUrl.'checkout/', $product);
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
if ($this->_checkoutSession->getUseNotice(true)) {
$this->messageManager->addNotice(
$this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($e->getMessage())
);
} else {
$messages = array_unique(explode("\n", $e->getMessage()));
foreach ($messages as $message) {
$this->messageManager->addError(
$this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($message)
);
}
}
$url = $this->_checkoutSession->getRedirectUrl(true);
if (!$url) {
$cartUrl = $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl();
$url = $this->_redirect->getRedirectUrl($cartUrl);
}
return $this->goBack($url);
} catch (\Exception $e) {
$this->messageManager->addException($e, __('We can\'t add this item to your shopping cart right now.'));
$this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
return $this->goBack();
}
}
}
tuyến đường
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route id="buynow" frontName="buynow">
<module name="AAllen_BuyNow"/>
</route>
</router>
</config>
phân đoạn
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="buynow/cart/add">
<section name="cart"/>
</action>
</config>
catalog_product_view.xml
<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.addtocart">
<block class="Magento\Framework\View\Element\Template" template="AAllen_BuyNow::buynow.phtml"/>
</referenceBlock>
<referenceBlock name="product.info.addtocart.additional">
<block class="Magento\Framework\View\Element\Template" template="AAllen_BuyNow::buynow.phtml"/>
</referenceBlock>
</body>
</page>
buynow.phtml
<button type="submit" title="<?php /* @escapeNotVerified */ echo __('Buy Now') ?>" id="buy-now" class="action buynow primary" data-mage-init='
{
"AAllen_BuyNow/js/buy-now": {
"form": "#product_addtocart_form"
}
}
'>
<span><?php /* @escapeNotVerified */ echo __('Buy Now') ?></span>
</button>
buy-now.js
define([
'jquery'
], function ($) {
"use strict";
return function (config, element) {
$(element).click(function () {
var form = $(config.form);
// change form action
var baseUrl = form.attr('action'),
buyNowUrl = baseUrl.replace('checkout/cart/add', 'buynow/cart/add');
form.attr('action', buyNowUrl);
form.trigger('submit');
// set form action back
form.attr('action', baseUrl);
return false;
});
}
});
Nó hoạt động bằng cách tạo một phiên bản sửa đổi của bộ điều khiển được sử dụng để thêm sản phẩm vào giỏ hàng. Khi nhấp vào 'Mua ngay', hành động của biểu mẫu 'thêm sản phẩm' được chuyển sang bộ điều khiển tùy chỉnh, sau đó chuyển hướng đến trang thanh toán nếu mặt hàng được thêm thành công vào giỏ hàng.
buy-now.js
và Add.php
. Thực hiện những thay đổi và thử lại.
Tôi giả sử rằng bạn biết việc tạo mô-đun cơ bản. Thực hiện theo các bước dưới đây:
Vendor/Module/view/frontend/layout/catalog_product_view.xml
<?xml version="1.0"?>
<body>
<referenceContainer name="product.info.social">
<block class="Vendor\Module\Block\Product\View\Extra"
name="product.view.extra"
template="Vendor_Module::product/view/extra.phtml"
after="-">
</block>
</referenceContainer>
</body>
Vendor/Module/view/frontend/templates/product/view/extra.phtml
<h3><?php echo 'Custom Button'; ?></h3>