Последние темы


Разный шаг количества товаров в корзине

  • Всем доброго дня!

    Возникла необходимость сделать разный шаг изменения количества товаров в корзине. Например:

    Товар №1 продается только в количестве кратном 0.75
    Товар №2 продается только в количестве кратном 1 (как обычно)

    Когда два товара лежат рядом в корзине кнопки - и + должны изменять количество у товара №1: 0,75..1,5..3..и т.д. у второго соответственно 1..2..3 и т.д.

    Что пробовал:
    Создавал TV в котором указывал нужный мне шаг.
    В чанке shopCartRow создавал кнопки + и - вручную где присваивал value=[[созданное TV c шагом]]

    <td>
    
    <button class="shk_count_button" type="button" value="[[+shk_oneqnt]]">-</button>
    <input class="shk-count" size="2" name="count[]" maxlength="3" title="изменить количество" value="1" type="text">
    <button class="shk_count_button" type="button"  value="[[+shk_oneqnt]]">+</button>
    
    </td>
    

    Затем правил файл shopkeeper.js в блок "Добавляет кнопки управления счетчиком для поля" закомментил создание кнопок:

    /*
    el.css( { display: 'inline-block' } );
                        el.before( '<button class="shk_count_button ' + SHK.options.buttons_class + '" type="button">-</button>' );
                        el.after( '<button class="shk_count_button ' + SHK.options.buttons_class + '" type="button">+</button>' );
    */
    

    изменил функцию

    buttons.each( function( ii ){
    
                                $(this)
                                .click( function(){
                                        var cnt = parseInt( el.val() );
                                        if( ii == 0 && cnt > 1 ) el.val( cnt - parseFloat($(this).val()) );// тут вычитаю вместо единицы value 
                                        if( ii == 1 ) el.val( cnt + parseFloat($(this).val()) ); тут плюсую вместо единицы value
                                        if ( typeof callback == 'function' ) { callback( $(this) ); }
                                    }
                                );
    
                            }
    

    и результат в целом работает, но получается следующее:

    Первый клик работает как надо - плюсует или вычитает нужную мне цифру, но повторный клик плюсует или вычитает уже нужную мне цифру дважды. Полагаю что это связано с функцией callback, но довести до финала не получается. Подскажите пожалуйста как доработать уже сделанное, либо посоветуйте альтернативный вариант. Нагуглил похожую статью, но видимо содержимое shopkeeper.js сильно отличаются от описанного в этой статье. P.S. у меня Shopkeeper 3.2.5

  • Я бы отключил стандартный для SHK выбор количества и сделал обычное поле с типом "number".

    <input type="number" name="count[]" value="[[+count]]" step="[[+step]]">
    

    Вешать событие пересчета как-то так:

    $(document).on('change', '#shopCart input[name="count[]"]', function(){
        clearTimeout(window.timer);
        window.timer = setTimeout(SHK.recountItemAll.bind(SHK), 500);
    })
    
  • @Andchir спасибо, очень хороший вариант.

    В своем варианте тоже продолжил эксперименты, если кому то в будущем поможет, то работает такой "костыль":

    if ( el.next('button.shk_count_button').size() == 0 ) {
    
                        el.css( { display: 'inline-block' } );
                        var step = el.siblings(".oneqnt").html();//в чанке shopCartRow в одной ячейке рядом с инпутом это - <span class="oneqnt">[[+shk_oneqnt]]</span>, т.е. TV с шагом, само собой в css у него display:none
                        el.before( '<button class="shk_count_button ' + SHK.options.buttons_class + '"  value=" ' +step+ ' "  type="button">-</button>' );
                        el.after( '<button class="shk_count_button ' + SHK.options.buttons_class + '"  value=" ' +step+ ' "  type="button">+</button>' );
    
                        var buttons = el.parent().find('button.shk_count_button');
                        buttons.each( function( ii ){
    
                                $(this)
                                .click( function(){
                                        var cnt = parseFloat( el.val() );
                                        if( ii == 0 && cnt > 1 ) el.val( cnt - (parseFloat($(this).val())) );//вычитаем value кнопки
                                        if( ii == 1 ) el.val( cnt + (parseFloat($(this).val())) );//плюсуем value кнопки
                                        if ( typeof callback == 'function' ) { callback( $(this) ); }
                                    }
                                );
                            }
                        );
    

    В итоге в ручную создавать кнопки - и + как я писал в теме поста не нужно, они рисуются стандартным методом. Функцией .siblings() мы просто ищем элементы лежащие на одном уровне в ячейке таблицы с инпутом. И когда уже происходит создание кнопки в value ей вставляем значение переменной "step", т.е. нужный нам шаг. В результате после callback двойных срабатываний не будет.

 

Последние комментарии

  • @LoGruS

    А что, так можно было? 😂

    Это акция для VIP-клиентов. Тут чел серьезный, ведёт под десяток сайтов клиентов, читать ошибки ему не по касте 😉

    Читать далее
  • Участник @Andchir написал в Ошибка 500, помоги поймать источник:

    Если нужно, я сам могу установить бесплатно.

    А что, так можно было? 😂

    Читать далее
  • чисто случайно захожу

    Задал вопрос, а потом "чисто случайно" захожу. Хорошо когда есть на кого свалить вину.

    но с вашим скриптом что то не заладилось...

    Это обычный Symfony. По части установки там нет моих изобретений.

    это VPS на хецнере

    Тогда в чём проблема поправить open_basedir в php.ini? "Мой скрипт" должен Вам настроить php.ini?

    Читать далее
  • H

    Поздний ответ тк с вашего форума не приходят сообщения на мои посты - чисто случайно захожу и вижу ваши ответы. PS в настройках темы указано моментальное уведомление об ответах - или я тупой или форум не посылает сообщений.
    Это не хостинг - это VPS на хецнере, если бы не было опыта я бы не смог вести под десяток сойтов клиентов, но с вашим скриптом что то не заладилось...
    За предложение помощи спасибо - но не имею права давать доступ, надеюсь на понимание

    Читать далее