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

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

1
Создали каталог товаров с разделами, блок с товарами и корзину
2
Создали разделы и поместили в них товары, которые не должны участвовать в скидках промокода
3
Вставили код на страницу в блок Т123
  • в коде прописали нужные разделы 508492596383
если несколько, то через запятую вот так
['508492596383' , '5084925534534', '43546576765' ];

Тестовый промокод D20
Mo-ti Level Up
Видео инструкции по добавлению кода и работе с Zero Block.
Как сделать разделы, игнорирующие применение промокода в Тильда
Фрагмент видео
Библиотека для примера
<script>
(function() {
    const partUidsExceptions = ['508492596383'];
    let isOurFunctionInstalled = false;
    
    function calculateDiscountWithExceptions(totalAmount, products, promo) {
        let exceptionsSum = 0;
        const productsList = products || window.tcart?.products || [];
        
        for(let i = 0; i < productsList.length; i++) {
            const product = productsList[i];
            if ("yes" === product.deleted || 0 === Object.keys(product).length) continue;
            
            const cartProductPart = product['part_uids'] ? product['part_uids'].join() : '';
            for(let j = 0; j < partUidsExceptions.length; j++) {
                if(cartProductPart.includes(partUidsExceptions[j])) {
                    exceptionsSum += +product.amount;
                    break;
                }
            }
        }
        
        if (exceptionsSum > 0) {
            if (promo?.discountpercent > 0) {
                const percent = +promo.discountpercent;
                const discountableAmount = totalAmount - exceptionsSum;
                const newDiscount = tcart_ceil(discountableAmount * percent / 100);
                const newTotal = tcart_ceil(totalAmount - newDiscount);
                
                return {
                    discount: newDiscount,
                    total: newTotal
                };
            }
            
            if (promo?.discountsum > 0) {
                const discountSum = +promo.discountsum;
                const discountableAmount = totalAmount - exceptionsSum;
                const newDiscount = Math.min(discountSum, discountableAmount);
                const newTotal = tcart_ceil(totalAmount - newDiscount);
                
                return {
                    discount: newDiscount,
                    total: newTotal
                };
            }
        }
        
        return null;
    }
    
    function updateDisplay(discount, total) {
        try {
            const elements = document.querySelectorAll(".t-inputpromocode__wrapper .t706__cartwin-prodamount-price");
            if (elements.length >= 2) {
                const lastElement = elements[elements.length - 2];
                if (lastElement) {
                    lastElement.innerHTML = discount;
                }
            }
            
            const totalElements = document.querySelectorAll(".t706__cartwin-totalamount");
            if (totalElements.length > 0 && total !== undefined) {
                totalElements.forEach(el => {
                    if (typeof tcart__showPrice === 'function') {
                        el.innerHTML = tcart__showPrice(total, "acceptzero");
                    } else {
                        el.innerHTML = total;
                    }
                });
            }
        } catch(e) {}
    }
    
    function interceptCartCalculatorPromocode() {
        if (!window.CartCalculator || !window.CartCalculator.prototype) {
            return false;
        }
        
        const proto = window.CartCalculator.prototype;
        
        if (typeof proto._calcPromocode !== 'function') {
            return false;
        }
        
        if (proto._calcPromocode._intercepted) {
            return true;
        }
        
        const originalCalcPromocode = proto._calcPromocode;
        
        proto._calcPromocode = function(totalAmount, cartData) {
            if (cartData?.promocode) {
                const promo = cartData.promocode;
                const hasDiscount = promo.discountsum > 0 || promo.discountpercent > 0;
                
                if (hasDiscount) {
                    const customResult = calculateDiscountWithExceptions(
                        totalAmount, 
                        cartData.products, 
                        promo
                    );
                    
                    if (customResult) {
                        cartData.prodamount_discountsum = customResult.discount;
                        cartData.prodamount_withdiscount = customResult.total;
                        cartData.promocode.prodamount_discountsum = customResult.discount;
                        
                        if (window.tcart) {
                            window.tcart.prodamount_discountsum = customResult.discount;
                            window.tcart.prodamount_withdiscount = customResult.total;
                            if (window.tcart.promocode) {
                                window.tcart.promocode.prodamount_discountsum = customResult.discount;
                            }
                        }
                        
                        updateDisplay(customResult.discount, customResult.total);
                        
                        return customResult.total;
                    }
                }
            }
            
            return originalCalcPromocode.call(this, totalAmount, cartData);
        };
        
        proto._calcPromocode._intercepted = true;
        return true;
    }
    
    function interceptCartCalculatorConstructor() {
        if (!window.CartCalculator) {
            return false;
        }
        
        if (window.CartCalculator._intercepted) {
            return true;
        }
        
        const OriginalCartCalculator = window.CartCalculator;
        
        window.CartCalculator = function(...args) {
            const instance = new OriginalCartCalculator(...args);
            
            if (instance && typeof instance._calcPromocode === 'function') {
                const originalInstanceCalc = instance._calcPromocode;
                
                instance._calcPromocode = function(totalAmount, cartData) {
                    if (cartData?.promocode) {
                        const promo = cartData.promocode;
                        const hasDiscount = promo.discountsum > 0 || promo.discountpercent > 0;
                        
                        if (hasDiscount) {
                            const customResult = calculateDiscountWithExceptions(
                                totalAmount, 
                                cartData.products, 
                                promo
                            );
                            
                            if (customResult) {
                                cartData.prodamount_discountsum = customResult.discount;
                                cartData.prodamount_withdiscount = customResult.total;
                                if (cartData.promocode) {
                                    cartData.promocode.prodamount_discountsum = customResult.discount;
                                }
                                if (window.tcart) {
                                    window.tcart.prodamount_discountsum = customResult.discount;
                                    window.tcart.prodamount_withdiscount = customResult.total;
                                }
                                updateDisplay(customResult.discount, customResult.total);
                                return customResult.total;
                            }
                        }
                    }
                    
                    return originalInstanceCalc.call(this, totalAmount, cartData);
                };
                
                instance._calcPromocode._intercepted = true;
            }
            
            return instance;
        };
        
        Object.assign(window.CartCalculator, OriginalCartCalculator);
        window.CartCalculator.prototype = OriginalCartCalculator.prototype;
        window.CartCalculator._intercepted = true;
        
        return true;
    }
    
    function installCustomFunction() {
        if (isOurFunctionInstalled) {
            return true;
        }
        
        interceptCartCalculatorConstructor();
        interceptCartCalculatorPromocode();
        
        isOurFunctionInstalled = true;
        
        setTimeout(function() {
            if (window.tcart__updateTotalProductsinCartObj) {
                window.tcart__updateTotalProductsinCartObj();
            } else if (window.tcart && window.cartCalculator) {
                window.cartCalculator.updateProductsData(window.tcart);
            }
        }, 300);
        
        return true;
    }
    
    var attempts = 0;
    var maxAttempts = 30;
    
    function tryInstall() {
        attempts++;
        
        if (installCustomFunction()) {
            return true;
        }
        
        if (attempts < maxAttempts) {
            setTimeout(tryInstall, 200);
        }
        return false;
    }
    
    setTimeout(tryInstall, 100);
    document.addEventListener('DOMContentLoaded', function() { setTimeout(tryInstall, 300); });
    window.addEventListener('load', function() { setTimeout(tryInstall, 300); });
    
})();
</script>
Made on
Tilda