Скидки в Битрикс, как кастомизировать стандартный шаблон в Битрикс
- Содержание:
- 1. Что же можно сделать?
- 2. 1. Использование catalog.section +catalog.item (переделать)
- 3. 2. Использовать catalog.section и делить на 2 типа товар со скидкой и товар без скидки
Cms 1С Битрикс очень богата функционалом. Но сам стандартный шаблон сделан так, что при его кастомизации возникает очень много вопросов. Также и при кастомизации корзины, и даже самого компонента sale.order.ajax. Ведь каждый проект имеет разные цели, разные задачи поэтому нужен индивидуальный подход.
Что же можно сделать?
Нашелся общий принцип работы с данной cms. В Битриксе в каталоге существует компонент catalog.section.
В этом компоненте вложен еще один компонент, catalog.item.
И этот компонент вызывается очень много раз (около 9) для каждого случая индивидуально.
Проще всего определить куда попадает компонент и вести кастомизацию для этого случая.
После кастомизации шаблона зачастую упускается возможность внедрения базового функционала.
Если не использовать связь catalog.section +catalog.item то можно очень сильно осложнить внедрение скидки в свой проект.
Можно конечно и пойти другим путем: разделить товар в catalog.section на товар со скидкой и товар без скидки и задавать свои стили.
Таким образом появилось 2 варианта:
1. Использование catalog.section +catalog.item (переделать)
В файле /catalog.item/.default/card/template.php нужно переделать верстку под себя, добавить свой функционал добавления в корзину.
Вывод скидки можно в файле /catalog.item/.default/card/template.php сделать примерно так:
<div class="production__image">
<a href="<?=$item['DETAIL_PAGE_URL']?>" title="<?=$imgTitle?>">
<img src="<?=$item['PREVIEW_PICTURE']['SRC']?>" id="<?=$itemIds['PICT']?>">
<?if($item["MIN_PRICE"]["DISCOUNT_DIFF"] > 0){?>
<div class="sale_new_img">
<span class="sale_procent_text" style="">%</span>
</div>
<div class="production__price" style="display: block; text-align: center;">
<span class="old-price" style="display: block;width: 100%;
color: #efefef;text-decoration: line-through;">
<?=$item["MIN_PRICE"]["PRINT_VALUE"]?> / т.</span>
<span class="new-price" style="display: block;">
<?=$item["MIN_PRICE"]["PRINT_DISCOUNT_VALUE"]?> / шт.</span>
</div>
<?}else{?>
<div class="production__price">
<?=$item["PROPERTIES"]["PRICE"]["VALUE"]." руб."?> / т.
</div>
<?}?>
</a>
</div>
В массиве $item["MIN_PRICE"]["DISCOUNT_DIFF"] нужно проверять значение больше ли оно нуля. Когда есть скидка, то Битрикс автоматически ставит скидку, которая больше 0.
И воспользовавшись этим, можно уже выводить свою скидку.
Также в самом шаблоне можно убрать лишний вывод ненужных свойств. Отключить добавление в корзину от Битрикс и написать уже свое добавление в корзину через ajax . Так будет намного проще и быстрее. Скрипт же шаблона по умолчанию разбирать можно очень долго. Возможно это устроит многих разработчиков, но времени на разбор уйдет очень много.
2. Использовать catalog.section и делить на 2 типа: товар со скидкой и товар без скидки
Данное решение отлично подходит когда на сайте используются торговые предложения.
В catalog.section/.default/template.php можно сделать следующим образом.
<?foreach($arResult["ITEMS"] as $cell=>$arElement):?>
<?
$this->AddEditAction($arElement['ID'], $arElement['EDIT_LINK'],
CIBlock::GetArrayByID($arParams["IBLOCK_ID"], "ELEMENT_EDIT"));
$this->AddDeleteAction($arElement['ID'], $arElement['DELETE_LINK'],
CIBlock::GetArrayByID($arParams["IBLOCK_ID"],
"ELEMENT_DELETE"),
array("CONFIRM" => GetMessage('CT_BCS_ELEMENT_DELETE_CONFIRM')));
?>
<?if (!empty($arElement["MIN_PRICE"]["DISCOUNT_DIFF_PERCENT"])):?>
<?//карточка товара со скидкой ?>
<div class="catalog-elem__card col-12 col-md-6 col-lg-3"
id="<?=$this->GetEditAreaId($arElement['ID']);?>">
<a href="<?=$arElement["DETAIL_PAGE_URL"]?>"
title="<?=$arElement["NAME"]?>">
<?//иконка скидки?>
<div class="red_sale">
<p class="sale_text_inner">
-<?=$arElement["MIN_PRICE"]["DISCOUNT_DIFF_PERCENT"]?>%
</p>
</div>
<div class="img-box">
<img src="<?=$arElement["PREVIEW_PICTURE"]["SRC"]?>"
alt="<?=$arElement["NAME"]?>">
</div>
<div class="text-box">
<span class="name">
<? echo $arElement["NAME"];?>
</span>
<div class="pricebl">
<?
$intIBlockID = 7;
$mxResult = CCatalogSKU::GetInfoByProductIBlock(
$intIBlockID
);
if (is_array($mxResult)) {
$rsOffers = CIBlockElement::GetList(
///array("PRICE"=>"ASC")
//сейчас в новой версии работает по другому
array("catalog_PRICE_1"=>"asc"),
array('IBLOCK_ID' => $mxResult['IBLOCK_ID'],
'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arElement["ID"]));
while ($arOffer = $rsOffers->GetNext()) {
$ar_price = GetCatalogProductPrice($arOffer["ID"], 1);
if(!empty($ar_price['PRICE']))
echo "<p class='old_price'>от ".$ar_price["PRICE"]." руб. </p>" ;
else if($arElement["MIN_PRICE"]["BASE_P"])
echo "<p class='old_price'>
от ".$arElement["MIN_PRICE"]["BASE_P"]." руб.
</p>" ;
break;
}
}
?>
<?if($arElement["PRICES"]["BASE"]["PRINT_VALUE"]){
echo "<p>".$arElement["PRICES"]["BASE"]["PRINT_VALUE"]."</p>" ;
}?>
<span class="new_price">от
<?=$arElement["MIN_PRICE"]["PRINT_DISCOUNT_VALUE"]?>
</span>
</div>
</div>
</a>
</div>
<?else:?>
<?//карточка товара без скидки ?>
<div class="catalog-elem__card col-12
col-md-6 col-lg-3" id="<?=$this->GetEditAreaId($arElement['ID']);?>">
<a href="<?=$arElement["DETAIL_PAGE_URL"]?>"
title="<?=$arElement["NAME"]?>">
<div class="img-box">
<img src="<?=$arElement["PREVIEW_PICTURE"]["SRC"]?>"
alt="<?=$arElement["NAME"]?>">
</div>
<div class="text-box">
<span class="name">
<? echo $arElement["NAME"];?>
</span>
<div class="pricebl">
<?
$intIBlockID = 7;
$mxResult = CCatalogSKU::GetInfoByProductIBlock(
$intIBlockID
);
if (is_array($mxResult)) {
$rsOffers = CIBlockElement::GetList(
array("PRICE"=>"ASC"),
array('IBLOCK_ID' => $mxResult['IBLOCK_ID'],
'PROPERTY_'.$mxResult['SKU_PROPERTY_ID'] => $arElement["ID"]));
while ($arOffer = $rsOffers->GetNext()) {
$ar_price = GetCatalogProductPrice($arOffer["ID"], 1);
echo "<p>от ".$ar_price["PRICE"]." руб. </p>" ;
break;
}
}
?>
<?if($arElement["PRICES"]["BASE"]["PRINT_VALUE"]){
echo "<p>".$arElement["PRICES"]["BASE"]["PRINT_VALUE"]."</p>" ;
}?>
</div>
</div>
</a>
</div>
<?endif;?>
<?endforeach;?>
Здесь в цикле делаются запросы. Это не очень хорошо если очень много товаров на сайте. Но если не особо принципиально, то для среднестатистического сайта вполне можно использовать и применять. Можно это сделать в result_modifier.php и в шаблоне компонента уже проверять имеется ли скидка. Так будет намного лучше. Но цель это показать как это можно применить.
В корзине (компонент sale.basket.basket) в Битриксе вывод скидки уже происходит, нужно только поменять отображение ее. В любом случае можно распечатать массив $arResult и посмотреть где находится скидка. Тоже самое можно сделать и в оформлении заказа (sale.order.ajax). Но в оформлении заказа есть один нюанс: там столько js кода, что лучше просто блок где выводится товар получить самостоятельно (по есть получить корзину пользователя и вывести все товары). И вывести скидку. Проще обойти, чем долго разбираться в куче js строчек кода.
Сами скидки устанавливаются в Маркетинг-Товарный маркетинг-Правила работы с корзиной или адрес сайта/bitrix/admin/sale_discount.php?lang=ru
Надеюсь статья открыла новое и была полезной.

Комментарии находятся на модерации или не добавлены.
Для добавления комментариев необходимо зарегистрироваться и авторизоваться
Также возможно авторизоваться через Социальную сеть Вконтакте (VK)