Взаимодействие торгового каталога и магазина
До версии 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;
}