Округление количества товара и итоговая сумма

Собственно, вопрос — как при подсчете общего кол-ва и суммы в корзине использовать значение, измененное с помощью своих скриптов?

Пояснение:
Развивая тему о Количестве товара нецелым числом я добавил скрипт, который округляет введенное количество с определенным шагом.

Пример:
Одна единица товара это — 0,5 кв.м
Товар отпускается упаковками по 1,5 кв.м
Пользователь хочет купить 2 кв.м
Введенное количество округляется вверх до двух упаковок — 3 кв.м

А вот скрипт, который производит округление введенного количества в input при потере фокуса, к тому же пользователю разрешается вводить символы, буквы, пробелы, отрицательные значения, в любом случае, ему никогда не скажут, что он не прав, после обработки всегда получится число, пригодное для отправки в корзину:

$(document).ready(function() {
    
;(function() {
  var inp = $('.quantity'),
      value = $('.quantity').val();
      valueNumber = value.replace(/[^0-9.,]/gi, '');
      valueNum = valueNumber.replace(/,/g, '\.');
      valueN = valueNum.replace(/\.{2,}/g, '\.');
      valueF = parseFloat(valueN);

      calc = function() {
      var currentVal = $(this).val();
      currentValNumber = currentVal .replace(/[^0-9.,]/gi, '');
      currentValNum = currentValNumber.replace(/,/g, '\.');
      currentValN = currentValNum.replace(/\.{2,}/g, '\.');
      currentValF = parseFloat(currentValN);

      step = +$(this).attr('step'),
      val= +currentValF;
      if(isNaN(val) || val=='0' ){
          val=step;
      };
      if (valueF.toString() !== currentValF ) {
          valueF= Math.round((Math.ceil(val / step) * step) * 10) / 10;
          $(this).val(valueF);      
    }
};
  inp.blur(calc);  
}());
    
});

При добавлении в корзину на странице со списком товаров всё работает как надо.
Непосредственно в корзине округление тоже работает, но при подсчете общего количества итоговой суммы, которые выводятся в span ms2_total_count и ms2_total_cost используется введенное количество, а не округленное. (см. прикрепленный файл)

Может нужно просто как-то поменять очередность выполнения скриптов? Чтобы при потере фокуса сначала выполнялся мой скрипт, а затем скрипт подсчета общего итога?

К тому же, если в корзине в количество товара ввести 0 или символы, то эта позиция удаляется из корзины. Если же сначала будет выполняться мой скрипт, то при вводе символов подставится значение, равное минимальному шагу и позиция не удалится.
start.exe
18 октября 2014, 05:36
modx.pro
1 694
0

Комментарии: 10

Володя
18 октября 2014, 10:54
0
Так отправляйте в корзину округленное своим скриптом количество. А то у вас получается вы для пользователя показываете одно а в корзину кладете другое…
    start.exe
    18 октября 2014, 11:59
    0
    В корзину отправляется округленное, всё норм.
    На странице с корзиной кол-во при изменении тоже округляется, но итоговая сумма считается с неокругленными.

    На картинке:
    в корзине было 1,5 кв.м, изменил на 2, округлилость до 3, но в итого всё-равно 2
      Володя
      18 октября 2014, 18:49
      0
      кинь ссылку глянуть — проще будет подсказать. Но мое мнение — ты либо в корзину не то кол-во кидаешь, либо при изменении кол-ва траблы какие… чудес то не бывает.
        start.exe
        18 октября 2014, 22:17
        0
          Володя
          18 октября 2014, 22:55
          0
          joxi.ru/NDrlMl53SKXpmP
          ваш скрипт по округлению скорее всего после отрабатывает
          зы. Проще всего дать пользователю вводить данные в другом поле и на него навешивать всякие манипуляции… а в родное поле count передавать уже нужное значение и конфликтов не будет и отработает все по цепочке. Хотя хз может можно иначе но я так делаю…
            start.exe
            19 октября 2014, 00:39
            0
            Изменил форму в корзине, сделал так:
            <input class="quantity" value="[[+count]]" step="[[+weight]]" maxlength="5" /> м<sup>2</sup>
            <input class="cart-count" name="count" value="[[+count]]" type="hidden" />
            И добавил скрипт
            $(document).ready(function() {
            $('.quantity').blur(function(){
            value = $(this).val();
            $(this).next().next().val(value);
            }); 
            });
            В скрытый инпут передается округленное значение, но итоговая сумма теперь вообще не меняется.
              Володя
              19 октября 2014, 00:57
              0
              Значит данный код не передает значение в скрытый инпут
              start.exe
              19 октября 2014, 01:09
              0
              Оказывается, всё это можно заставить работать и без скрытого импута, просто нужно сделать видимой кнопку в форме
              <button value="cart/change" name="ms2_action" type="submit"></button>
              При нажатии на неё итоговая сумма будет пересчитываться с округленным значением.
              Только вот не очень удобно нажимать на эту кнопку рядом с каждым товаром в корзине.

              Событие cart/change, как-то же вызывается и при потере фокуса, ведь сумма меняется и без нажатия на кнопку, только вот значения не округленные… непонятненько…

      start.exe
      19 октября 2014, 11:58
      0
      Решил данный вопрос, добавив свой скрипт в файл assets/components/minishop2/js/web/default.js

      между строчками №168 и 169, вот так:

      ...
      
      ,initialize: function() {
      			miniShop2.Cart.setup();
      			if (!$(miniShop2.Cart.cart).length) return;
      			miniShop2.$doc.on('change', miniShop2.Cart.cart + ' ' + miniShop2.Cart.countInput, function() {
      
      // ОКРУГЛЕНИЕ КОЛИЧЕСТВА
      currentVal = $(this).val();
      currentValNumber = currentVal.replace(/[^0-9.,]/gi, '');
      currentValNum = currentValNumber.replace(/,/g, '\.');
      currentValN = currentValNum.replace(/\.{2,}/g, '\.');
      currentValF = parseFloat(currentValN);
      step = +$(this).attr('step');
      val = +currentValF;
            if(isNaN(val) || val=='0' ){
                val=step;
            }
      valR = Math.round((Math.ceil(val / step) * step) * 10) / 10;
      $(this).val(valR);
      // КОНЕЦ ОКРУГЛЕНИЕ КОЛИЧЕСТВА
      
      					$(this).closest(miniShop2.form).submit();
      				});
      
      ...
        Алексей Ерохин
        19 октября 2014, 13:55
        0
        При обновлении потрутся Ваши труды.
        Создайте другой файл, например, default2.js — копия оригинального файла с Вашей логикой и пропишите его использование в настройках minishop2
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        10