Сейчас узнаем, какой подарок выпадет именно Вам
Крутите колесо
Как сделать разделы, игнорирующие применение промокода в Тильда

Как сделать разделы, игнорирующие применение промокода в Тильда

1
Создали каталог товаров с разделами, блок с товарами и корзину
2
Создали разделы и поместили в них товары, которые не должны участвовать в скидках промокода
3
Вставили код на страницу в блок Т123
  • в коде прописали нужные разделы 508492596383
если несколько, то через запятую вот так
['508492596383' , '5084925534534', '43546576765' ];
Библиотека для примера
<script>
(function() {
    const partUidsExceptions = ['508492596383'];
    let isOurFunctionInstalled = false;
    
    function customTcartCalcPromocode(t) {
        if ("object" != typeof window.tcart.promocode) {
            delete window.tcart.prodamount_discountsum;
            delete window.tcart.prodamount_withdiscount;
            return t;
        }
        
        if (!(window.tcart.promocode.discountsum > 0 || window.tcart.promocode.discountpercent > 0)) {
            console.error("Cart Some error.");
            return t;
        }
        
        var e = 0,
            r = 0,
            o = !1,
            a = window.tcart.prodamount;
        
        if (window.t_cart__discounts && window.t_cart__discounts.length > 0 && void 0 !== window.tcart.prodamount_withdyndiscount) {
            a = window.tcart.prodamount_withdyndiscount;
        }
        
        window.tcart.products.forEach((function(t) {
            if ("yes" !== t.deleted && 0 !== Object.keys(t).length) {
                var n = "",
                    i = t.price,
                    c = t.amount,
                    d = !1,
                    s = parseInt(t.portion, 10);
                
                if (window.t_cart__discounts && window.t_cart__discounts.length > 0 && void 0 !== t.amount_withdiscount) {
                    i = t.price_withdiscount;
                    c = t.amount_withdiscount;
                }
                
                if (t.portion) {
                    i /= s;
                    d = !0;
                    window.showdiscountdata && console.log("start price for one portion (" + t.portion + ") - " + i);
                }
                
                if (window.tcart.promocode.discountsum > 0) {
                    n = tcart_ceil(i * (1 - window.tcart.promocode.discountsum / a));
                } else if (window.tcart.promocode.discountpercent > 0) {
                    n = tcart_ceil(i * (1 - window.tcart.promocode.discountpercent / 100));
                }
                
                1 * t.quantity != 1 || t.portion || (o = !0);
                
                if (d && (window.showdiscountdata && console.log("For one portion: " + i + " -> " + n), n = tcart_ceil(n * s)));
                
                var l = tcart_ceil(n * t.quantity);
                e += tcart_ceil(c - l);
                r = tcart_ceil(1 * r + l);
                
                window.showdiscountdata && console.log((d ? i * t.portion : i) + " -> " + n + " = " + e);
            }
        }));
        
        e = tcart_ceil(e);
        
        if (window.tcart.promocode.discountsum > 0) {
            var n = 1 * window.tcart.promocode.discountsum - 1 * e;
            
            window.showdiscountdata && console.log(window.tcart.promocode.discountsum, e, n);
            o && n > 0 && (r = tcart_ceil(t - window.tcart.promocode.discountsum), e = window.tcart.promocode.discountsum);
        }
        
        const productsList = window.tcart.products;
        let exceptionsProductsSumm = 0;
        
        for(let i = 0; i < productsList.length; i++) {
            const cartProductPart = productsList[i]['part_uids'] ? productsList[i]['part_uids'].join() : '';
            
            for(let j = 0; j < partUidsExceptions.length; j++) {
                if(cartProductPart.includes(partUidsExceptions[j])) {
                    exceptionsProductsSumm += +productsList[i].amount;
                }
            }
        }
        
        if(window.tcart.promocode != undefined) {
            if(window.tcart.promocode.discountpercent != undefined && exceptionsProductsSumm > 0) {
                let percent = +window.tcart.promocode.discountpercent;
                e = tcart_ceil((t - exceptionsProductsSumm) * percent * 0.01);
                r = tcart_ceil(t - e);
            }
        }
        
        r < 0 && (r = 0);
        window.tcart.prodamount_discountsum = e;
        window.tcart.prodamount_withdiscount = r;
        window.tcart.promocode.prodamount_discountsum = e;
        
        var i = document.querySelector(".t-inputpromocode__wrapper .t706__cartwin-prodamount-price:nth-last-child(2)");
        i && (i.innerHTML = e);
        
        return r;
    }
    
    function installCustomFunction() {
        if (isOurFunctionInstalled) return;
        
        if (window.tcart && typeof window.tcart === 'object') {
            console.log('Устанавливаем кастомную функцию расчета промокода');
            
            window._originalTcartCalc = window.tcart__calcPromocode;
            window.tcart__calcPromocode = customTcartCalcPromocode;
            isOurFunctionInstalled = true;
            
            Object.defineProperty(window, 'tcart__calcPromocode', {
                configurable: false,
                writable: false,
                value: customTcartCalcPromocode
            });
            
            return true;
        }
        return false;
    }
    
    if (!installCustomFunction()) {
        const intervalId = setInterval(function() {
            if (installCustomFunction()) {
                clearInterval(intervalId);
            }
        }, 100);
        
        const observer = new MutationObserver(function(mutations) {
            if (window.tcart && typeof window.tcart === 'object') {
                installCustomFunction();
            }
            
            mutations.forEach(function(mutation) {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(function(node) {
                        if (node.nodeName === 'SCRIPT' && node.src && node.src.includes('tcart')) {
                            setTimeout(installCustomFunction, 100);
                        }
                    });
                }
            });
        });
        
        observer.observe(document.documentElement, {
            childList: true,
            subtree: true,
            attributes: true,
            attributeFilter: ['src']
        });
        
        let originalDefineProperty = Object.defineProperty;
        Object.defineProperty = function(obj, prop, descriptor) {
            if (obj === window && prop === 'tcart__calcPromocode' && !isOurFunctionInstalled) {
                return originalDefineProperty.call(Object, obj, prop, {
                    configurable: false,
                    writable: false,
                    value: customTcartCalcPromocode
                });
            }
            return originalDefineProperty.call(Object, obj, prop, descriptor);
        };
    }
    
    document.addEventListener('DOMContentLoaded', function() {
        installCustomFunction();
    });
    
    window.addEventListener('load', function() {
        installCustomFunction();
    });
    
    console.log('Скрипт перехвата функции корзины инициализирован');
})();
</script>
Made on
Tilda