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

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

До версии 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-2024, «1С-Битрикс», 2024