Не добавляются свойства товара в корзину с помощью метода Add2Basket, так же пробовал сделать это методами D7.
По клику на кнопку "в корзину" в детальной карточке, отправляется ajax запрос на /ajax/item.php где и происходит добавление товара в корзину. Прикладываю этот кусок кода.
Свой код пометил комментариями. Сразу скажу, что стандартный вариант передачи свойств товара в корзину через настройки компонента "каталог" мне не подходит для реализации моей задачи.
По клику на кнопку "в корзину" в детальной карточке, отправляется ajax запрос на /ajax/item.php где и происходит добавление товара в корзину. Прикладываю этот кусок кода.
Свой код пометил комментариями. Сразу скажу, что стандартный вариант передачи свойств товара в корзину через настройки компонента "каталог" мне не подходит для реализации моей задачи.
| Код |
|---|
if(!\Bitrix\Main\Loader::includeModule("sale") || !\Bitrix\Main\Loader::includeModule("catalog") || !\Bitrix\Main\Loader::includeModule("iblock") || !\Bitrix\Main\Loader::includeModule("aspro.next"))
{
echo "failure";
return;
}
if(!empty($_REQUEST["add_item"]))
{
if($_REQUEST["add_item"] == "Y")
{
if($_REQUEST["quantity"])
$_REQUEST["quantity"] = floatval($_REQUEST["quantity"]);
$product_properties=$arSkuProp=array();
$successfulAdd = true;
$strErrorExt='';
$dbBasketItems = CSaleBasket::GetList(
array("NAME" => "ASC", "ID" => "ASC"),
array("PRODUCT_ID" => $_REQUEST["item"], "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
false, false, array("ID", "DELAY")
)->Fetch();
if(!empty($dbBasketItems) && $dbBasketItems["DELAY"] == "Y")
{
$arFields = array("DELAY" => "N", "SUBSCRIBE" => "N");
if($_REQUEST["quantity"])
$arFields['QUANTITY'] = $_REQUEST["quantity"];
CSaleBasket::Update($dbBasketItems["ID"], $arFields);
}
else
{
$intProductIBlockID = (int)CIBlockElement::GetIBlockByID($_REQUEST["item"]);
if(0 < $intProductIBlockID)
{
if($_REQUEST["add_props"]=="Y"){
$arSkuProp=json_decode($_REQUEST["props"]);
if ($intProductIBlockID == $_REQUEST["iblockID"])
{
if($_REQUEST["props"])
{
$product_properties = CIBlockPriceTools::CheckProductProperties(
$_REQUEST["iblockID"],
$_REQUEST["item"],
$arSkuProp,
$_REQUEST["prop"],
$_REQUEST['part_props'] == 'Y'
);
if (!is_array($product_properties))
{
$strError = "CATALOG_PARTIAL_BASKET_PROPERTIES_ERROR";
$successfulAdd = false;
}
}else
{
$strError = "CATALOG_EMPTY_BASKET_PROPERTIES_ERROR";
$successfulAdd = false;
}
}else
{
$skuAddProps = (isset($_REQUEST['basket_props']) && !empty($_REQUEST['basket_props']) ? $_REQUEST['basket_props'] : '');
if ($arSkuProp || !empty($skuAddProps))
{
$product_properties = CIBlockPriceTools::GetOfferProperties(
$_REQUEST["item"],
$_REQUEST["iblockID"],
$arSkuProp,
$skuAddProps
);
}
}
}
}else
{
$strError = 'CATALOG_ELEMENT_NOT_FOUND';
$successfulAdd = false;
}
if($successfulAdd)
{
$arRewriteFields = array();
/* Мой код */
if ($_REQUEST['custom_props']){
// Вариант 1 - не работает
// $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite());
// $basketItem = $basket->createItem('catalog', $_REQUEST["item"]);
// $basketItem->setField('QUANTITY', $_REQUEST["quantity"]);
// $collection = $basketItem->getPropertyCollection();
//
// $item = $collection->createItem();
// $item->setFields([
// 'NAME' => 'Новое свойство',
// 'CODE' => 'XXX',
// 'VALUE' => 'Значение',
// ]);
//Вариант 2 - тоже не работает
Add2Basket('BASE', 2, array(), array(
array("NAME" => "Цвет", "CODE" => "CLR", "VALUE" => "красный"),
array("NAME" => "Размер", "VALUE" => "25")
)
);
}
/* / */
if(!Add2BasketByProductID($_REQUEST["item"], $_REQUEST["quantity"], $arRewriteFields, $product_properties))
{
if ($ex = $APPLICATION->GetException())
$strErrorExt = $ex->GetString();
$strError = "ERROR_ADD2BASKET";
$successfulAdd = false;
}
}
}
if ($successfulAdd)
$addResult = array('STATUS' => 'OK', 'MESSAGE' => 'CATALOG_SUCCESSFUL_ADD_TO_BASKET', 'MESSAGE_EXT' => $strErrorExt);
else
$addResult = array('STATUS' => 'ERROR', 'MESSAGE' => $strError, 'MESSAGE_EXT' => $strErrorExt);
if(class_exists('\Bitrix\Main\Web\Json'))
{
if(method_exists('\Bitrix\Main\Web\Json', 'encode'))
echo \Bitrix\Main\Web\Json::encode($addResult);
else
echo json_encode($addResult);
}
else
{
echo json_encode($addResult);
}
die();
}
} |