Magento ассоциирует клиента с заказом после размещения заказа - PullRequest
0 голосов
/ 28 мая 2018

Мой пользовательский модуль наблюдает за событием sales_order_place_after, создает клиента и связывает его с заказом, устанавливая для заказа customerId.

Что работает?

  • Заказ размещен
  • Клиент создан
  • Обновлен customerId в базе данных заказов

Что не 'не работает?

  • customerId мгновенно возвращается к NULL другим сценарием

Как узнать, какой сценарий обновляет customerId к NULL снова, после того, как мой наблюдатель закончит работу?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

У меня была та же проблема - я предполагал, что вызов метода save в заказе вызвал все, что слушало события sales_order_save_before/after, одним из которых было присвоение идентификатору клиента значения null.Я решил эту проблему, сохранив только те атрибуты, которые мне нужны, а не вызвав сохранение всего заказа:

$order
    ->setCustomerId($customer->getId())
    ->setCustomerIsGuest(0)
    ->setCustomerGroupId($customer->getGroupId());

$order->getResource()
    ->saveAttribute($order, 'customer_id'      )
    ->saveAttribute($order, 'customer_is_guest')
    ->saveAttribute($order, 'customer_group_id');

Это позволило мне успешно связать клиента с заказом в Magento EE 1.14.3.10 с помощьюsales_model_service_quote_submit_success событие.

0 голосов
/ 22 мая 2019

У меня недостаточно репутации, чтобы комментировать, но я смог использовать ответ @ gregdev для достижения этой цели.

Config.xml добавить наблюдателя событий:

<sales_model_service_quote_submit_success>
            <observers>
                <your_observer_name_here>
                    <class>module/observer</class>
                    <method>checkOrderCustomer</method>
                </your_observer_name_here>
            </observers>
</sales_model_service_quote_submit_success>

В вашем Observer.php

public function checkOrderCustomer($observer){
    $order = $observer->getEvent()->getOrder();
    //however you want to check for customer
    $customerEmail = $order->getCustomerEmail();
    $customer = Mage::getModel('customer/customer')->loadByEmail($customerEmail);
        if($customer->getId()){
            //assign order to customer
            $order
                ->setCustomerId($customer->getId())
                ->setCustomerIsGuest(0)
                ->setCustomerGroupId($customer->getGroupId());

            $order->getResource()
                ->saveAttribute($order, 'customer_id'      )
                ->saveAttribute($order, 'customer_is_guest')
                ->saveAttribute($order, 'customer_group_id');
        }
    }
}

Я думаю, что проблема с sales_order_place_after как-то связана сследующее в Mage / Sales / Model / Service / Quote.php

$transaction->addObject($order);
$transaction->addCommitCallback(array($order, 'place'));
$transaction->addCommitCallback(array($order, 'save'));

Я не уверен, что переменная $order, переданная во второй обратный вызов, получает какие-либо изменения клиента, которые были применены во времяsales_order_place_after событие.

0 голосов
/ 12 июня 2018

Вы должны изменить событие на 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>

GenerateObserver.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;
}
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...