Magento 2: How to get order data in observer on success page
-
05-10-2020 - |
質問
I'm here domain.com/checkout/onepage/success/
Calling my observer on checkout_onepage_controller_success_action
$order = $observer->getEvent()->getOrder();
echo $order->getCustomerId()
echo $order->getState()
I'm not able to get all information above. How to get?
It gives
Fatal error: Call to a member function getState() on null
解決
checkout_onepage_controller_success_action
give you order id's
by using $observer->getEvent()->getOrderIds()
.
This does not given order object directly so, you are getting the error
Then you need to object by this id
<?php
namespace [VendorName]\[ModuleName]\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\App\ObjectManager;
class [ClassName] implements ObserverInterface
{
protected $_order;
public function __construct(
\Magento\Sales\Api\Data\OrderInterface $order
) {
$this->_order = $order;
}
/**
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$orderids = $observer->getEvent()->getOrderIds();
foreach($orderids as $orderid){
$order = $this->_order->load($orderid);
}
}
}
他のヒント
Create events.xml at app/code/VendoreName/ModuleName/etc/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="checkout_onepage_controller_success_action">
<observer name="checkout_controller_success_action" instance="VendoreName\ModuleName\Observer\AfterPlaceOrder" />
</event>
</config>
Create Observer file at app/code/VendoreName/ModuleName/Observer/AfterPlaceOrder.php
namespace VendoreName\ModuleName\Observer;
use Magento\Framework\Event\ObserverInterface;
class AfterPlaceOrder implements ObserverInterface
{
/**
* Order Model
*
* @var \Magento\Sales\Model\Order $order
*/
protected $order;
public function __construct(
\Magento\Sales\Model\Order $order
)
{
$this->order = $order;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$orderId = $observer->getEvent()->getOrderIds();
$order = $this->order->load($orderId);
//get Order All Item
$itemCollection = $order->getItemsCollection();
$customer = $order->getCustomerId(); // using this id you can get customer name
}
}
In Magento 2.1.9 this works for me.
etc/frontend/events.xml
<event name="checkout_onepage_controller_success_action">
<observer instance="Vendor\Module\Observer\Checkout\OnepageControllerSuccessAction" name="vendor_module_observer_checkout_onepagecontrollersuccessaction_checkout_onepage_controller_success_action"/>
</event>
Observer\Checkout\OnepageControllerSuccessAction.php
<?php
namespace Vendor\Module\Observer\Checkout;
class OnepageControllerSuccessAction implements \Magento\Framework\Event\ObserverInterface
{
public function __construct(\Magento\Sales\Model\Order $order)
{
$this->order = $order;
}
/**
* Execute observer
*
* @param \Magento\Framework\Event\Observer $observer
* @return void
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$orderids = $observer->getEvent()->getOrderIds();
try {
foreach ($orderids as $orderid) {
$order = $this->order->load($orderid);
$order->hold();
$order->save();
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
// Error logic
} catch (\Exception $e) {
// Generic error logic
}
}
}
I didn't add the logic why the order is placed on hold, but this will get you close to how to modify each of the current orders and saving them.