creditmemo заказа на продажу сохранить после срабатывания счет-фактура заказа на продажу сохранить после
У меня есть наблюдатель, который прослушивает события, которые срабатывают sales_order_creditmemo_save_after
. Проблема, с которой я сталкиваюсь, заключается в том, что при сохранении кредит-ноты в счете-фактуре также запускается событие sales_order_invoice_save_after
, что вызывает проблемы с моим кодом, потому что у меня также есть другой наблюдатель, прослушивающий это событие.
Для наблюдателя, слушающего sales_order_invoice_save_after
- есть ли способ определить, было ли событие кредит-нотой или счетом-фактурой?
Я нашел глубоко внутри объекта $observer
, protected '_historyEntityName' => string 'creditmemo' (length=10)
однако есть ли еще стандартный способ доступа к этой информации?
2 answers
Обходной путь состоял в том, чтобы добавить условную проверку на sales_order_invoice_save_after
для поиска метки статуса заказа. Поскольку мне нужен был наблюдатель только для работы, когда статус заказа был "Обработка", я смог использовать:
if ($order->getStatusLabel() == 'Processing')
Однако мне еще предстоит найти способ доступа к protected '_historyEntityName' => string 'creditmemo' (length=10)
в объекте наблюдателя.
Вы можете использовать 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) проверяет его существование, и если оно существует, оно выйдет из вашей функции наблюдателя.