yous
@yous

Bitrix подмена статуса заказа при изменении заказа?

как подменить приходящий статус в событие и сохранить другой?

\Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleStatusOrderChange', ['Handler', 'OnSaleStatusOrderChange']);

class Handler {
  function OnSaleStatusOrderChange(Bitrix\Main\Event $event)
  {

    $order = $event->getParameter("ENTITY");
    $value = $event->getParameter("VALUE");
    $oldValue = $event->getParameter("OLD_VALUE");

    $paymentCollection = $order->getPaymentCollection();
    $isPaid = $paymentCollection->isPaid();


    if ($value === 'PA' && $isPaid === true) {
     // ??? Меняем статус на нужный нам ???
     }
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
winer
@winer
занимаюсь разработкой сайтов на 1c-bitrix
Регистрируем обработчик
$bxEventManager = \Bitrix\Main\EventManager::getInstance();
$bxEventManager->addEventHandler(
    "sale",
    "OnSaleOrderBeforeSaved",
    array(
        Gricuk\Sale\Order::class,
        "changeStatusOnOrderCreate"
    )
);


Сам обработчик. У меня в примере логика на смена статуса заказа для определенных служб. Ее можно переписать на что угодно. Основное это $event->addResult
namespace Gricuk\Sale;

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

        $status = $order->getField("STATUS_ID");
        if ($status == "N") {
            /**  @var $paymentCollection \Bitrix\Sale\PaymentCollection */
            $paymentCollection = $order->getPaymentCollection();

            foreach ($paymentCollection as $payment) {
                /**  @var $payment \Bitrix\Sale\Payment */

                /**  @var $paySystem \Bitrix\Sale\PaySystem\Service */
                $paySystem = $payment->getPaySystem();

                if (!is_null($paySystem) && !$paySystem->isCash()) {
                    $order->setField("STATUS_ID", "NA");

                    $event->addResult(
                        new Main\EventResult(
                            Main\EventResult::SUCCESS, $order
                        )
                    );
                    break;
                }
            }
        }
    }
}


Пример 100% рабочий. Взят с прода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@PetrPo
$newStatusId = 'F';
$order->setField('STATUS_ID', $newStatusId);
$order->save();

В доках пример есть Смена статуса
Ответ написан
gromdron
@gromdron
Bitrix developer
Не следует подменять статус на событии OnSaleStatusOrderChange, так как это событие вызывается при смене статуса. Лучше отследить нужное событие перед сохранением заказа и уже в нем изменить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы