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