Документация для разработчиков
Темная тема

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

События

Все сущности сохраняются в том состоянии, в котором они есть на текущий момент, т.е. сохранение происходит на уже рассчитанном заказе. Сохранение всегда происходит через метод заказа save(). При этом сохраняется не только заказ, но и все связанные с ним сущности (оплаты и отгрузки) именно в том консистентном состоянии, которое было достигнуто путем расчетов объектов:

/** \Bitrix\Sale\Order $order */
$order = \Bitrix\Sale\Order::load(18);
$order->setField("USER_DESCRIPTION", "Доставить к подъезду");

$shipmentCollection = $order->getShipmentCollection();
/** \Bitrix\Sale\Shipment $shipment */
foreach ($shipmentCollection as $shipment)
{
    if (!$shipment->isSystem())
        $shipment->allowDelivery();
}

$order->save();

Вмешаться в процесс сохранения можно с помощью двух событий на сохранение заказа.

СобытиеОписание и параметры
OnSaleOrderBeforeSaved Происходит в самом начале процесса сохранения.

Параметры
ENTITY Объект заказа.
VALUES Старые значения полей заказа.
OnSaleOrderSaved Происходит в конце сохранения, когда заказ и все связанные сущности уже сохранены.

Параметры
ENTITY Объект заказа.
VALUES Старые значения полей заказа.
IS_NEW Принимает одно из двух значений: true - если заказ новый, false - если нет. Использование данного флага позволяет избавиться от зацикливаний при вызове сохранения заказа в событии.

Примеры

//пример использования события OnSaleOrderSaved

use Bitrix\Main; 
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderSaved',
    'myFunction'
);

//в обработчике получаем сумму, с которой планируются некоторые действия в дальнейшем:

function myFunction(Main\Event $event)
{
    /** @var Order $order */
    $order = $event->getParameter("ENTITY");
    $oldValues = $event->getParameter("VALUES");
    $isNew = $event->getParameter("IS_NEW");

    if ($isNew)
    {
        $sum = $order->getPrice();
        // . . . 
    }
}



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Михаил Буров
Сообщение не промодерировано, возможны ошибки и неточности.
Документация по событию OnSaleOrderSaved для версии (по крайней мере) 21.900.0 не корректна.

Теперь в событие приходит не \Bitrix\Main\Event, а непосредственно сам \Bitrix\Sale\Order
0
Денис Дергунов
Сообщение не промодерировано, возможны ошибки и неточности.
В событии OnSaleOrderBeforeSaved
Как изменить свойство и ВЕРНУТЬ ОШИБКУ, и чтобы свойство было ИЗМЕНЁННЫМ ???????????????????????????????????????
0
Александр Виноградов
Сообщение не промодерировано, возможны ошибки и неточности.
Код
//У меня этот пример сработал только с $order->save();
//С $event->addResult сохранение изменений не произошло


use Bitrix\Main; 
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeSaved',
    'myFunction'
);

//в обработчике изменим комментарий:

function myFunction(Main\Event $event)
{
    /** @var Order $order */
    $order = $event->getParameter("ENTITY");
    $order->setField('COMMENTS', 'Новый комментарий');

    /** здесь отличие
    $order->save();
  
} 
2
Cтанислав Захаров
P.S. чтобы применить изменения для $order
Код
//пример использования события OnSaleOrderBeforeSaved

use Bitrix\Main; 
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeSaved',
    'myFunction'
);

//в обработчике изменим комментарий:

function myFunction(Main\Event $event)
{
    /** @var Order $order */
    $order = $event->getParameter("ENTITY");
    $order->setField('COMMENTS', 'Новый комментарий');
    $event->addResult(
            new Main\EventResult(
                Main\EventResult::SUCCESS, $order
            )
        );
}  
11
Максим Масалов
Если вам нужно изменить значения определенных свойств в заказе, но при этом в этих значениях участвуют другие свойства, то сделать это можно таким образом.
Код
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderBeforeSaved',
    'saleOrderBeforeSaved'
);


function saleOrderBeforeSaved(Main\Event $event)
{
    /** @var \Bitrix\Sale\Order $order */
    $order = $event->getParameter("ENTITY");

    /** @var \Bitrix\Sale\PropertyValueCollection $propertyCollection */
    $propertyCollection = $order->getPropertyCollection();

    $propsData = [];

    /**
     * Собираем все свойства и их значения в массив
     * @var \Bitrix\Sale\PropertyValue $propertyItem
     */
    foreach ($propertyCollection as $propertyItem) {
        if (!empty($propertyItem->getField("CODE"))) {
            $propsData[$propertyItem->getField("CODE")] = trim($propertyItem->getValue());
        }
    }

    /**
     * Перебираем свойства и изменяем нужные значения
     * @var \Bitrix\Sale\PropertyValue $propertyItem
     */
    foreach ($propertyCollection as $propertyItem) {

        switch ($propertyItem->getField("CODE")) {

            // Установка полного адреса в формате: Адрес, Город, Индекс
            case 'F_PATH':
                $val = trim($propsData['ADDRESS'] . ', ' . $propsData['CITY'] . ', ' . $propsData['ZIP']);
                $propertyItem->setField("VALUE", $val);
                break;

            // Прописываем ФИО в одно поле
            case 'F_FIO':
                $val = $propsData['FNAME'] . ' ' . $propsData['LNAME'] . ' ' . $propsData['MNAME'];
                $propertyItem->setField("VALUE", $val);
                break;

        }
    }

}
© «Битрикс», 2001-2022, «1С-Битрикс», 2022
Наверх