quoteFactory = $quoteFactory; $this->storeManager = $storeManager; $this->searchResultsDataFactory = $searchResultsDataFactory; $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; $this->collectionProcessor = $collectionProcessor ?: ObjectManager::getInstance() ->get(CollectionProcessor::class); $this->quoteCollectionFactory = $quoteCollectionFactory ?: ObjectManager::getInstance() ->get(QuoteCollectionFactory::class); $this->cartFactory = $cartFactory ?: ObjectManager::getInstance()->get(CartInterfaceFactory::class); } /** * @inheritdoc */ public function _resetState(): void { $this->quotesById = []; $this->quotesByCustomerId = []; $this->quoteCollection = null; } /** * @inheritdoc */ public function get($cartId, array $sharedStoreIds = []) { if (!isset($this->quotesById[$cartId])) { $quote = $this->loadQuote('loadByIdWithoutStore', 'cartId', $cartId, $sharedStoreIds); $this->quotesById[$cartId] = $quote; $this->getLoadHandler()->load($quote); } return $this->quotesById[$cartId]; } /** * @inheritdoc */ public function getForCustomer($customerId, array $sharedStoreIds = []) { if (!isset($this->quotesByCustomerId[$customerId])) { $customerQuote = $this->loadQuote('loadByCustomer', 'customerId', $customerId, $sharedStoreIds); $customerQuoteId = $customerQuote->getId(); //prevent loading quote items for same quote if (isset($this->quotesById[$customerQuoteId])) { $customerQuote = $this->quotesById[$customerQuoteId]; } else { $this->getLoadHandler()->load($customerQuote); } $this->quotesById[$customerQuoteId] = $customerQuote; $this->quotesByCustomerId[$customerId] = $customerQuote; } return $this->quotesByCustomerId[$customerId]; } /** * @inheritdoc */ public function getActive($cartId, array $sharedStoreIds = []) { $quote = $this->get($cartId, $sharedStoreIds); if (!$quote->getIsActive()) { throw NoSuchEntityException::singleField('cartId', $cartId); } return $quote; } /** * @inheritdoc */ public function getActiveForCustomer($customerId, array $sharedStoreIds = []) { $quote = $this->getForCustomer($customerId, $sharedStoreIds); if (!$quote->getIsActive()) { throw NoSuchEntityException::singleField('customerId', $customerId); } return $quote; } /** * @inheritdoc */ public function save(CartInterface $quote) { if ($quote->getId()) { $currentQuote = $this->get($quote->getId(), [$quote->getStoreId()]); foreach ($currentQuote->getData() as $key => $value) { if (!$quote->hasData($key)) { $quote->setData($key, $value); } } } $this->getSaveHandler()->save($quote); unset($this->quotesById[$quote->getId()]); unset($this->quotesByCustomerId[$quote->getCustomerId()]); } /** * @inheritdoc */ public function delete(CartInterface $quote) { $quoteId = $quote->getId(); $customerId = $quote->getCustomerId(); $quote->delete(); unset($this->quotesById[$quoteId]); unset($this->quotesByCustomerId[$customerId]); } /** * Load quote with different methods * * @param string $loadMethod * @param string $loadField * @param int $identifier * @param int[] $sharedStoreIds * @throws NoSuchEntityException * @return CartInterface */ protected function loadQuote($loadMethod, $loadField, $identifier, array $sharedStoreIds = []) { /** @var CartInterface $quote */ $quote = $this->cartFactory->create(); if ($sharedStoreIds && is_callable([$quote, 'setSharedStoreIds'])) { $quote->setSharedStoreIds($sharedStoreIds); } $quote->setStoreId($this->storeManager->getStore()->getId())->$loadMethod($identifier); if (!$quote->getId()) { throw NoSuchEntityException::singleField($loadField, $identifier); } return $quote; } /** * @inheritdoc */ public function getList(SearchCriteriaInterface $searchCriteria) { $this->quoteCollection = $this->quoteCollectionFactory->create(); /** @var \Magento\Quote\Api\Data\CartSearchResultsInterface $searchData */ $searchData = $this->searchResultsDataFactory->create(); $searchData->setSearchCriteria($searchCriteria); $this->collectionProcessor->process($searchCriteria, $this->quoteCollection); $this->extensionAttributesJoinProcessor->process($this->quoteCollection); foreach ($this->quoteCollection->getItems() as $quote) { /** @var CartInterface $quote */ $this->getLoadHandler()->load($quote); } $searchData->setItems($this->quoteCollection->getItems()); $searchData->setTotalCount($this->quoteCollection->getSize()); return $searchData; } /** * Adds a specified filter group to the specified quote collection. * * @param FilterGroup $filterGroup The filter group. * @param QuoteCollection $collection The quote collection. * @return void * @deprecated 101.0.0 * @see no longer used * @throws InputException The specified filter group or quote collection does not exist. */ protected function addFilterGroupToCollection(FilterGroup $filterGroup, QuoteCollection $collection) { $fields = []; $conditions = []; foreach ($filterGroup->getFilters() as $filter) { $fields[] = $filter->getField(); $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq'; $conditions[] = [$condition => $filter->getValue()]; } if ($fields) { $collection->addFieldToFilter($fields, $conditions); } } /** * Get new SaveHandler dependency for application code. * * @return SaveHandler */ private function getSaveHandler() { if (!$this->saveHandler) { $this->saveHandler = ObjectManager::getInstance()->get(SaveHandler::class); } return $this->saveHandler; } /** * Get load handler instance. * * @return LoadHandler */ private function getLoadHandler() { if (!$this->loadHandler) { $this->loadHandler = ObjectManager::getInstance()->get(LoadHandler::class); } return $this->loadHandler; } }