123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- <?php
- /**
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Checkout\Controller\Cart;
- use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
- use Magento\Catalog\Api\ProductRepositoryInterface;
- use Magento\Checkout\Model\Cart as CustomerCart;
- use Magento\Framework\Exception\NoSuchEntityException;
- /**
- * Controller for processing add to cart action.
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Add extends \Magento\Checkout\Controller\Cart implements HttpPostActionInterface
- {
- /**
- * @var ProductRepositoryInterface
- */
- protected $productRepository;
- /**
- * @param \Magento\Framework\App\Action\Context $context
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
- * @param \Magento\Checkout\Model\Session $checkoutSession
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
- * @param CustomerCart $cart
- * @param ProductRepositoryInterface $productRepository
- * @codeCoverageIgnore
- */
- public function __construct(
- \Magento\Framework\App\Action\Context $context,
- \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
- \Magento\Checkout\Model\Session $checkoutSession,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator,
- CustomerCart $cart,
- ProductRepositoryInterface $productRepository
- ) {
- parent::__construct(
- $context,
- $scopeConfig,
- $checkoutSession,
- $storeManager,
- $formKeyValidator,
- $cart
- );
- $this->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
- );
- }
- }
|