OC v2.х Помогите с JS в Simple

val06

Разрушитель (V)
Сообщения
240
Реакции
64
Баллы
705
Добрый день, делаю кратность добавления товара, есть модули кратности, они работают по минималке, то есть установлен минимум товара 4, то и кратность будет 4, у меня задача, что бы добавление не зависело от минималки, к примеру минималка 4, а добавление кратно 1.6, то есть кратность добавления можно выставить любую в карточке товара. На фронте все сделал. работает, а с симплой затык, я с js не особо, а тут вообще не мгу понять почему работает не так как вроде бы должно быть (
Нашел в js симплы код
JavaScript:
 this.decreaseProductQuantity = function($target) {
            var self = this;

            var $quantity = $target.parents(".quantity").find("input");
            var quantity = parseFloat($quantity.val());
            var step = +$quantity.attr("data-minimum") || 1;

            if (!isNaN(quantity) && quantity > step) {
                $quantity.val(quantity - step);

                self.copyCartState($quantity);

                if (self.timerId) {
                    clearTimeout(self.timerId);
                    self.timerId = 0;
                }

                self.timerId = window.setTimeout(function() {
                    self.reloadAll();
                }, 300);
            }
        };
в tpl ку симлы добавил параметр data-next="1.6" дописал в код var next = $quantity.attr("data-next") || 0; проверил по логам все нормально, значение передается, а вот дальше бред какой то, уже прописал тупо сложение
JavaScript:
if (!isNaN(quantity)) {
                if (next > 0) {
                quantity = quantity + next;
                console.log(quantity);
по логам quantity = 4, next = 1.6, т есть по логике quantity должно быть - 5.6, но в console.log(quantity) = 41.6, что не так, почему значения не суммируются, а прилепляются одно к другому ? ((((
 
День добрый. К сожалению, мое сообщение может быть с опозданием.
почему значения не суммируются, а прилепляются одно к другому ?
это происходит потому, что значения (одно или оба) интерпретируются как строки.
Нужно записать так
JavaScript:
quantity = Number(quantity) + Number(next);
 
Добрый день, делаю кратность добавления товара, есть модули кратности, они работают по минималке, то есть установлен минимум товара 4, то и кратность будет 4, у меня задача, что бы добавление не зависело от минималки, к примеру минималка 4, а добавление кратно 1.6, то есть кратность добавления можно выставить любую в карточке товара. На фронте все сделал. работает, а с симплой затык, я с js не особо, а тут вообще не мгу понять почему работает не так как вроде бы должно быть (
Нашел в js симплы код
JavaScript:
 this.decreaseProductQuantity = function($target) {
            var self = this;

            var $quantity = $target.parents(".quantity").find("input");
            var quantity = parseFloat($quantity.val());
            var step = +$quantity.attr("data-minimum") || 1;

            if (!isNaN(quantity) && quantity > step) {
                $quantity.val(quantity - step);

                self.copyCartState($quantity);

                if (self.timerId) {
                    clearTimeout(self.timerId);
                    self.timerId = 0;
                }

                self.timerId = window.setTimeout(function() {
                    self.reloadAll();
                }, 300);
            }
        };
в tpl ку симлы добавил параметр data-next="1.6" дописал в код var next = $quantity.attr("data-next") || 0; проверил по логам все нормально, значение передается, а вот дальше бред какой то, уже прописал тупо сложение
JavaScript:
if (!isNaN(quantity)) {
                if (next > 0) {
                quantity = quantity + next;
                console.log(quantity);
по логам quantity = 4, next = 1.6, т есть по логике quantity должно быть - 5.6, но в console.log(quantity) = 41.6, что не так, почему значения не суммируются, а прилепляются одно к другому ? ((((
попробуй так

JavaScript:
// Функция УМЕНЬШЕНИЯ количества товара (кнопка Минус)
        this.decreaseProductQuantity = function($target) {
            var self = this;

            var $quantity = $target.parents(".quantity").find("input");
            var quantity = parseFloat($quantity.val());
           
            // Получаем минималку и шаг, обязательно переводим в числа
            var min = parseFloat($quantity.attr("data-minimum")) || 1;
            var step = parseFloat($quantity.attr("data-next")) || 1;

            // Вычитаем только если текущее количество больше минимального
            if (!isNaN(quantity) && quantity > min) {
                var newQuantity = quantity - step;
               
                // Если после вычитания получилось меньше минималки, приравниваем к минималке
                if (newQuantity < min) {
                    newQuantity = min;
                }

                // Округляем до 3 знаков, чтобы отсечь баги дробей JS, и записываем в инпут
                $quantity.val(parseFloat(newQuantity.toFixed(3)));

                self.copyCartState($quantity);

                if (self.timerId) {
                    clearTimeout(self.timerId);
                    self.timerId = 0;
                }

                self.timerId = window.setTimeout(function() {
                    self.reloadAll();
                }, 300);
            }
        };

        // Функция УВЕЛИЧЕНИЯ количества товара (кнопка Плюс)
        this.increaseProductQuantity = function($target) {
            var self = this;

            var $quantity = $target.parents(".quantity").find("input");
            var quantity = parseFloat($quantity.val());
           
            // Получаем шаг добавления
            var step = parseFloat($quantity.attr("data-next")) || 1;
           
            // Получаем максимальный остаток (если в вашей версии Симплы есть data-max, иначе можно удалить эти строки)
            var max = parseFloat($quantity.attr("data-max"));

            if (!isNaN(quantity)) {
                var newQuantity = quantity + step;
               
                // Проверка на максимальное количество на складе (если атрибут существует)
                if (!isNaN(max) && newQuantity > max) {
                    newQuantity = max;
                }

                // Округляем до 3 знаков и записываем
                $quantity.val(parseFloat(newQuantity.toFixed(3)));

                self.copyCartState($quantity);

                if (self.timerId) {
                    clearTimeout(self.timerId);
                    self.timerId = 0;
                }

                self.timerId = window.setTimeout(function() {
                    self.reloadAll();
                }, 300);
            }
        };
 
Последнее редактирование:
День добрый. К сожалению, мое сообщение может быть с опозданием.

это происходит потому, что значения (одно или оба) интерпретируются как строки.
Нужно записать так
JavaScript:
quantity = Number(quantity) + Number(next);
спасибо понял
Еще вариант попробуй заменить в симпле install\catalog\view\javascript\simplecheckout.js полностью код на этот
Скачай и попробуй https://mega.nz/file/awd3lIzC#SNHi4fjdHtOZHWWLhsO03qbQdYYyLKKYLZfGTRH0S1s
спасибо. попробую все что ты предложил после выходных.
 
Назад
Верх