+7 (843) 212-62-17 - Казань
+7 (843) 212-62-17 - Казань

Новый вариант шаблона Битрикс (sale.order.ajax). Если компонент или шаблон оформления нестандартный, добавьте участки кода модуля бонусной системы. Эталон - шаблон new_logictim_bonus, который поставляется с модулем.

Сначала проверьте автоинтеграцию: корзина и оформление заказа. Для владельца без кода есть страница кастомный шаблон оформления.

Скрываем свойства заказа с бонусами

Файл: /bitrix/components/bitrix/sale.order.ajax/templates/new_logictim_bonus/order_ajax.js

В метод getPropertyRowNode: function(property, propsItemsContainer, disabled) перед строкой

propsItemsContainer.appendChild(propsItemNode);

вставьте условие (чтобы указанная строка попадала под него):

if(property.getSettings().CODE != 'LOGICTIM_ADD_BONUS' && property.getSettings().CODE != 'LOGICTIM_PAYMENT_BONUS')

Сколько бонусов списывают в итоге

В метод editTotalBlock: function() перед

if (this.options.showPayedFromInnerBudget)

вставьте:

<!--LOGICTIM_BONUS-->
//console.log(this.result.LOGICTIM_BONUS);
if(this.result.LOGICTIM_BONUS != null && this.result.LOGICTIM_BONUS.LOGICTIM_BONUS_USER_DOSTUP == 'Y')
{
    if(this.BXFormPosting == true)
    {
        var logictimPayBonus = this.result.LOGICTIM_BONUS.PAY_BONUS;
        var logictimPayBonusFormated = this.result.LOGICTIM_BONUS.PAY_BONUS_FORMATED;
        if(this.result.LOGICTIM_BONUS.INPUT_BONUS == '-')
        {
            logictimPayBonus = 0;
            this.result.TOTAL.ORDER_TOTAL_PRICE_FORMATED = this.result.LOGICTIM_BONUS.ORDER_SUM_FORMATED;
        }
    }
    else
    {
        var logictimPayBonus = this.result.LOGICTIM_BONUS.PAY_BONUS_NO_POST;
        var logictimPayBonusFormated = this.result.LOGICTIM_BONUS.PAY_BONUS_NO_POST_FORMATED;
    }

    if(logictimPayBonus >= 0)
    {
        var logictimPayBonusText = this.result.LOGICTIM_BONUS.TEXT_BONUS_PAY;

        if(logictimPayBonus > 0)
        this.totalInfoBlockNode.appendChild(this.createTotalUnit(logictimPayBonusText, '<span>'+logictimPayBonusFormated+'</span>'));

        var orderPropPaymentBonusId = this.result.LOGICTIM_BONUS.ORDER_PROP_PAYMENT_BONUS_ID;

        if(BX('LOGICTIM_PAYMENT_BONUS'))
        {
            if(BX('LOGICTIM_PAYMENT_BONUS').name != 'ORDER_PROP_'+orderPropPaymentBonusId)
            {
                BX.adjust(BX('LOGICTIM_PAYMENT_BONUS'), {attrs: {name: 'ORDER_PROP_'+orderPropPaymentBonusId}});
            }

            var logictimPayInput = BX('LOGICTIM_PAYMENT_BONUS').value;
            BX('LOGICTIM_PAYMENT_BONUS').value = logictimPayBonus;
        }
    }
}
<!--LOGICTIM_BONUS-->

Сколько бонусов начислится за заказ

В тот же метод editTotalBlock после блока

if (parseFloat(total.PAY_SYSTEM_PRICE) >= 0 && this.result.DELIVERY.length)
{
	this.totalInfoBlockNode.appendChild(this.createTotalUnit(BX.message('SOA_PAYSYSTEM_PRICE'), '~' + total.PAY_SYSTEM_PRICE_FORMATTED));
}

вставьте:

<!--LOGICTIM_BONUS-->
if(this.result.LOGICTIM_BONUS && this.result.LOGICTIM_BONUS.LOGICTIM_BONUS_USER_DOSTUP == 'Y') {
	var logictimAddBonusText = this.result.LOGICTIM_BONUS.TEXT_BONUS_BALLS;
	if(this.result.LOGICTIM_BONUS.ADD_BONUS > 0)
		this.totalInfoBlockNode.appendChild(this.createTotalUnit(logictimAddBonusText, '<span>'+this.result.LOGICTIM_BONUS.ADD_BONUS+'</span>'));

	var lb_pay_block = BX('logictim_payfield_bonus');
	if(this.result.LOGICTIM_BONUS.MAX_BONUS <= 0 && BX('logictim_payfield_bonus'))
		BX.hide(lb_pay_block);
	if(this.result.LOGICTIM_BONUS.MAX_BONUS > 0 && BX('logictim_payfield_bonus'))
	{
		BX.show(lb_pay_block);
		BX('LOGICTIM_PAYMENT_BONUS').value = logictimPayBonus;
	}
}
<!--LOGICTIM_BONUS-->

В актуальном шаблоне new_logictim_bonus из модуля блок начисления может быть короче (без hide/show поля) - ориентируйтесь на код вашего шаблона и эталон в модуле.

Начисление за каждую позицию

В метод createBasketItemColumn: function(column, allData, active) после ветки колонки SUM (после вывода цены и старой цены) вставьте:

<!--LOGICTIM_BONUS-->
if(this.result.LOGICTIM_BONUS && this.result.LOGICTIM_BONUS.LOGICTIM_BONUS_USER_DOSTUP == 'Y') {
    if(this.result.LOGICTIM_BONUS.ARR_BONUS)
       var add_bonus_item = this.result.LOGICTIM_BONUS.ARR_BONUS.ITEMS[data.PRODUCT_ID].ADD_BONUS;
    if(add_bonus_item > 0)
    {
        textNode.appendChild(BX.create('div', {props: {className: 'bonus'}, html: '+'+add_bonus_item+' '+this.result.LOGICTIM_BONUS.TEXT_BONUS_FOR_ITEM}));
    }
}
<!--LOGICTIM_BONUS-->

Поле оплаты бонусами в template.php

Файл: .../templates/new_logictim_bonus/template.php

Перед блоком <!-- ORDER SAVE BLOCK --> вставьте:

<? //-------LOGICTIM BONUS FEILD-------//?>

<? if(isset($arResult["PAY_BONUS"]) && $arResult["PAY_BONUS"] >= 0 && $arResult["USER_BONUS"] > 0) :?>
<div id="bonus_payment_block" class="bx-soa-section">
	<div class="bx-soa-section-title-container">
		<h2 class="bx-soa-section-title col-sm-9">
			<span class="bx-soa-section-title-count"></span>Оплата бонусами
		</h2>
	</div>
	<div class="bx-soa-section-content">
		<div class="bonus_comment">
			<strong><?=COption::GetOptionString("logictim.balls", "HAVE_BONUS_TEXT", 'Have bonus')?>  <?=$arResult["USER_BONUS"]?></strong>
			<? if($arResult["MIN_BONUS"] > 0) {?>
				<span><br><?=COption::GetOptionString("logictim.balls", "MIN_BONUS_TEXT", 'Min use bonus').$arResult["MIN_BONUS"];?></span>
			<? }?>
			<? if($arResult["MAX_BONUS"] > 0) {?>
			<span><br><?=COption::GetOptionString("logictim.balls", "MAX_BONUS_TEXT", 'Max use bonus').$arResult["MAX_BONUS"];?></span>
			<? }?>
			<div><br></div></div>
			<div id="bonus_payfield_block">
				<strong><?=COption::GetOptionString("logictim.balls", "PAY_BONUS_TEXT", 'Pay from bonus')?></strong>
				<div class="bx-soa-coupon-input">
					<input type="text" id="LOGICTIM_PAYMENT_BONUS" class="form-control bx-ios-fix" onchange="BX.Sale.OrderAjaxComponent.sendRequest();" value="<?=$arResult["PAY_BONUS"]?>" name="ORDER_PROP_<?=$arResult["ORDER_PROP_PAYMENT_BONUS_ID"]?>">
				</div>
			</div>
		</div>
   </div>
<? endif;?>

<? //-------LOGICTIM BONUS FEILD-------//?>

В старой инструкции в onchange иногда указан RS.Sale.OrderAjaxComponent.sendRequest() - в эталоне модуля используется BX.Sale.OrderAjaxComponent.sendRequest(). Берите вызов, который соответствует вашему шаблону.

Стили

В style.css и style.min.css добавьте:

.logictim_bonus_input_block .lg_description span{font-size:12px;color:#a3a3a3;}

Начисление по позициям через PHP (CartBonus)

Если нужно показать начисление за позиции средствами PHP (например в summary), используйте:

$arBonus = cHelperCalc::CartBonus($arResult["BASKET_ITEMS"]);
	//За единицу товара
	$arBonus["ITEMS"][$arItem["PRODUCT_ID"]]["ADD_BONUS_UNIT"];
	//За все количество товара
	$arBonus["ITEMS"][$arItem["PRODUCT_ID"]]["ADD_BONUS"];
	//За всю корзину
	$arBonus["ALL_BONUS"];
<? //На страницу оформления заказа (sale.order.ajax / шаблон / summary.php)
CModule::IncludeModule('logictim.balls');
$arBonus = cHelperCalc::CartBonus($arResult["BASKET_ITEMS"]);
?>
<?
//За единицу товара
if($arBonus["ITEMS"][$arItem["PRODUCT_ID"]]["ADD_BONUS_UNIT"] > 0) {?>
    <div class="bonus">
        + <?=$arBonus["ITEMS"][$arItem["PRODUCT_ID"]]["ADD_BONUS_UNIT"];?> <?=COption::GetOptionString("logictim.balls", "TEXT_BONUS_FOR_ITEM", '')?>
    </div>
<? }?>
<?
//За все количество товара
if($arBonus["ITEMS"][$arItem["PRODUCT_ID"]]["ADD_BONUS"] > 0) {?>
    <div class="bonus">
        + <?=$arBonus["ITEMS"][$arItem["PRODUCT_ID"]]["ADD_BONUS"];?> <?=COption::GetOptionString("logictim.balls", "TEXT_BONUS_FOR_ITEM", '')?>
    </div>
<? }?>
<?
//За всю корзину
if($arBonus["ALL_BONUS"] > 0) {?>
    <div class="bonus">
        + <?=$arBonus["ALL_BONUS"];?> <?=COption::GetOptionString("logictim.balls", "TEXT_BONUS_FOR_ITEM", '')?>
    </div>
<? }?>

Смотрите также: старый шаблон, кастомная корзина.