Заменить модуль поставщика (модуль-цитата) Файл модели Magento 2
Я хочу переопределить модуль цитаты модуля. Я хочу переопределить файл Model / QuoteManagment.php с функцией, защищенной submitQuote
Я сделал то же самое, используя предпочтение. Шаги, которые я сделал:
Создал кастомный модуль
Создан файл ect / di.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Quote\Model\QuoteManagement" type="QuoteTracker\Module\Model\QuoteManagement" />
Создан файл module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="QuoteTracker_Module" setup_version="1.0.2" /> <sequence> <module name="Magento_Backend"/> <module name="Magento_Sales"/> <module name="Magento_Quote"/> <module name="Magento_Checkout"/>> </sequence> </config> </config>
Создан файл Model / QuoteManagement.php, который я хочу переопределить для записи журналов
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace QuoteTracker\Module\Model; use Magento\Quote\Model\QuoteManagement as MagentoQuoteManagement; use Magento\Authorization\Model\UserContextInterface; use Magento\Customer\Api\Data\GroupInterface; use Magento\Framework\App\ObjectManager; use Magento\Framework\Event\ManagerInterface as EventManager; use Magento\Framework\Exception\CouldNotSaveException; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\StateException; use Magento\Quote\Api\Data\PaymentInterface; use Magento\Quote\Model\Quote\Address\ToOrder as ToOrderConverter; use Magento\Quote\Model\Quote\Address\ToOrderAddress as ToOrderAddressConverter; use Magento\Quote\Model\Quote as QuoteEntity; use Magento\Quote\Model\Quote\Item\ToOrderItem as ToOrderItemConverter; use Magento\Quote\Model\Quote\Payment\ToOrderPayment as ToOrderPaymentConverter; use Magento\Sales\Api\Data\OrderInterfaceFactory as OrderFactory; use Magento\Sales\Api\OrderManagementInterface as OrderManagement; use Magento\Store\Model\StoreManagerInterface; /** * Class QuoteManagement * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyFields) */ //class QuoteManagement implements \Magento\Quote\Api\CartManagementInterface class QuoteManagement extends MagentoQuoteManagement { /** * @var EventManager */ protected $eventManager; /** * @var SubmitQuoteValidator */ private $submitQuoteValidator; /** * @var OrderFactory */ protected $orderFactory; /** * @var OrderManagement */ protected $orderManagement; /** * @var CustomerManagement */ protected $customerManagement; /** * @var ToOrderConverter */ protected $quoteAddressToOrder; /** * @var ToOrderAddressConverter */ protected $quoteAddressToOrderAddress; /** * @var ToOrderItemConverter */ protected $quoteItemToOrderItem; /** * @var ToOrderPaymentConverter */ protected $quotePaymentToOrderPayment; /** * @var UserContextInterface */ protected $userContext; /** * @var \Magento\Quote\Api\CartRepositoryInterface */ protected $quoteRepository; /** * @var \Magento\Customer\Api\CustomerRepositoryInterface */ protected $customerRepository; /** * @var \Magento\Customer\Model\CustomerFactory */ protected $customerModelFactory; /** * @var \Magento\Quote\Model\Quote\AddressFactory */ protected $quoteAddressFactory; /** * @var \Magento\Framework\Api\DataObjectHelper */ protected $dataObjectHelper; /** * @var StoreManagerInterface */ protected $storeManager; /** * @var \Magento\Checkout\Model\Session */ protected $checkoutSession; /** * @var \Magento\Customer\Model\Session */ protected $customerSession; /** * @var \Magento\Customer\Api\AccountManagementInterface */ protected $accountManagement; /** * @var QuoteFactory */ protected $quoteFactory; /** * @var \Magento\Quote\Model\QuoteIdMaskFactory */ private $quoteIdMaskFactory; /** * @var \Magento\Customer\Api\AddressRepositoryInterface */ private $addressRepository; /** * @var array */ private $addressesToSync = []; /** * @var \Magento\Framework\App\RequestInterface */ private $request; /** * @var \Magento\Framework\HTTP\PhpEnvironment\RemoteAddress */ private $remoteAddress; /** * @param EventManager $eventManager * @param SubmitQuoteValidator $submitQuoteValidator * @param OrderFactory $orderFactory * @param OrderManagement $orderManagement * @param CustomerManagement $customerManagement * @param ToOrderConverter $quoteAddressToOrder * @param ToOrderAddressConverter $quoteAddressToOrderAddress * @param ToOrderItemConverter $quoteItemToOrderItem * @param ToOrderPaymentConverter $quotePaymentToOrderPayment * @param UserContextInterface $userContext * @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository * @param \Magento\Customer\Model\CustomerFactory $customerModelFactory * @param \Magento\Quote\Model\Quote\AddressFactory $quoteAddressFactory * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper * @param StoreManagerInterface $storeManager * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Customer\Model\Session $customerSession * @param \Magento\Customer\Api\AccountManagementInterface $accountManagement * @param QuoteFactory $quoteFactory * @param \Magento\Quote\Model\QuoteIdMaskFactory|null $quoteIdMaskFactory * @param \Magento\Customer\Api\AddressRepositoryInterface|null $addressRepository * @param \Magento\Framework\App\RequestInterface|null $request * @param \Magento\Framework\HTTP\PhpEnvironment\RemoteAddress $remoteAddress * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( EventManager $eventManager, SubmitQuoteValidator $submitQuoteValidator, OrderFactory $orderFactory, OrderManagement $orderManagement, CustomerManagement $customerManagement, ToOrderConverter $quoteAddressToOrder, ToOrderAddressConverter $quoteAddressToOrderAddress, ToOrderItemConverter $quoteItemToOrderItem, ToOrderPaymentConverter $quotePaymentToOrderPayment, UserContextInterface $userContext, \Magento\Quote\Api\CartRepositoryInterface $quoteRepository, \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository, \Magento\Customer\Model\CustomerFactory $customerModelFactory, \Magento\Quote\Model\Quote\AddressFactory $quoteAddressFactory, \Magento\Framework\Api\DataObjectHelper $dataObjectHelper, StoreManagerInterface $storeManager, \Magento\Checkout\Model\Session $checkoutSession, \Magento\Customer\Model\Session $customerSession, \Magento\Customer\Api\AccountManagementInterface $accountManagement, \Magento\Quote\Model\QuoteFactory $quoteFactory, \Magento\Quote\Model\QuoteIdMaskFactory $quoteIdMaskFactory = null, \Magento\Customer\Api\AddressRepositoryInterface $addressRepository = null, \Magento\Framework\App\RequestInterface $request = null, \Magento\Framework\HTTP\PhpEnvironment\RemoteAddress $remoteAddress = null ) { $this->eventManager = $eventManager; $this->submitQuoteValidator = $submitQuoteValidator; $this->orderFactory = $orderFactory; $this->orderManagement = $orderManagement; $this->customerManagement = $customerManagement; $this->quoteAddressToOrder = $quoteAddressToOrder; $this->quoteAddressToOrderAddress = $quoteAddressToOrderAddress; $this->quoteItemToOrderItem = $quoteItemToOrderItem; $this->quotePaymentToOrderPayment = $quotePaymentToOrderPayment; $this->userContext = $userContext; $this->quoteRepository = $quoteRepository; $this->customerRepository = $customerRepository; $this->customerModelFactory = $customerModelFactory; $this->quoteAddressFactory = $quoteAddressFactory; $this->dataObjectHelper = $dataObjectHelper; $this->storeManager = $storeManager; $this->checkoutSession = $checkoutSession; $this->accountManagement = $accountManagement; $this->customerSession = $customerSession; $this->quoteFactory = $quoteFactory; $this->quoteIdMaskFactory = $quoteIdMaskFactory ?: ObjectManager::getInstance() ->get(\Magento\Quote\Model\QuoteIdMaskFactory::class); $this->addressRepository = $addressRepository ?: ObjectManager::getInstance() ->get(\Magento\Customer\Api\AddressRepositoryInterface::class); $this->request = $request ?: ObjectManager::getInstance() ->get(\Magento\Framework\App\RequestInterface::class); $this->remoteAddress = $remoteAddress ?: ObjectManager::getInstance() ->get(\Magento\Framework\HTTP\PhpEnvironment\RemoteAddress::class); } /** * Submit quote * * @param Quote $quote * @param array $orderData * @return \Magento\Framework\Model\AbstractExtensibleModel|\Magento\Sales\Api\Data\OrderInterface|object * @throws \Exception * @throws \Magento\Framework\Exception\LocalizedException */ protected function submitQuote(QuoteEntity $quote, $orderData = []) { $order = $this->orderFactory->create(); $this->submitQuoteValidator->validateQuote($quote); if (!$quote->getCustomerIsGuest()) { if ($quote->getCustomerId()) { $this->_prepareCustomerQuote($quote); $this->customerManagement->validateAddresses($quote); } $this->customerManagement->populateCustomerInfo($quote); } $addresses = []; $quote->reserveOrderId(); if ($quote->isVirtual()) { $this->dataObjectHelper->mergeDataObjects( \Magento\Sales\Api\Data\OrderInterface::class, $order, $this->quoteAddressToOrder->convert($quote->getBillingAddress(), $orderData) ); } else { $this->dataObjectHelper->mergeDataObjects( \Magento\Sales\Api\Data\OrderInterface::class, $order, $this->quoteAddressToOrder->convert($quote->getShippingAddress(), $orderData) ); $shippingAddress = $this->quoteAddressToOrderAddress->convert( $quote->getShippingAddress(), [ 'address_type' => 'shipping', 'email' => $quote->getCustomerEmail() ] ); $shippingAddress->setData('quote_address_id', $quote->getShippingAddress()->getId()); $addresses[] = $shippingAddress; $order->setShippingAddress($shippingAddress); $order->setShippingMethod($quote->getShippingAddress()->getShippingMethod()); } $billingAddress = $this->quoteAddressToOrderAddress->convert( $quote->getBillingAddress(), [ 'address_type' => 'billing', 'email' => $quote->getCustomerEmail() ] ); $billingAddress->setData('quote_address_id', $quote->getBillingAddress()->getId()); $addresses[] = $billingAddress; $order->setBillingAddress($billingAddress); $order->setAddresses($addresses); $order->setPayment($this->quotePaymentToOrderPayment->convert($quote->getPayment())); $order->setItems($this->resolveItems($quote)); if ($quote->getCustomer()) { $order->setCustomerId($quote->getCustomer()->getId()); } $order->setQuoteId($quote->getId()); $order->setCustomerEmail($quote->getCustomerEmail()); $order->setCustomerFirstname($quote->getCustomerFirstname()); $order->setCustomerMiddlename($quote->getCustomerMiddlename()); $order->setCustomerLastname($quote->getCustomerLastname()); $this->submitQuoteValidator->validateOrder($order); $this->eventManager->dispatch( 'sales_model_service_quote_submit_before', [ 'order' => $order, 'quote' => $quote ] ); $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/order-tracker.log'); $logger = new \Zend\Log\Logger(); $logger->addWriter($writer); try { $order = $this->orderManagement->place($order); $logger->info("Order placed sucessfully. - Order #".$order->getIncrementId()); $logger->info(json_encode($order->getData())); $quote->setIsActive(false); $this->eventManager->dispatch( 'sales_model_service_quote_submit_success', [ 'order' => $order, 'quote' => $quote ] ); $this->quoteRepository->save($quote); } catch (\Exception $e) { $this->rollbackAddresses($quote, $order, $e); $logger->info("Order placed unsucessfully. - Order #".$order->getIncrementId()); $logger->info($e->getMessage()); throw $e; } return $order; } }
При запуске setup: di: compile я получаю ошибки для нескольких файлов зависимостей, которые вызываются в этой функции. Поделитесь, пожалуйста, способом переопределения этого файла модели.
1 ответ
Измените свой файл module.xml на этот и попробуйте еще раз:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="QuoteTracker_Module" setup_version="1.0.2">
<sequence>
<module name="Magento_Backend"/>
<module name="Magento_Sales"/>
<module name="Magento_Quote"/>
<module name="Magento_Checkout"/>
</sequence>
</module>
</config>