[ Веб-студия Александры Шеиной ]
Tilda
Стандартный блок
Кастомизация

Выбор подарков от суммы заказа в корзине на Tilda

В корзине появляется выбор подарков, когда сумма заказа достигает заданного значения. Сумма настраивается в коде, а количество доступных подарков автоматически увеличивается вместе с итоговой стоимостью заказа.

Например, если один подарок доступен за каждые 9 000 ₽, при заказе на 9 000 ₽ можно выбрать один подарок, на 18 000 ₽ — два, на 27 000 ₽ — три. Пока минимальная сумма не достигнута, поле выбора скрыто. Если сумма заказа уменьшается, количество выбранных подарков также автоматически ограничивается.
Артикул: 0008
❗️   ВАЖНО:   Чтобы код работал на вашем сайте проверьте, что у вас включен jQuery в настройках сайта.

  Настройки сайта   ⟶ Вкладка   Вставка кода   ⟶ Ставим галочку у «  Подключить jQuery на страницах сайта  »

1️⃣  ДОБАВЛЯЕМ БЛОК КОРЗИНЫ (ST100)
  • В корзине добавляем поле «Вопрос с вариантами ответа в виде картинок».
  • В поле «Имя переменной» впишите   podarok  
  • В «Изображения: варианты ответа» добавьте свои подарки — количество любое
  • «Обязательное поле» не включаем

2️⃣  НИЖЕ ВСТАВЛЯЕМ КОД
В коде найдите:
  const GIFT_STEP = 9000;  
и замените 9000 на сумму, за которую покупателю доступен 1 подарок.

❗️   ВАЖНО:   количество доступных подарков зависит от суммы корзины. Например, если указано 9000:
  • 9 300 ₽ → можно выбрать 1 подарок
  • 18 500 ₽ → можно выбрать 2 подарка
  • 27 000 ₽ → можно выбрать 3 подарка
Если сумма меньше 9 000 ₽, поле выбора подарка скрыто.
<!-- Добавить выбор подарка в корзине от определенной суммы
Веб-студия Александры Шеиной – https://sheina-studio.ru/ -->



<!-- ===== ИНФРМАЦИЯ =====
❗️   ВАЖНО:   Чтобы код работал на вашем сайте проверьте, что у вас включен jQuery в настройках сайта.

Настройки сайта   ⟶ Вкладка   Вставка кода   ⟶ Ставим галочку у «  Подключить jQuery на страницах сайта  »

1️⃣  ДОБАВЛЯЕМ БЛОК КОРЗИНЫ (ST100)
В корзине добавляем поле «  Вопрос с вариантами ответа в виде картинок  ».
В поле «  Имя переменной  » впишите   podarok  
В «Изображения: варианты ответа» добавьте свои подарки — количество любое
«Обязательное поле» не включаем

2️⃣  НИЖЕ ВСТАВЛЯЕМ КОД
В коде найдите:
  const GIFT_STEP = 9000;  
и замените 9000 на сумму, за которую покупателю доступен 1 подарок.

❗️   ВАЖНО:   количество доступных подарков зависит от суммы корзины. Например, если указано 9000:
9 300 ₽ → можно выбрать 1 подарок
18 500 ₽ → можно выбрать 2 подарка
27 000 ₽ → можно выбрать 3 подарка
Если сумма меньше 9 000 ₽, поле выбора подарка скрыто. -->



<script>
(function () {

    /* =====================================================
       НАСТРОЙКИ
    ===================================================== */

    // ❗️ МЕНЯТЬ СУММУ ЗДЕСЬ
    // Один подарок за каждые 9 000 ₽
    const GIFT_STEP = 9000;

    // Переменная поля в корзине
    const GIFT_FIELD_NAME = 'podarok';


    function parsePrice(text) {
        if (!text) return 0;

        const normalized = text
            .replace(/\s|\u00A0/g, '')
            .replace(',', '.')
            .replace(/[^\d.-]/g, '');

        return parseFloat(normalized) || 0;
    }


    function getCart() {
        return document.querySelector('.t706');
    }


    function getGiftField(cart) {
        if (!cart) return null;

        return Array.from(
            cart.querySelectorAll('.t-input-group')
        ).find(function (field) {
            return field.getAttribute('data-field-name') === GIFT_FIELD_NAME;
        }) || null;
    }


    function getCartTotal(cart) {
        if (!cart) return 0;

        const totalPrice = cart.querySelector(
            '.t706__cartwin-totalamount-wrap ' +
            '.t706__cartwin-prodamount-price'
        );

        if (totalPrice) {
            return parsePrice(totalPrice.textContent);
        }

        const subtotalPrice = cart.querySelector(
            '.t706__cartwin-bottom ' +
            '.t706__cartwin-prodamount-price'
        );

        if (subtotalPrice) {
            return parsePrice(subtotalPrice.textContent);
        }

        return 0;
    }


    function syncHiddenInput(giftField) {
        const hidden = giftField.querySelector(
            '.t-img-select__hiddeninput'
        );

        if (!hidden) return;

        const selected = Array.from(
            giftField.querySelectorAll('.t-img-select:checked')
        ).map(function (checkbox) {
            return checkbox.value;
        });

        hidden.value = selected.join(', ');

        hidden.dispatchEvent(
            new Event('input', {
                bubbles: true
            })
        );

        hidden.dispatchEvent(
            new Event('change', {
                bubbles: true
            })
        );
    }


    function clearGifts(giftField) {
        giftField
            .querySelectorAll('.t-img-select')
            .forEach(function (checkbox) {
                if (!checkbox.checked) return;

                checkbox.checked = false;

                checkbox.dispatchEvent(
                    new Event('change', {
                        bubbles: true
                    })
                );
            });

        syncHiddenInput(giftField);
    }


    function updateDisabledState(giftField, maxGifts) {
        const checkboxes = Array.from(
            giftField.querySelectorAll('.t-img-select')
        );

        const checkedCount = checkboxes.filter(function (checkbox) {
            return checkbox.checked;
        }).length;

        checkboxes.forEach(function (checkbox) {
            checkbox.disabled =
                !checkbox.checked &&
                checkedCount >= maxGifts;

            const item = checkbox.closest(
                '.t-img-select__item'
            );

            if (item) {
                item.style.opacity =
                    checkbox.disabled
                        ? '0.45'
                        : '';

                item.style.pointerEvents =
                    checkbox.disabled
                        ? 'none'
                        : '';
            }
        });
    }


    function updateGiftField() {
        const cart = getCart();

        if (!cart) return;

        const giftField = getGiftField(cart);

        if (!giftField) return;

        const total = getCartTotal(cart);

        let maxGifts = Math.floor(
            total / GIFT_STEP
        );

        const checkboxes = Array.from(
            giftField.querySelectorAll('.t-img-select')
        );

        maxGifts = Math.min(
            maxGifts,
            checkboxes.length
        );

        if (maxGifts < 1) {
            giftField.style.display = 'none';

            clearGifts(giftField);

            return;
        }

        giftField.style.display = '';

        const checked = checkboxes.filter(function (checkbox) {
            return checkbox.checked;
        });

        if (checked.length > maxGifts) {
            checked
                .slice(maxGifts)
                .forEach(function (checkbox) {
                    checkbox.checked = false;

                    checkbox.dispatchEvent(
                        new Event('change', {
                            bubbles: true
                        })
                    );
                });
        }

        syncHiddenInput(giftField);

        updateDisabledState(
            giftField,
            maxGifts
        );
    }


    document.addEventListener(
        'change',
        function (event) {

            if (
                !event.target.classList.contains('t-img-select')
            ) {
                return;
            }

            const giftField = event.target.closest(
                '.t-input-group'
            );

            if (
                !giftField ||
                giftField.getAttribute('data-field-name') !== GIFT_FIELD_NAME
            ) {
                return;
            }

            const cart = getCart();

            if (!cart) return;

            const total = getCartTotal(cart);

            const maxGifts = Math.floor(
                total / GIFT_STEP
            );

            const checked = Array.from(
                giftField.querySelectorAll('.t-img-select:checked')
            );

            if (checked.length > maxGifts) {
                event.target.checked = false;
            }

            syncHiddenInput(giftField);

            updateDisabledState(
                giftField,
                maxGifts
            );
        }
    );


    function init() {
        const cart = getCart();

        if (!cart) {
            setTimeout(init, 300);
            return;
        }

        updateGiftField();

        let timer;

        const observer = new MutationObserver(function () {
            clearTimeout(timer);

            timer = setTimeout(
                updateGiftField,
                50
            );
        });

        observer.observe(
            cart,
            {
                childList: true,
                subtree: true,
                characterData: true
            }
        );

        setTimeout(
            updateGiftField,
            500
        );
    }


    if (document.readyState === 'loading') {
        document.addEventListener(
            'DOMContentLoaded',
            init
        );
    } else {
        init();
    }

})();
</script>

Другие модификации для Tilda

Полезные статьи

Услуги студии

© 2026 Веб-студия Александры Шеиной
* Компания Meta Platforms Inc., владеющая социальными сетями Facebook и Instagram, по решению суда от 21.03.2022 признана экстремистской организацией, ее деятельность на территории России запрещена.
© 2026 Веб-студия Александры Шеиной
* Компания Meta Platforms Inc., владеющая социальными сетями Facebook и Instagram, по решению суда от 21.03.2022 признана экстремистской организацией, ее деятельность на территории России запрещена.
Как используется аналитика на сайте
Чтобы сайт работал стабильно и был удобным, мы используем технические данные и аналитику. Аналитика подключается только с вашего согласия и работает через Яндекс.Метрику и статистику Tilda. Подробнее — в Политике конфиденциальности.
Как используется аналитика на сайте
О работе сайта
Часть технических данных необходима для стабильной работы сайта и не может быть отключена. Аналитика используется только с вашего согласия и может быть настроена ниже.
Для работы сайта
Эти элементы нужны, чтобы сайт открывался корректно, работали страницы, формы и навигация. Они включены по умолчанию — без них сайт просто не сможет работать.
Аналитика сайта
Disabled
Помогает нам видеть, какие страницы смотрят чаще и что можно сделать удобнее. Используется Яндекс.Метрика и статистика Tilda. Включается только с вашего согласия.
Made on
Tilda