У меня была подобная задача, решил ее я следующим образом:
1. ИБ, в котором элементами являются цвета, в превью картинке - картинка-образец цвета.
2. У товаров свойство "Цвет" типа "привязка к элементам в виде списка" множественное.
3. В шаблоне catalog.detail в файле result_modifier.php
Код |
---|
CModule::IncludeModule("catalog");
if(isset($arResult["DISPLAY_PROPERTIES"]["COLOR"])) {
$dbColors = CIBlockElement::GetList(array(), array("IBLOCK_ID" => 15, "ID" => $arResult["DISPLAY_PROPERTIES"]["COLOR"]["~VALUE"]), false, array("nTopCount" => count($arResult["DISPLAY_PROPERTIES"]["COLOR"]["~VALUE"])), array("IBLOCK_ID", "ID", "NAME", "PREVIEW_PICTURE"));
while($arColor = $dbColors->Fetch()) {
$arColorsPath[$arColor["ID"]] = CFile::GetPath($arColor["PREVIEW_PICTURE"]);
}
foreach ($arResult["DISPLAY_PROPERTIES"]["COLOR"]["~VALUE"] as $key => $value) {
$arResult["DISPLAY_PROPERTIES"]["COLOR"]["DESCRIPTION"][$key] = $arColorsPath[$value];
}
}
|
4. В самом шаблоне вывожу варианты цветов:
Код |
---|
if($isColor) {
?><div class="color-cont"><?
?><span class="color-name">Цвет: </span><?
foreach ($arResult["DISPLAY_PROPERTIES"]["COLOR"]["DESCRIPTION"] as $k => $colorSrc) {
?><img src="<?=$colorSrc?>" onclick="return setColor('<?=$arResult["ID"]?>', this.id);" id="<?=$arResult["DISPLAY_PROPERTIES"]["COLOR"]["VALUE"][$k]?>" title="<?=strip_tags($arResult["DISPLAY_PROPERTIES"]["COLOR"]["DISPLAY_VALUE"][$k])?>"> <?
}
?></div><?
}
if($arResult["CAN_BUY"]) {
?><div class="basketLinkCont">
<a href="#" onclick="return submitToCart('<?=$arResult["ID"]?>', '<?=$isColor?>');" id="putInBasket" class="basketLink"></a>
</div><?
} |
5. В header.php шаблона сайта:
Код |
---|
<script type="text/javascript">
cartSubmiting = false;
$(function() {
submitToCart = function(elId, colorId) {
if (cartSubmiting) return false;
cartSubmiting = true;
if(colorId == 1) {
alert("Вы не указали цвет");
cartSubmiting = false;
return false;
}
$.ajax({
type: "POST",
url: "/catalog/add2basket.php",
data: {
'action': 'ADD2BASKET',
'quantity': '1',
'id': elId,
'colorId' : colorId
}
}).done(function( data ) {
data = jQuery.parseJSON(data);
cartSubmiting = false;
if (!data.success) {
alert(data.message);
return;
}
$('.basket .count').html(data.count);
$('.basket .summ').html(data.summ);
});
return false;
}
setColor = function(elId, colorId) {
$('.color-cont img').each(function (i) {
$(this).removeClass('choosenColor');
});
$('#'+colorId).addClass('choosenColor');
html = '<a href="#" onclick="return submitToCart('+elId+', '+colorId+');" id="putInBasket" class="basketLink"></a>';
$('.basketLink').replaceWith(html);
return false;
}
});
</script>
|
Функция submitToCart - ajax-добавление товара в корзину.
Функция setColor - выбор цвета и замена html-ссылки по добавлению в корзину в которой дополнительным параметром передается id цвета.
6. Ajax-обработчик:
Код |
---|
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
try {
if (!CModule::IncludeModule("iblock") || !CModule::IncludeModule("sale") || !CModule::IncludeModule("catalog")) {
throw new Exception('Ошибка, обратитесь к администрации');
}
if (!array_key_exists("action", $_REQUEST) || !array_key_exists("id", $_REQUEST) || !intval($_REQUEST["id"])) {
throw new Exception('Некорректный запрос');
}
$id = intval($_REQUEST["id"]); // id нашего товара
$colorId = intval($_REQUEST["colorId"]); // id цвета
$isInBasket = false; // есть ли уже в корзине выбранный товар
$totalSumm = 0; // полная сумма всех товаров, находящихся в корзине (чтобы обновить мини корзинку в хедере)
$totalCount = 0; // полное количество всех товаров, находящихся в корзине (чтобы обновить мини корзинку в хедере)
// выберем все товары из корзины пользователя
// посмотрим есть ли там наш товар и посчитаем сумму и количество товаров
$dbBasket = CSaleBasket::GetList(
array("NAME" => "ASC"),
array("DELAY" => 'N', "CAN_BUY" => 'Y', "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
false, false, array("ID", "DELAY", "CAN_BUY", "QUANTITY", "PRODUCT_ID", "PRICE")
);
while ($arBasket = $dbBasket->Fetch()) {
// если айди товара равен айдишнику нашего товара, значит наш товар находится в корзине
if ($id == intval($arBasket["PRODUCT_ID"])) {
$isInBasket = true;
// если товар в корзине, значит мы нажали - Из корзины. Значит мы должны удалить его оттуда
// и не учитывать его количество и цену
if (!CSaleBasket::Delete($arBasket["ID"])) {
throw new Exception('Ошибка удаления из корзины');
}
continue;
}
$totalCount += $arBasket["QUANTITY"];
$totalSumm += $arBasket["QUANTITY"] * $arBasket["PRICE"];
}
// если товара не было в корзине, то добавляем его туда
if(!$isInBasket) {
$priceTypeId = 1;
$arProduct = CIBlockElement::GetList(array(), array("IBLOCK_ID" => 3, "ID" => $id), false, array("nTopCount" => 1), array("IBLOCK_ID", "NAME", "DETAIL_PAGE_URL", "CATALOG_GROUP_".$priceTypeId, "PROPERTY_COLOR.NAME"))->Fetch();
// Получаем цену товара с максимальной скидкой
$arPrice = CCatalogProduct::GetOptimalPrice(
$id,
1,
$USER->GetUserGroupArray(),
"N",
array(
array(
"ID" => $arProduct["CATALOG_PRICE_ID_".$priceTypeId],
"PRICE" => $arProduct["CATALOG_PRICE_".$priceTypeId],
"CURRENCY" => $arProduct["CATALOG_CURRENCY_".$priceTypeId],
"CATALOG_GROUP_ID" => $priceTypeId
)
)
);
if($colorId > 1) {
$arProps = array(
array(
"NAME" => "Цвет",
"CODE" => "COLOR",
"VALUE" => $arProduct["PROPERTY_COLOR_NAME"]
)
);
} else {
$arProps = array();
}
if(Add2Basket($arPrice["PRICE"]["ID"], 1, array(), $arProps)) {
$totalCount += 1;
$totalSumm += $arPrice["DISCOUNT_PRICE"];
} else {
throw new Exception('Ошибка добавления в корзину');
}
}
// возвращаем html для обновления корзины в шапке
echo json_encode(array('success' => true, 'count' => $totalCount, 'summ' => $totalSumm));
} catch (Exception $e) {
echo json_encode(array('success' => false, 'message' => $e->getMessage(), 'count' => 0, 'summ' => 0));
}
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>
|