События на создание и сохранение заказа

Модуль расширенного управления меню для битрикс

Декабрь 16, 2019

Теги: Магазин

Обработчики событий при создании и сохранении заказа: "OnSaleOrderSaved", "OnSaleOrderBeforeSaved".

Выполнение обработчика после создания заказа:


namespace Partner;


\
Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'sale'
    
'OnSaleOrderSaved'
    
'\Partner\MyClass::onSaleOrderSaved'
); 

class 
MyClass 
{
    function 
onSaleOrderSaved(\Bitrix\Main\Event $event)
    {
        if(!
$event->getParameter("IS_NEW"))
            return;
        
$order $event->getParameter("ENTITY");
        
// выполняем код
    
}    
}

Отменяем создание заказа при отсутствии каких-то данных и выдаем сообщение в процедуре заказа, при этом проверяем, не было ли сгенерировано ошибок другими обработчиками, для этого регистрируем событие с большой сортировкой, чтобы оно выполнялось в конце (флага IS_NEW в этом событии нет, поэтому проверяем, что заказ еще не создан с помощью проверки отсутствия ID заказа):


namespace Partner;


\
Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'sale'
    
'OnSaleOrderBeforeSaved'
    
'\Partner\MyClass::onSaleOrderBeforeSaved'
); 

class 
MyClass 
{
    function 
onSaleOrderBeforeSaved(\Bitrix\Main\Event $event$values)
    {
        foreach(
$event->getResults() as $previousResult)
            if(
$previousResult->getType()!=\Bitrix\Main\EventResult::SUCCESS)
                return;
        
$order $event->getParameter("ENTITY");    
        if(
$order->getId())
            return;

        return new \
Bitrix\Main\EventResult(
            \
Bitrix\Main\EventResult::ERROR,
            \
Bitrix\Sale\ResultError::create(new \Bitrix\Main\Error("Test error message""GRAIN_IMFAST"))
        );            
    }    
}

Изменяем поля заказа и оплаты заказа до создания заказа (делаем заказ сразу оплаченным):


namespace Partner;


\
Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'sale'
    
'OnSaleOrderBeforeSaved'
    
'\Partner\MyClass::onSaleOrderBeforeSaved'
); 

class 
MyClass 
{
    function 
onSaleOrderBeforeSaved(\Bitrix\Main\Event $event$values)
    {
        foreach(
$event->getResults() as $previousResult)
            if(
$previousResult->getType()!=\Bitrix\Main\EventResult::SUCCESS)
                return;
        
$order $event->getParameter("ENTITY");    
        if(
$order->getId())
            return;
        
$payment false;
        foreach (
$order->getPaymentCollection() as $p)
        {
            if (
$p->getPaymentSystemId() != \Bitrix\Sale\PaySystem\Manager::getInnerPaySystemId())
            {
                
$payment=$p;
                break;
            }
        }
        if(!
$payment)
            return;

        
$order->setField('PAYED','Y');
        
$payment->setField('PAID','Y');
    }    
}

См. также:

← Переход к списку