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

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

До версии 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
Наверх