Скидки в Битрикс, как кастомизировать стандартный шаблон в Битрикс

Cms 1С Битрикс очень богата функционалом. Но сам стандартный шаблон сделан так, что при его кастомизации возникает очень много вопросов. Также и при кастомизации корзины, и даже самого компонента sale.order.ajax. Ведь каждый проект имеет разные цели, разные задачи поэтому нужен индивидуальный подход.

Что же можно сделать?

Нашелся общий принцип работы с данной cms. В Битриксе в каталоге существует компонент catalog.section.

В этом компоненте вложен еще один компонент, catalog.item.

И этот компонент вызывается очень много раз (около 9) для каждого случая индивидуально.

Проще всего определить куда попадает компонент и вести кастомизацию для этого случая.

После кастомизации шаблона зачастую упускается возможность внедрения базового функционала.

Если не использовать связь catalog.section +catalog.item то можно очень сильно осложнить внедрение скидки в свой проект.

Можно конечно и пойти другим путем: разделить товар в catalog.section на товар со скидкой и товар без скидки и задавать свои стили.

Таким образом появилось 2 варианта:

  • 1. Использовать catalog.section +catalog.item (переделать под себя, приемлемый)
  • 2. Использовать 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

    установка скидки в админ панели битрикс

    Надеюсь статья открыла новое и была полезной.

    Интересные статьи по программированию:

    Уважаемый читатель!

    Ты можешь сделать проект Mirdeveloper.ru лучше!

    Написание статей требует много затрат, времени и сил, ресурсов, в том числе и денежных.

    Оставь чаевые, и будут новые статьи, и появятся видео.

    Это даст новые возможности в улучшении сайта

    Спасибо за то, что Вы с нами!


    Комментарии находятся на модерации или не добавлены.

    Для добавления комментариев необходимо зарегистрироваться и авторизоваться

    Также возможно авторизоваться через Социальную сеть Вконтакте (VK)