creditmemo заказа на продажу сохранить после срабатывания счет-фактура заказа на продажу сохранить после


У меня есть наблюдатель, который прослушивает события, которые срабатывают sales_order_creditmemo_save_after. Проблема, с которой я сталкиваюсь, заключается в том, что при сохранении кредит-ноты в счете-фактуре также запускается событие sales_order_invoice_save_after, что вызывает проблемы с моим кодом, потому что у меня также есть другой наблюдатель, прослушивающий это событие.

Для наблюдателя, слушающего sales_order_invoice_save_after - есть ли способ определить, было ли событие кредит-нотой или счетом-фактурой?

Я нашел глубоко внутри объекта $observer, protected '_historyEntityName' => string 'creditmemo' (length=10) однако есть ли еще стандартный способ доступа к этой информации?

Author: Francis Kim, 2015-01-22

2 answers

Обходной путь состоял в том, чтобы добавить условную проверку на sales_order_invoice_save_after для поиска метки статуса заказа. Поскольку мне нужен был наблюдатель только для работы, когда статус заказа был "Обработка", я смог использовать:

if ($order->getStatusLabel() == 'Processing')

Однако мне еще предстоит найти способ доступа к protected '_historyEntityName' => string 'creditmemo' (length=10) в объекте наблюдателя.

 0
Author: Francis Kim, 2015-02-18 23:07:40

Вы можете использовать Mage::register($name,$value) и Mage::registry($name) для решения этой проблемы.

Внутри вашего события sales_order_creditmemo_save_after добавьте это:

$orderid = $observer->getEvent()->getCreditmemo()->getOrderId();
Mage::register('creditmemo_created_for_order_'.$orderid,true);

В начале вашего события sales_order_invoice_save_after добавьте следующее:

$orderid = $observer->getEvent()->getInvoice()->getOrderId();
if(Mage::registry('creditmemo_created_for_order_'.$orderid)) { return; }

Что это сделает, так это сохранит значение "true" во временном кэше (Mage::registry), доступном из любого скрипта для этого ОДНОГО запроса. После завершения загрузки страницы это значение больше не сохраняется.

Поскольку оба события запускаются в одном запросе, это означает, что первое событие (sales_order_creditmemo_save_after) сохраняет значение, а второе событие (sales_order_invoice_save_after) проверяет его существование, и если оно существует, оно выйдет из вашей функции наблюдателя.

 0
Author: Kane Shaw, 2020-05-01 11:32:43