productRepository = $productRepository; } /** * Initialize product instance from request data * * @return \Magento\Catalog\Model\Product|false */ protected function _initProduct() { $productId = (int)$this->getRequest()->getParam('product'); if ($productId) { $storeId = $this->_objectManager->get( \Magento\Store\Model\StoreManagerInterface::class )->getStore()->getId(); try { return $this->productRepository->getById($productId, false, $storeId); } catch (NoSuchEntityException $e) { return false; } } return false; } /** * Add product to shopping cart action * * @return \Magento\Framework\Controller\Result\Redirect * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function execute() { if (!$this->_formKeyValidator->validate($this->getRequest())) { $this->messageManager->addErrorMessage( __('Your session has expired') ); 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::class )->getLocale()] ); $params['qty'] = $filter->filter($params['qty']); } $product = $this->_initProduct(); $related = $this->getRequest()->getParam('related_product'); /** * Check product availability */ if (!$product) { return $this->goBack(); } $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)) { if (!$this->cart->getQuote()->getHasError()) { if ($this->shouldRedirectToCart()) { $message = __( 'You added %1 to your shopping cart.', $product->getName() ); $this->messageManager->addSuccessMessage($message); } else { $this->messageManager->addComplexSuccessMessage( 'addCartSuccessMessage', [ 'product_name' => $product->getName(), 'cart_url' => $this->getCartUrl(), ] ); } } return $this->goBack(null, $product); } } catch (\Magento\Framework\Exception\LocalizedException $e) { if ($this->_checkoutSession->getUseNotice(true)) { $this->messageManager->addNoticeMessage( $this->_objectManager->get(\Magento\Framework\Escaper::class)->escapeHtml($e->getMessage()) ); } else { $messages = array_unique(explode("\n", $e->getMessage())); foreach ($messages as $message) { $this->messageManager->addErrorMessage( $this->_objectManager->get(\Magento\Framework\Escaper::class)->escapeHtml($message) ); } } $url = $this->_checkoutSession->getRedirectUrl(true); if (!$url) { $url = $this->_redirect->getRedirectUrl($this->getCartUrl()); } return $this->goBack($url); } catch (\Exception $e) { $this->messageManager->addExceptionMessage( $e, __('We can\'t add this item to your shopping cart right now.') ); $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e); return $this->goBack(); } } /** * Resolve response * * @param string $backUrl * @param \Magento\Catalog\Model\Product $product * @return $this|\Magento\Framework\Controller\Result\Redirect */ protected function goBack($backUrl = null, $product = null) { if (!$this->getRequest()->isAjax()) { return parent::_goBack($backUrl); } $result = []; if ($backUrl || $backUrl = $this->getBackUrl()) { $result['backUrl'] = $backUrl; } else { if ($product && !$product->getIsSalable()) { $result['product'] = [ 'statusText' => __('Out of stock') ]; } } $this->getResponse()->representJson( $this->_objectManager->get(\Magento\Framework\Json\Helper\Data::class)->jsonEncode($result) ); } /** * Returns cart url * * @return string */ private function getCartUrl() { return $this->_url->getUrl('checkout/cart', ['_secure' => true]); } /** * Is redirect should be performed after the product was added to cart. * * @return bool */ private function shouldRedirectToCart() { return $this->_scopeConfig->isSetFlag( 'checkout/cart/redirect_to_cart', \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } }