ItemCarrier.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Wishlist\Model;
  8. use Magento\Catalog\Model\Product\Exception as ProductException;
  9. use Magento\Checkout\Helper\Cart as CartHelper;
  10. use Magento\Checkout\Model\Cart;
  11. use Magento\Customer\Model\Session;
  12. use Magento\Framework\App\Response\RedirectInterface;
  13. use Magento\Framework\Exception\LocalizedException;
  14. use Psr\Log\LoggerInterface as Logger;
  15. use Magento\Framework\Message\ManagerInterface as MessageManager;
  16. use Magento\Framework\UrlInterface;
  17. use Magento\Wishlist\Helper\Data as WishlistHelper;
  18. /**
  19. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  20. */
  21. class ItemCarrier
  22. {
  23. /**
  24. * @var \Magento\Customer\Model\Session
  25. */
  26. protected $customerSession;
  27. /**
  28. * @var LocaleQuantityProcessor
  29. */
  30. protected $quantityProcessor;
  31. /**
  32. * @var \Magento\Checkout\Model\Cart
  33. */
  34. protected $cart;
  35. /**
  36. * @var \Psr\Log\LoggerInterface
  37. */
  38. protected $logger;
  39. /**
  40. * @var \Magento\Wishlist\Helper\Data
  41. */
  42. protected $helper;
  43. /**
  44. * @var \Magento\Checkout\Helper\Cart
  45. */
  46. protected $cartHelper;
  47. /**
  48. * @var \Magento\Framework\UrlInterface
  49. */
  50. protected $urlBuilder;
  51. /**
  52. * @var \Magento\Framework\Message\ManagerInterface
  53. */
  54. protected $messageManager;
  55. /**
  56. * @var \Magento\Framework\App\Response\RedirectInterface
  57. */
  58. protected $redirector;
  59. /**
  60. * @param Session $customerSession
  61. * @param LocaleQuantityProcessor $quantityProcessor
  62. * @param Cart $cart
  63. * @param Logger $logger
  64. * @param WishlistHelper $helper
  65. * @param CartHelper $cartHelper
  66. * @param UrlInterface $urlBuilder
  67. * @param MessageManager $messageManager
  68. * @param RedirectInterface $redirector
  69. */
  70. public function __construct(
  71. Session $customerSession,
  72. LocaleQuantityProcessor $quantityProcessor,
  73. Cart $cart,
  74. Logger $logger,
  75. WishlistHelper $helper,
  76. CartHelper $cartHelper,
  77. UrlInterface $urlBuilder,
  78. MessageManager $messageManager,
  79. RedirectInterface $redirector
  80. ) {
  81. $this->customerSession = $customerSession;
  82. $this->quantityProcessor = $quantityProcessor;
  83. $this->cart = $cart;
  84. $this->logger = $logger;
  85. $this->helper = $helper;
  86. $this->cartHelper = $cartHelper;
  87. $this->urlBuilder = $urlBuilder;
  88. $this->messageManager = $messageManager;
  89. $this->redirector = $redirector;
  90. }
  91. /**
  92. * Move all wishlist item to cart
  93. *
  94. * @param Wishlist $wishlist
  95. * @param array $qtys
  96. * @return string
  97. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  98. * @SuppressWarnings(PHPMD.NPathComplexity)
  99. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  100. */
  101. public function moveAllToCart(Wishlist $wishlist, $qtys)
  102. {
  103. $isOwner = $wishlist->isOwner($this->customerSession->getCustomerId());
  104. $messages = [];
  105. $addedProducts = [];
  106. $notSalable = [];
  107. $cart = $this->cart;
  108. $collection = $wishlist->getItemCollection()->setVisibilityFilter();
  109. foreach ($collection as $item) {
  110. /** @var $item \Magento\Wishlist\Model\Item */
  111. try {
  112. $disableAddToCart = $item->getProduct()->getDisableAddToCart();
  113. $item->unsProduct();
  114. // Set qty
  115. if (isset($qtys[$item->getId()])) {
  116. $qty = $this->quantityProcessor->process($qtys[$item->getId()]);
  117. if ($qty) {
  118. $item->setQty($qty);
  119. }
  120. }
  121. $item->getProduct()->setDisableAddToCart($disableAddToCart);
  122. // Add to cart
  123. if ($item->addToCart($cart, $isOwner)) {
  124. $addedProducts[] = $item->getProduct();
  125. }
  126. } catch (LocalizedException $e) {
  127. if ($e instanceof ProductException) {
  128. $notSalable[] = $item;
  129. } else {
  130. $messages[] = __('%1 for "%2".', trim($e->getMessage(), '.'), $item->getProduct()->getName());
  131. }
  132. $cartItem = $cart->getQuote()->getItemByProduct($item->getProduct());
  133. if ($cartItem) {
  134. $cart->getQuote()->deleteItem($cartItem);
  135. }
  136. } catch (\Exception $e) {
  137. $this->logger->critical($e);
  138. $messages[] = __('We can\'t add this item to your shopping cart right now.');
  139. }
  140. }
  141. if ($isOwner) {
  142. $indexUrl = $this->helper->getListUrl($wishlist->getId());
  143. } else {
  144. $indexUrl = $this->urlBuilder->getUrl('wishlist/shared', ['code' => $wishlist->getSharingCode()]);
  145. }
  146. if ($this->cartHelper->getShouldRedirectToCart()) {
  147. $redirectUrl = $this->cartHelper->getCartUrl();
  148. } elseif ($this->redirector->getRefererUrl()) {
  149. $redirectUrl = $this->redirector->getRefererUrl();
  150. } else {
  151. $redirectUrl = $indexUrl;
  152. }
  153. if ($notSalable) {
  154. $products = [];
  155. foreach ($notSalable as $item) {
  156. $products[] = '"' . $item->getProduct()->getName() . '"';
  157. }
  158. $messages[] = __(
  159. 'We couldn\'t add the following product(s) to the shopping cart: %1.',
  160. join(', ', $products)
  161. );
  162. }
  163. if ($messages) {
  164. foreach ($messages as $message) {
  165. $this->messageManager->addError($message);
  166. }
  167. $redirectUrl = $indexUrl;
  168. }
  169. if ($addedProducts) {
  170. // save wishlist model for setting date of last update
  171. try {
  172. $wishlist->save();
  173. } catch (\Exception $e) {
  174. $this->messageManager->addError(__('We can\'t update the Wish List right now.'));
  175. $redirectUrl = $indexUrl;
  176. }
  177. $products = [];
  178. foreach ($addedProducts as $product) {
  179. /** @var $product \Magento\Catalog\Model\Product */
  180. $products[] = '"' . $product->getName() . '"';
  181. }
  182. $this->messageManager->addSuccess(
  183. __('%1 product(s) have been added to shopping cart: %2.', count($addedProducts), join(', ', $products))
  184. );
  185. // save cart and collect totals
  186. $cart->save()->getQuote()->collectTotals();
  187. }
  188. $this->helper->calculate();
  189. return $redirectUrl;
  190. }
  191. }