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

Вызов события нового заказа только один раз.

00 голосов
5
Задача: при добавлении заказа запись информации о заказе в БД.

Использование OnOrderAdd невозможно, т.к. нельзя получить товары заказа.
Использование OnOrderUpdate невозможно, т.к. вызывает очень много раз. У меня нет возможности проверить, есть ли уже заказ с таким ID в базе данных, не спрашивайте почему.

Есть ли какое-нибудь событие, не привязанное к компонентам специфичным, которые бы вызывалось только при добавлении заказа и позволяло бы получить его состав?
Или может есть какое-нибудь интересное решение с OnOrderAdd?
спросил 24 Ноя, 13 от maxdj (480 баллов)

5 Ответы

00 голосов
Насколько я помню, можно так (подсмотрел когда-то в sale.personal.order.detail):

Код
function onOrderAddHandler($arFields) 
{ 
    $dbBasket = CSaleBasket::GetList(
      array(),
      array("ORDER_ID" => $arFields['ID']),
      false,
      false,
      array("ID", "PRODUCT_ID")
   );
   while ($arBasket = $dbBasket->Fetch()){
      echo $arBasket['PRODUCT_ID'] //здесь будет id товара
   }
}

Так можно получить список товаров. Правда не уверен с каким именно ключом хранится id заказа, но это будет несложно определить.
ответил 15 Янв, 14 от KeiDen (400 баллов)
00 голосов
Вы не особо внимательно читали мое сообщение.
Получить с OrderAdd невозможно список товаров. Его просто еще нет.
А OrderUpdate вызывается много раз.

Так или иначе, мне все же пришлось писать ID заказа в базу и смотреть, есть ли он там уже при использовании OrderUpdate. Решение не красивое, но единственное верное.
ответил 02 Май, 14 от maxdj (480 баллов)
00 голосов
ну можно отлавливать почтовое событие, оно отправляется один раз и когда создание заказа уже полностью окончено
Код
<? 
AddEventHandler("main", "OnBeforeEventAdd", Array("MyEventHandlers", "OnBeforeEventAddHandler")); 
class MyEventHandlers 
{ 
    function OnBeforeEventAddHandler(&$event, &$lid, &$arFields)
    {
     if($event==="SALE_NEW_ORDER")
     {
      $order_props = CSaleOrderPropsValue::GetOrderProps($arFields["ORDER_ID
.....................
     }
    } 
} 
ответил 28 Авг, 14 от LadyFlame (140 баллов)
00 голосов
Плохое решение.
Почтовые события могут быть отключены или переделаны или что-нибудь еще.
Я выше уже написал правильное решение.
ответил 03 Янв, 15 от maxdj (480 баллов)
00 голосов
даже если тип почтового события SALE_NEW_ORDER удален, стандартные компоненты оформления заказа все равно генерируют это почтовое событие и обработчик сработает
ответил 21 Апр, 15 от LadyFlame (140 баллов)

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

0 голосов
1 ответ
спросил 09 Фев, 13 от Titan91 (1,120 баллов)
0 голосов
1 ответ
спросил 10 Май, 14 от EWARw (480 баллов)
0 голосов
4 ответов
спросил 19 Дек, 13 от maxdj (480 баллов)
0 голосов
5 ответов