選択した商品をカートでチェックアウトするために顧客を直接連れて行く「今すぐ購入」ボタンを追加するモジュールは次のとおりです。
モジュールディレクトリ:
| 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
Add.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();
}
}
}
routes.xml
<?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>
sections.xml
<?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;
});
}
});
カートに商品を追加するために使用するコントローラーの修正バージョンを作成することで機能します。[今すぐ購入]をクリックすると、[商品を追加]フォームのアクションがカスタムコントローラに切り替わり、アイテムがカートに正常に追加されると、チェックアウトページにリダイレクトされます。