quoteFactory = $quoteFactory; $this->storeManager = $storeManager; $this->searchResultsDataFactory = $searchResultsDataFactory; $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; $this->collectionProcessor = $collectionProcessor ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\SearchCriteria\CollectionProcessor::class); $this->quoteCollectionFactory = $quoteCollectionFactory ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Quote\Model\ResourceModel\Quote\CollectionFactory::class); } /** * {@inheritdoc} */ public function get($cartId, array $sharedStoreIds = []) { if (!isset($this->quotesById[$cartId])) { $quote = $this->loadQuote('loadByIdWithoutStore', 'cartId', $cartId, $sharedStoreIds); $this->getLoadHandler()->load($quote); $this->quotesById[$cartId] = $quote; } return $this->quotesById[$cartId]; } /** * {@inheritdoc} */ public function getForCustomer($customerId, array $sharedStoreIds = []) { if (!isset($this->quotesByCustomerId[$customerId])) { $quote = $this->loadQuote('loadByCustomer', 'customerId', $customerId, $sharedStoreIds); $this->getLoadHandler()->load($quote); $this->quotesById[$quote->getId()] = $quote; $this->quotesByCustomerId[$customerId] = $quote; } 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(\Magento\Quote\Api\Data\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(\Magento\Quote\Api\Data\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 Quote */ protected function loadQuote($loadMethod, $loadField, $identifier, array $sharedStoreIds = []) { /** @var Quote $quote */ $quote = $this->quoteFactory->create(); if ($sharedStoreIds) { $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(\Magento\Framework\Api\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 * @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 * @deprecated 100.1.0 */ private function getSaveHandler() { if (!$this->saveHandler) { $this->saveHandler = ObjectManager::getInstance()->get(SaveHandler::class); } return $this->saveHandler; } /** * @return LoadHandler * @deprecated 100.1.0 */ private function getLoadHandler() { if (!$this->loadHandler) { $this->loadHandler = ObjectManager::getInstance()->get(LoadHandler::class); } return $this->loadHandler; } }