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

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

Декабрь 16, 2019

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

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

Часто вместо данных событий удобнее использовать События на изменение полей заказа, отгрузки и др.
Выполнение обработчика после создания заказа:


namespace Partner;


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

class 
MyClass 
{
    public static 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 
{
    public static function 
onSaleOrderBeforeSaved(\Bitrix\Main\Event $event)
    {
        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 
{
    public static function 
onSaleOrderBeforeSaved(\Bitrix\Main\Event $event)
    {
        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');
    }    
}

Автоматическое заполнение некоего служебного свойства заказа (в данном примере - заполнение названий спецпредложений из соответствующего свойства элемента инфоблока):


namespace Partner;


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

class 
MyClass 
{
    public static function 
onSaleOrderBeforeSaved(\Bitrix\Main\Event $event)
    {
        
$order $event->getParameter("ENTITY");
        if(!
\Bitrix\Main\Loader::includeModule('iblock'))
            return;
        
$offerList = array();
        foreach (
$order->getBasket() as $item)
        {
            if(!
$productId=intval($item->getProductId()))
                continue;
            
$rsElements \CIBlockElement::GetList(
                array(),
                array(
"=ID"=>$productId),
                
false,
                array(
"nTopCount"=>1),
                array(
"ID","IBLOCK_ID","PROPERTY_SPECIALOFFERS")
            );
            if(!
$obElement=$rsElements->GetNextElement()) 
                continue;
            
$element $obElement->GetFields();
            
$element['PROPERTIES'] = array('SPECIALOFFERS'=>$obElement->GetProperty('SPECIALOFFERS'));    
            if(!
$element['PROPERTIES']['SPECIALOFFERS']['VALUE'])
                continue;
            foreach(
$element['PROPERTIES']['SPECIALOFFERS']['VALUE'] as $offerName)
                if(!
in_array($offerName,$offerList))
                    
$offerList[] = $offerName;
        }
        
$propertyCollection $order->getPropertyCollection();
        foreach(
$propertyCollection as $propertyValue)
        {
            if(
$propertyValue->getField('CODE')!='OFFERS')
                continue;
            
$propertyValue->setValue($offerList);
            break;
        }
    }    
}

Выполнение обработчика только в том случае, когда менется конкретное поле (в данном случае - "DEDUCTED"):


namespace Partner;


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

class 
MyClass 
{
    public static function 
onSaleOrderBeforeSaved(\Bitrix\Main\Event $event)
    {
        
$order $event->getParameter("ENTITY");
        
$oldValues $event->getParameter("VALUES");

        if(!
$order->getId())
            return;

        if(!
array_key_exists('DEDUCTED'$oldValues) || $oldValues['DEDUCTED']==$order->getField('DEDUCTED'))
            return;

        
// выполняем код только в случае когда поле DEDUCTED изменено
    
}    
}

Событие "OnSaleOrderEntitySaved" вызывается после проверки всех полей перед сохранением:


namespace Partner;


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

class 
MyClass 
{
    function 
onSaleOrderEntitySaved(\Bitrix\Main\Event $event)
    {
        
$order $event->getParameter("ENTITY");
        
$oldValues $event->getParameter("VALUES");

        
// выполняем код перед сохранением,но после проверки полей
    
}    
}

См. также:

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