Замена input на select в корзине



  • Всем привет!
    Есть у меня задача, заменить input на select в корзине, в общем то я все сделал, отображается все норм и выводится.
    Но только Пересчет всех товаров в корзине перестал срабатывать на select.
    Облазил файл shopkeeper.js ища где и что подправить, но так и не определил, что именно нужно поправить.


  • Администраторы

    Я думаю надо просто вызвать такой код:

    $(document).on('change', '#shopCart select', SHK.recountItemAll);
    
    

    Селектор '#shopCart select' думаю сможете подправить сами, если потребуется.



  • @Andchir Пересчет действительно начал срабатывать, только он не подтягивал новое число из select.
    Пришлось вернуть input, скрыть его и изменять значение в нем по событию change select`а, затем вызывать для input событие keyup
    Кусочек кода, который может кому то пригодится:

    // #shk_prodCount - это скрытый input
    $(document).on('change', '#shopCart select', function(){
      var th = $('#shopCart select option:selected').val();
      $('#shk_prodCount').val(th);
      $('#shk_prodCount').keyup();
    });
    

    Оп, все не верно! Щас переделаю


  • Администраторы

    У селекта какой name? Надо поставить такой же как был у инпута.



  • @Andchir

    Кусочек кода, который может кому то пригодится (исправленый):

    $(document).on('change', '#shopCart select', function(){
      var value = $(this).find('option:selected').val(); // новое значение select
      var inpt = $(this).parent('.quantity').find('.shk-count'); // Скрытый input
      inpt.val(value);
      inpt.keyup();
    });
    

    @Andchir сказал Замена input на select в корзине:

    А селекта какой name? Надо поставить такой же как был у инпута.

    name="count[]"

    Это все ставил, тут дело еще в том, что select и input разные по своей сути. Если у input сразу можно значение получить, то у select`а надо искать селектор option:selected...
    В общем сейчас все норм работает без коренного изменения скрипта shopkeeper.js :)


  • Администраторы

    Если у input сразу можно значение получить, то у select`а надо искать селектор option:selected...

    Value берутся одинаково. На чистом JS:

    var value = select.value;
    

    На jQuery:

    var value = select.val();
    

    Демо: https://jsfiddle.net/p6sjp85s/

    И form.serialize() должен работать одинаково.



  • @Andchir сказал Замена input на select в корзине:

    Value берутся одинаково. На чистом JS:

    Хм, действительно:

    $(document).on('change', '#shopCart select', function(){
      var value = $(this).val(); // новое значение select
      var inpt = $(this).parent('.quantity').find('.shk-count'); // Скрытый input
      inpt.val(value);
      inpt.keyup();
    });
    

    Так тоже работает :)



  • @Andchir В общем сделав вывод, переделал скрипт.
    Тот код что выше убираем вообще и забываем.
    Далее в функции setCounterToField (файл shopkeeper.js) меняем:

    /*fields.filter(':text').each( function( i ){*/
    fields.filter('select').each( function( i ){
    

    А так же:

    /*el.bind('keyup',function(e){*/
    el.on('change',function(e){
    

    И в целом будет работать, хотя еще много чего можно выкинуть/закомментировать из этой функции.

    Функция полностью:

        /* Добавляет кнопки управления счетчиком для поля*/
    	setCounterToField: function( fields, callback ){
    		if ( fields.size() > 0 ) {
    			fields.filter('select').each( function( i ){
    				var el = $(this);
    				el.on('change',function(e){
    					if ( typeof callback == 'function' ) { callback( $(this) ); }
    				});
    			});
    		}
    	},
    


  • Да и в функции counterFieldCartInit

    //SHK.setCounterToField( $('[data-shopcart] input.shk-count'), callback );
    SHK.setCounterToField( $('[data-shopcart] select.shk-count'), callback );
    

  • Администраторы

    Видимо у вас задача заменить на селект не только в корзине, а везде. Я отвечал про случай, если только в корзине, этого должно быть достаточно.



Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.