Magento 2: Измените код валюты котировки перед размещением заказа в Observer
Я пытаюсь изменить валюту котировки перед размещением любого ордера.
Для этого я использовал приведенное ниже событие.
Vendor\Module\etc\frontend\events.xml
<event name="sales_model_service_quote_submit_before">
<observer name="change_currency_before_place_order" instance="Vendor\Module\Observer\BeforePlaceOrder" />
</event>
Vendor\Module\Observer\BeforePlaceOrder.php
<?php
namespace Vendor\Module\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class BeforePlaceOrder implements ObserverInterface
{
protected $_checkoutSession;
private $logger;
/**
* @var \Magento\Catalog\Model\Session
*/
protected $catalogSession;
public function __construct(
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Catalog\Model\Session $catalogSession,
\Psr\Log\LoggerInterface $logger
)
{
$this->_checkoutSession = $checkoutSession;
$this->catalogSession = $catalogSession;
$this->logger = $logger;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$quote = $observer->getEvent()->getQuote();
$this->logger->info('inside place order observer');
//$this->storeManager->getStore()->setCurrentCurrencyCode('EUR');
$quote->setQuoteCurrencyCode("EUR");
$quote->collectTotals();
}
}
Вышеупомянутое событие не срабатывает для меня, есть ли другой способ реализовать эту функциональность?
Примечание: Принятый ответ работает хорошо, но как только счет-фактура будет создана, его снова переход на валюту по умолчанию.
Может ли кто-нибудь посоветовать мне, пожалуйста, почему это событие не срабатывает даже после размещения по всему миру?.
2 answers
Попробуйте использовать приведенный ниже код.
Events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_order_save_commit_after">
<observer name="sumit_custom_order_currency" instance="Vendor\Module\Observer\OrderSaveCommitAfter" />
</event>
</config>
OrderSaveCommitAfter.php
namespace Vendor\Module\Observer;
use Magento\Framework\Event\ObserverInterface;
class OrderSaveCommitAfter implements ObserverInterface
{
public function execute(\Magento\Framework\Event\Observer $observer)
{
/* @var $order Order */
$order = $observer->getEvent()->getOrder();
if (!$order->getId()) {
//order not saved in the database
return;
}
$order->setBaseCurrencyCode('EUR');
$order->setGlobalCurrencyCode('EUR');
$order->setOrderCurrencyCode('EUR');
$order->setStoreCurrencyCode('EUR');
$order->save();
}
}
Надеюсь, это поможет!!!
Это обходной путь использования плагина вместо наблюдателя.
Vendor/Module/etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Sales\Api\OrderRepositoryInterface">
<plugin name="Module_OrderAfterSave" type="Vendor\Module\Plugin\OrderAfterSave" sortOrder="10" disabled="false" />
</type>
Затем Vendor\Module\Plugin\OrderAfterSave.php
<?php
namespace Vendor\Module\Plugin;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Api\Data\OrderInterface;
use Magento\Framework\ObjectManagerInterface;
class OrderAfterSave
{
private $logger;
protected $objectManager;
protected $orderRepositoryInterface;
protected $_coreSession;
public function __construct(
ObjectManagerInterface $objectManager,
OrderRepositoryInterface $orderRepositoryInterface,
\Psr\Log\LoggerInterface $logger,
\Magento\Framework\Session\SessionManagerInterface $coreSession
) {
$this->objectManager = $objectManager;
$this->orderRepositoryInterface = $orderRepositoryInterface;
$this->logger = $logger;
$this->_coreSession = $coreSession;
}
public function afterSave(\Magento\Sales\Api\OrderRepositoryInterface $orderRepo, $order)
{
$currencyCode = 'EUR';
$order->setBaseCurrencyCode($currencyCode);
$order->setGlobalCurrencyCode($currencyCode);
$order->setOrderCurrencyCode($currencyCode);
$order->setStoreCurrencyCode($currencyCode);
$order->save();
return $order;
}
Я надеюсь, что это поможет вам!!