Hi,
I am writing an extension which allows to go directly to the checkout page when clicking on the add-to-cart button on the product page. I found a solution for Magento 1 here and I tried to adapt it to Magento 2. Here are my files:
File etc/frontend/events.xml:
<?xml version="1.0" encoding="utf-8" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="checkout_cart_add_product_complete"> <observer name="mycompany_go_to_checkout" instance="MyCompany\GoToCheckout\Observer\GoToCheckout" /> </event> </config>
File Observer/GoToCheckout.php:
<?php namespace MyCompany\GoToCheckout\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; class GoToCheckout implements ObserverInterface { protected $_url; public function execute(Observer $observer) { $urlInterface = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Framework\UrlInterface');
$url = $urlInterface->getUrl('checkout');
$observer->getControllerAction()->getResponse()->setRedirect($url);
} }
What should I change or add to make it work?
Any guidance will be appreciated.
Hello Fredey,
It depends on a configuration setting if your code will work because Magento also sets a redirect url based on the following configuration field checkout/cart/redirect_to_cart
If this is enabled your could shouldn't work because Magento uses the following function to change the redirect after adding the product to the shopping cart:
/** * Get resolved back url * * @param null $defaultUrl * * @return mixed|null|string */ protected function getBackUrl($defaultUrl = null) { $returnUrl = $this->getRequest()->getParam('return_url'); if ($returnUrl && $this->_isInternalUrl($returnUrl)) { $this->messageManager->getMessages()->clear(); return $returnUrl; } $shouldRedirectToCart = $this->_scopeConfig->getValue( 'checkout/cart/redirect_to_cart', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); if ($shouldRedirectToCart || $this->getRequest()->getParam('in_cart')) { if ($this->getRequest()->getActionName() == 'add' && !$this->getRequest()->getParam('in_cart')) { $this->_checkoutSession->setContinueShoppingUrl($this->_redirect->getRefererUrl()); } return $this->_url->getUrl('checkout/cart'); } return $defaultUrl; }
which is used in the following function:
/** * Set back redirect url to response * * @param null|string $backUrl * * @return \Magento\Framework\Controller\Result\Redirect */ protected function _goBack($backUrl = null) { $resultRedirect = $this->resultRedirectFactory->create(); if ($backUrl || $backUrl = $this->getBackUrl($this->_redirect->getRefererUrl())) { $resultRedirect->setUrl($backUrl); } return $resultRedirect; }
So your observer is called before the Magento default redirect as shown below:
$this->_eventManager->dispatch( 'checkout_cart_add_product_complete', ['product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse()] ); if (!$this->_checkoutSession->getNoCartRedirect(true)) { if (!$this->cart->getQuote()->getHasError()) { $message = __( 'You added %1 to your shopping cart.', $product->getName() ); $this->messageManager->addSuccessMessage($message); } return $this->goBack(null, $product); }
So probably if you just change the configuration setting it should work. Let me know if my answer was any help solving your issue.