Ich benötige Hilfe zum Hinzufügen der Schaltfläche "Jetzt kaufen" auf der Produktdetailseite. Vielen Dank.
Ich benötige Hilfe zum Hinzufügen der Schaltfläche "Jetzt kaufen" auf der Produktdetailseite. Vielen Dank.
Antworten:
Hier ist ein Modul, das eine Schaltfläche "Jetzt kaufen" hinzufügt, mit der der Kunde direkt zur Kasse mit dem ausgewählten Produkt im Warenkorb gelangt.
Modulverzeichnis:
| 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();
}
}
}
route.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>
Abschnitte.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;
});
}
});
Dazu wird eine modifizierte Version des Controllers erstellt, mit der ein Produkt in den Warenkorb gelegt wird. Wenn Sie auf "Jetzt kaufen" klicken, wird die Aktion des Formulars "Produkt hinzufügen" auf den benutzerdefinierten Controller umgeschaltet, der dann zur Checkout-Seite umleitet, wenn der Artikel erfolgreich in den Warenkorb gelegt wurde.
buy-now.js
und gemacht Add.php
. Nehmen Sie diese Änderungen vor und versuchen Sie es erneut.
Ich gehe davon aus, dass Sie die grundlegende Modulerstellung kennen. Befolgen Sie die folgenden Schritte:
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>