Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Почему не срабатывает OnOrderAdd + CSaleBasket::GetList?

00 голосов
5

Добрый день, уважаемые коллеги.

Возник такой вопрос...

Прикручиваем к проекту доп. функционал при оформлении заказа.

Для этого вешаем обработчик события OnOrderAdd в /bitrix/php_interface/init.php и вытаскиваем корзину по данному заказу посредством CSaleBasket::GetList

Делаем так
 

Код

AddEventHandler("sale", "OnOrderAdd", "OnOrderAddHandler");

function OnOrderAddHandler(&$ID, &$arFields) 
{
   if( CModule::IncludeModule( 'sale' ) ):
   $dbItemsInOrder = CSaleBasket::GetList( array( "ID" => "ASC" ), array( "ORDER_ID" => intval($ID) ) );
        
        while( $arItems = $dbItemsInOrder->Fetch() )
        {
            //...
        }


И не получаем ничего....


При этом если отдавать в "ORDER_ID" ($ID-1) все работает идеально...

Т.е. такое ощущение, что на момент возникновения данного события (OnOrderAdd), сама корзина по данному заказу еще отсутствует.

Подскажите пожалуйста, как при таком раскладе получить актуальную корзину?

Спасибо.

спросил 07 Май, 13 от LiveToWIn (360 баллов)
редактировать 10 Фев, 17 от root

5 Ответы

00 голосов
OnOrderAdd в момент срабатывания этого события позиции заказа еще не созданы . Соотвественно и привязанной корзины к заказу быть еще не может. Используйте событие OnOrderUpdate - оно срабатывает после OnOrderAdd

Код
AddEventHandler("sale", "OnOrderUpdate", "OnOrderAddHandler"); 

function OnOrderAddHandler(&$ID, &$arFields) 
{ 
   if( CModule::IncludeModule( 'sale' ) ): 
   $dbItemsInOrder = CSaleBasket::GetList( array( "ID" => "ASC" ), array( "ORDER_ID" => intval($ID) ) ); 
         
        while( $arItems = $dbItemsInOrder->Fetch() ) 
        { 
            //... 
        } 
ответил 07 Май, 13 от Poleolog (1,240 баллов)
00 голосов
Спасибо. Помогло.

P.S. О том, что корзина не формировалась, я и так понял :) ...
ответил 08 Май, 13 от LiveToWIn (360 баллов)
00 голосов
Хочу еще раз поднять эту тему.
Мне нужно поймать событие создания нового заказа и получить корзину заказа.
Как уже сказали выше, OnOrderAdd не работает. Но и OnOrderUpdate тоже не работает. Массив arFields пустой.

Как это сделать? При оформлении заказа получить все его свойства и корзину?
Я не хочу вешать на события, которые выполняются только в определенных компонентах типа sale.order.ajax, хочется использовать универсальные события. Есть ли решение?
ответил 11 Июль, 13 от maxdj (480 баллов)
00 голосов
На всякий случай уточню, про происходит это все внутри модуля.
Функция:
Код
public static function OnOrderUpdate($ID, $arFields){
      CModule::IncludeModule('sale');
      $dbBasketItems = CSaleBasket::GetList(array("ID" => "ASC"), array("ORDER_ID" => $ID), false, false, array("ID", "NAME", "QUANTITY", "PRICE", "CURRENCY"));

      while ($arItems = $dbBasketItems->Fetch())
      {
         print_r($arItems);
      }
die();
}


Не получает список товаров.
ответил 15 Окт, 13 от maxdj (480 баллов)
00 голосов
Оказывается вызов не происходил, если делать это из админки. И при тестировании просто заново форму передавать после обновления страницы в хроме.
Если оформлять заказ из пользовательской части, то все работает.
ответил 16 Янв, 14 от maxdj (480 баллов)

Похожие вопросы

0 голосов
7 ответов
спросил 06 Авг, 13 от FoCuS (360 баллов)
0 голосов
2 ответов
спросил 05 Май, 14 от RoMZeS1k (330 баллов)
0 голосов
3 ответов
спросил 21 Март, 14 от HeJIJIu (630 баллов)
0 голосов
3 ответов
спросил 29 Сен, 13 от Odwin (420 баллов)
0 голосов
4 ответов
спросил 15 Янв, 13 от Logo1 (200 баллов)