Magento在下订单后将客户与订单联系起来

J. *_*jer 12 magento

我的自定义模块会观察sales_order_place_after事件,并通过设置订单来创建客户并将客户与订单相关联customerId.

什么有用?

  • 订单已下达
  • 客户已创建
  • customerId在订单数据库中更新

什么不起作用?

  • customerId会立即NULL被另一个脚本重新设置

我怎样才能找出脚本更新customerIdNULL 再次,我的观察者完成后运行?

Hoa*_*ieu 0

您应该将事件更改为sales_model_service_quote_submit_success

示例代码(Magento 2 版本):events.xml

<event name="sales_model_service_quote_submit_success">
        <observer name="quote_submit_success_observer" instance="Namespace\ModuleName\Observer\GenerateObserver" />
    </event>
Run Code Online (Sandbox Code Playgroud)

生成观察者.php

 ...
 public function execute(\Magento\Framework\Event\Observer $observer)
 {
    /** @var \Magento\Sales\Model\Order $order */
        $order = $observer->getEvent()->getData('order');

    // Ensure customer is registered
    $this->registerCustomer($order);
    $order->getResource()->save($order);
 }

protected function registerCustomer(
    \Magento\Sales\Api\Data\OrderInterface $order
) {
    /** @var \Magento\Sales\Model\Order $order */

    if ($order->getCustomerId() === null) {
        // Load customer by email, create if not exists.
        try {
            $customerData = $this->customerRepository->get($order->getCustomerEmail());
        } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
            $customerData = $this->orderCustomerManager->create($order->getId());
        }

        $order->setCustomerId($customerData->getId());
    }

    return $this;
}
 ...
Run Code Online (Sandbox Code Playgroud)