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

Взаимодействие торгового каталога и магазина

До версии 12.5 взаимодействие интернет-магазина и торгового каталога строилось на функциях обратного вызова. Теперь взаимодействие осуществляется через новый интерфейс IBXSaleProductProvider. В корзину добавлено одно новое поле PRODUCT_PROVIDER_CLASS, каталог записывает в это поле имя класса CCatalogProductProvider.

После выхода версии 12.5 функции обратного вызова задействуются только в том случае, если не задан провайдер (поле PRODUCT_PROVIDER_CLASS пусто).

Функции обратного вызова:

Для поддержки актуальности корзины

Функция обратного вызова вызывается (если установлена) при каждом чтении корзины для обновления параметров содержащихся в корзине товаров. Например, если после добавления товара в корзину изменилась его цена или товар сняли с продажи, то использование функции обратного вызова позволяет соответственно обновить данные в корзине. В поле CALLBACK_FUNC записывается только имя функции обратного вызова. Для некоторых модулей функции обратного вызова уже написаны (например, для модуля catalog функция обратного вызова называется CatalogBasketCallback($PRODUCT_ID, $QUANTITY = 0, $renewal = "N", $intUserID = 0, $strSiteID = false))

array CALLBACK_FUNC(
 int PRODUCT_ID [, 
int QUANTITY,
char renewal,
int $intUserID,
string $strSiteID]
);

Функция обратного вызова должна возвращать массив той же структуры, что и входной массив метода CSaleBasket::Add(array arFields). Если функция возвращает пустой массив, то это означает, что данный товар не доступен для покупки.

Параметры функции обратного вызова

Название Описание
PRODUCT_ID Код товара, находящегося в корзине.
QUANTITY Количество товаров в корзине.
renewal Равен "Y", если функция вызывается для продления подписки, и "N" в остальных случаях.
$intUserID* ID пользователя. Если не задан, то берется текущий.
$strSiteID* Сайт, для которого идет работа с корзиной. Если параметр равен false, то берется текущий сайт.

* - параметры доступны, начиная с версии 12.0.

Пример создания функции обратного вызова
<?
function MyBasketCallback($PRODUCT_ID, $QUANTITY = 0)
{
$arResult = array();

$iProductQuantity = GetProductQuantity($PRODUCT_ID);
if ($iProductQuantity<=0)
return $arResult; // товар кончился, возвращаем пустой массив

$arResult = array(
"PRODUCT_PRICE_ID" => 0,
"PRICE" => 125.2,
"CURRENCY" => "RUB",
"WEIGHT" => 530,
"NAME" => "Чемодан кожаный",
"CAN_BUY" => "Y"
);

if (IntVal($QUANTITY)>0 && ($iProductQuantity-$QUANTITY)<0)
$arResult["QUANTITY"] = $iProductQuantity; // товара осталось
// меньше, чем в корзине, поэтому уменьшаем
// количество товара в корзине

return $arResult;
}
?>

Для оформления заказа

Функция обратного вызова для оформления заказа вызывается (если установлена) в момент оформления заказа на данный товар. Например, если отслеживается количество оставшихся в магазине единиц товара, то использование функции обратного вызова заказа позволяет соответственно уменьшить количество оставшихся в магазине единиц товара. В поле ORDER_CALLBACK_FUNC записывается только имя функции обратного вызова заказа. Для некоторых модулей функции обратного вызова заказа уже написаны (например, для модуля catalog функция обратного вызова заказа называется CatalogBasketOrderCallback($PRODUCT_ID, $QUANTITY, $renewal = "N", $intUserID = 0, $strSiteID = false))

void ORDER_CALLBACK_FUNC(
 int PRODUCT_ID, 
int QUANTITY,
char renewal,
int $intUserID ,
string $strSiteID]
);

Функция вызывается на каждый товар в заказе. В случае если функция возвращает не пустой массив считается, что товар можно купить он попадает в заказ, если возвращает пустой массив, товар в заказ не попадает. Если функция ничего не возвращает или возвращает не массив, товар также попадает в заказ.

Параметры функции обратного вызова заказа

Название Описание
PRODUCT_ID Код товара, находящегося в корзине.
QUANTITY Количество товаров в корзине.
renewal Равен "Y", если функция вызывается для продления подписки, и "N" в остальных случаях.
$intUserID* ID пользователя. Если не задан, то берется текущий.
$strSiteID* Сайт, для которого идет работа с корзиной. Если параметр равен false, то берется текущий сайт.

* - параметры доступны, начиная с версии 12.0.

Пример создания функции обратного вызова заказа

<?
function MyBasketOrderCallback($PRODUCT_ID, $QUANTITY)
{
UpdateProductQuantity($PRODUCT_ID, $QUANTITY);
}
?>

Для отмены заказа

Функция обратного вызова для отмены заказа вызывается при отмене или удалении заказа. Она служит как правило для возвращения в продажу зарезервированого для заказа количества товара. В поле CANCEL_CALLBACK_FUNC записывается только имя функции обратного вызова заказа. Для некоторых модулей функции обратного вызова заказа уже написаны (например, для модуля catalog функция обратного вызова заказа называется CatalogBasketCancelCallback($PRODUCT_ID, $QUANTITY, $bCancel))

void CANCEL_CALLBACK_FUNC(
   int PRODUCT_ID, 
int QUANTITY,
bool bCancel );

Функция не возвращает значений.

Параметры функции обратного вызова заказа.

PRODUCT_ID равен true, если отменяется заказ, и false, если отменяется.

Название Описание
PRODUCT_ID Код товара, находящегося в корзине.
QUANTITY Количество товаров в корзине.
bCancel true, если отменяется заказ, и false, если отменяется.
Пример создания функции обратного вызова заказа

function MyBasketCancelCallback($PRODUCT_ID, $QUANTITY, $bCancel)
{
$PRODUCT_ID = IntVal($PRODUCT_ID);
$QUANTITY = IntVal($QUANTITY);
$bCancel = ($bCancel ? True : False);

if ($bCancel)
UpdateProductQuantity($PRODUCT_ID, -$QUANTITY);
else
UpdateProductQuantity($PRODUCT_ID, $QUANTITY);
}

При разрешении доставки

Функция обратного вызова при разрешении доставки вызывается при разрешении доставки заказа. Она может служить для привязки пользователя к каким-либо группам пользователей, для начисления на счет пользователя каких-либо сумм и для других действий, которые должны произойти в момент выполнения заказа. В поле PAY_CALLBACK_FUNC записывается только имя функции обратного вызова. Для некоторых модулей функции обратного вызова заказа уже написаны (например, для модуля catalog функция обратного вызова заказа называется CatalogPayOrderCallback($productID, $userID, $bPaid, $orderID))

array PAY_CALLBACK_FUNC(
    int productID, 
int userID,
bool bPaid,
int orderID );

Функция может вернуть одно из следующих значений:

  • массив для вставки в продление заказа;
  • true, если функция отработала успешно, но вставлять в продление ничего не надо;
  • false, если функция во время работы функции произошли ошибки.

Параметры функции обратного вызова при разрешении доставки


Название Описание
productID Код товара, находящегося в корзине.
userID Код пользователя, осуществившего заказ.
bPaid true, если доставка заказа разрешена, и false, если запрещена.
orderID Код заказа.
Пример создания функции обратного вызова

function MyBasketPayOrderCallback($productID, $userID, $bPaid, $orderID)
{
global $DB;

$productID = IntVal($productID);
$userID = IntVal($userID);
$bPaid = ($bPaid ? True : False);
$orderID = IntVal($orderID);

if ($userID <= 0)
return False;

if ($orderID <= 0)
return False;

if (!array_key_exists($productID, $GLOBALS["arMP3Sums"]))
return False;

if (!($arOrder = CSaleOrder::GetByID($orderID)))
return False;

$currentPrice = 10;
$currentCurrency = "USD";

if (!CSaleUserAccount::UpdateAccount($userID,
($bPaid ? $currentPrice : -$currentPrice),
$currentCurrency, "MANUAL", $orderID))
return False;

return True;
}


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