Декабрь 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");
// выполняем код перед сохранением,но после проверки полей
}
}