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

OnSalePayOrder и CSaleBasket::GetList

00 голосов
4
Доброго времени суток... Вот потребовалась задача, при оплате заказа нужно просмотреть все товары в заказе, достать опр. свойсво и потом обновить свойство у пользователя... Все с виду просто и банально... Но CSaleBasket::GetList просто отказывается работать... Т.е. есть вот такой код:



Код
AddEventHandler("sale", "OnSalePayOrder", "UserDiscount");

function UserDiscount($id,$val)
{
    $UserDiscount= new CUser;
   $arFields = Array();
   $arOrder=CSaleOrder::GetByID($id);
   $rsUsers = $UserDiscount->GetList(($by="personal_country"), ($order="desc"), Array('USER_ID'=>$arOrder['USER_ID']),array('SELECT'=>Array('UF_BONUS'))); 
   $arUSER=$rsUsers->Fetch();
   $bonus = 0;
   
   $dbBasketItems = CSaleBasket::GetList(
         array(
               "NAME" => "ASC",
               "ID" => "ASC"
            ),
         array(
               "LID" => SITE_ID,
               "ORDER_ID" => $id
            ),
         false,
         false,
         array("PRODUCT_ID", "QUANTITY")
      );
   while ($arItems = $dbBasketItems->Fetch())
   {
      mail("nastudio@ya.ru", "My Subject", $arItems["PRODUCT_ID"]);
      $db_props = CIBlockElement::GetProperty(29, $arItems["PRODUCT_ID"], "sort", "asc", Array("CODE"=>"BONUS"));
      if($ar_props = $db_props->Fetch()){
         $bonus = ($ar_props["VALUE"]*$arItems["QUANTITY"])+$bonus;
      }
   }
   if ($val=='Y'){
      $arFields['UF_BONUS'] = Double Val($arUSER['UF_BONUS'])+$bonus;
   }elseif(($val=='N')&&(Double Val($arUSER['UF_BONUS'])>0)){
        $arFields['UF_BONUS']=Double Val($arUSER['UF_BONUS'])-$bonus;
   }
   
   $UserDiscount->Update($arOrder['USER_ID'],$arFields);
   
}
Я думаю тут все понятно - у товара есть свойство - бонус при покупке... После оплаты закза мы суммируем все бонусы и прибавляем к тем которые уже есть у пользователя и соответсвенно обновляем пользователя... Все это находится естественно в init.php... Я пытался вынести подсчет бонуса в функцию... примерно так:


Код
AddEventHandler("sale", "OnSalePayOrder", "UserDiscount");

function UserDiscount($id,$val)
{
   $UserDiscount= new CUser;
   $arFields = Array();
   $arOrder=CSaleOrder::GetByID($id);
   $rsUsers = $UserDiscount->GetList(($by="personal_country"), ($order="desc"), Array('USER_ID'=>$arOrder['USER_ID']),array('SELECT'=>Array('UF_BONUS'))); 
   $arUSER=$rsUsers->Fetch();
   
   
  $bonus = get_bonus($id);
   if ($val=='Y'){
      $arFields['UF_BONUS'] = Double Val($arUSER['UF_BONUS'])+$bonus;
   }elseif(($val=='N')&&(Double Val($arUSER['UF_BONUS'])>0)){
        $arFields['UF_BONUS']=Double Val($arUSER['UF_BONUS'])-$bonus;
   }
   
   $UserDiscount->Update($arOrder['USER_ID'],$arFields);
   
}


function get_bonus($id){
    $bonus = 0;
   $dbBasketItems = CSaleBasket::GetList(
         array(
               "NAME" => "ASC",
               "ID" => "ASC"
            ),
         array(
               "LID" => SITE_ID,
               "ORDER_ID" => $id
            ),
         false,
         false,
         array("PRODUCT_ID", "QUANTITY")
      );
   while ($arItems = $dbBasketItems->Fetch())
   {
      
      $db_props = CIBlockElement::GetProperty(29, $arItems["PRODUCT_ID"], "sort", "asc", Array("CODE"=>"BONUS"));
      if($ar_props = $db_props->Fetch()){
         $bonus = ($ar_props["VALUE"]*$arItems["QUANTITY"])+$bonus;
      }
   }
    return $bonus;
}
Но увы... Причем если эту функцию вызвать отдельно и передать в нее нужный ид заказ - то все ок... А тут нет
Как быть - хз уже всю голову сломал(((
спросил 15 Янв, 13 от Logo1 (200 баллов)

4 Ответы

00 голосов
Цитата
PoTaP0ff пишет:
Но CSaleBasket::GetList просто отказывается работать

Вы имеете в виду, что вызов CSaleBasket::GetList() внутри вашего обработчика таки происходит, но возвращается пустой набор данных?
ответил 15 Янв, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Цитата
PoTaP0ff пишет:
Но CSaleBasket::GetList просто отказывается работать

Вы имеете в виду, что вызов CSaleBasket::GetList() внутри вашего обработчика таки происходит, но возвращается пустой набор данных?

Ну если внутри while ($arItems = $dbBasketItems->Fetch()){ допустим воткнуть функцию майл - то письмо не приходит, если майл воткнуть вне вайла - то все ок, письма приходят... Т.е. я предполагаю, что  CSaleBasket::GetList() вообще не работает в обработчике...
ответил 21 Янв, 13 от Logo1 (200 баллов)
00 голосов
А если убрать вот это условие из $arFilter, работает?

"LID" => SITE_ID,
ответил 20 Март, 13 от Ly (4,580 баллов)
00 голосов
О да, спасибо Вам огромное, жаль сам не додумался))))
ответил 17 Июль, 13 от Logo1 (200 баллов)

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

0 голосов
3 ответов
спросил 21 Март, 14 от HeJIJIu (630 баллов)
0 голосов
2 ответов
спросил 05 Май, 14 от RoMZeS1k (330 баллов)
0 голосов
3 ответов
спросил 29 Сен, 13 от Odwin (420 баллов)
0 голосов
5 ответов
0 голосов
2 ответов