Перейти к содержимому


"нет В Наличии" Когда У Товара Несколько Модификаций


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 OPEX

OPEX

    Пользователь

  • Пользователи
  • PipPip
  • 16 сообщений

Отправлено 18 Август 2014 - 11:01

Здравствуйте. У меня возникла проблема решение которой на форуме не нашел. Проблема:
У товара несколько модификаций (в моем случае вкус) какие то модификации есть в наличии каких то нет. Но когда посетитель сайта переходит на страницу товара то у товара автоматически выбирается модификация, которой нет в наличии (как я понимаю потому что она была создана первой) и соответственно у товара надпись "Нет в наличии" . У посетителя складывается впечатление. что товара нет вообще. Можно ли сделать так чтобы первой у товар выводилась модификация которая есть в наличии или которой самое большое количество?

#2 Vaccina

Vaccina

    Активный участник

  • Модераторы
  • 24 353 сообщений

Отправлено 19 Август 2014 - 01:51

изначально по умолчанию выбрана модификация с наименьшей ценой, у нас на форуме уже обсуждался аналогичный вопрос и имеется инструкция по реализации вывода активной модификации, которая изначально есть в наличии:
http://forum.storela...ся-модификация/

также в настройках можно поставить галочку напротив "не выводить товары, которых нет в наличии"

и еще как вариант, если товара нет в наличии при выборе модификации, то скрываем кнопку покупки

#3 OPEX

OPEX

    Пользователь

  • Пользователи
  • PipPip
  • 16 сообщений

Отправлено 19 Август 2014 - 08:52

Просмотр сообщенияVaccina (19 Август 2014 - 01:51) писал:

изначально по умолчанию выбрана модификация с наименьшей ценой, у нас на форуме уже обсуждался аналогичный вопрос и имеется инструкция по реализации вывода активной модификации, которая изначально есть в наличии:
http://forum.storela...ся-модификация/

также в настройках можно поставить галочку напротив "не выводить товары, которых нет в наличии"

и еще как вариант, если товара нет в наличии при выборе модификации, то скрываем кнопку покупки

Сделал как там описано. Отсутствующие модификации стали серого цвета но по умолчанию выбирается все равно ответствующая.
http://shop4fit.ru/g...-1-kg?from=YWJm

#4 Vaccina

Vaccina

    Активный участник

  • Модераторы
  • 24 353 сообщений

Отправлено 20 Август 2014 - 01:56

Переделайте пожалуйста структуру, у вас ниже блоки "поехали", синтаксис где-то в коде нарушили, в Opera модификации, которых нет в наличии не выбираются, но отображаются.

#5 OPEX

OPEX

    Пользователь

  • Пользователи
  • PipPip
  • 16 сообщений

Отправлено 20 Август 2014 - 08:30

Просмотр сообщенияVaccina (20 Август 2014 - 01:56) писал:

Переделайте пожалуйста структуру, у вас ниже блоки "поехали", синтаксис где-то в коде нарушили, в Opera модификации, которых нет в наличии не выбираются, но отображаются.

Не совсем понял, что значит блоки "поехали". И не вижу где синтаксис нарушен, я просто скопировал и вставил в конец main.js:
$(function() {
  setTimeout(function() {
         var maxprice = 0;
         $('.goodsDataMainModificationsList').each(function() {
                var rest = parseInt($(this).find('[name="rest_value"]').val());
                var price = parseFloat($(this).find('[name="price_now"]').val());
                if(rest && price > maxprice) {
                  maxprice = price;
                  var id = $(this).attr('rel').split('_');
                  var block = $('.goodsDataMainModificationsBlockProperty');
                  $('.goodsDataMainModificationsBlockProperty select option').removeAttr('selected');
                  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').attr('selected', 'selected');
                  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[1] + '"]').attr('selected', 'selected');
                  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').parent().trigger('change');
                }
         });
  }, 600);
});


Подскажите, пожалуйста, что нужно сделать чтобы автоматически выбиралась модификация которая есть в наличии. Как я понял, для этого нужно вставить код который я вставил в конец  main.js получается либо код не работает либо я его "криво" вставил?


Вот код:

// Отправляет ошибку на сервер, для того, чтобы служба тех поддержки могла разобраться в проблеме как можно быстрее.
function sendError (desc, page, line) {
  var img=document.createElement('img');
  img.src = 'http://storeland.ru/...IComponent(desc)+'&page='+encodeURIComponent(window.location)+'&line=0';
  img.style.position = 'absolute';
  img.style.top = '-9999px';

  try { document.getElementsByTagName('head').appendChild(img) } catch (e){}
  return false;
}

// Форматирует цену
function number_format(number,decimals,dec_point,thousands_sep){var n=number,prec=decimals;var toFixedFix=function(n,prec){var k=Math.pow(10,prec);return(Math.round(n*k)/k).toString();};n=!isFinite(+n)?0:+n;prec=!isFinite(+prec)?0:Math.abs(prec);var sep=(typeof thousands_sep==='undefined')?',':thousands_sep;var dec=(typeof dec_point==='undefined')?'.':dec_point;var s=(prec>0)?toFixedFix(n,prec):toFixedFix(Math.round(n),prec);var abs=toFixedFix(Math.abs(n),prec);var _,i;if(abs>=1000){_=abs.split(/\D/);i=_[0].length%3||3;_[0]=s.slice(0,i+(n<0))+
_[0].slice(i).replace(/(\d{3})/g,sep+'$1');s=_.join(dec);}else{s=s.replace('.',dec);}
var decPos=s.indexOf(dec);if(prec>=1&&decPos!==-1&&(s.length-decPos-1)<prec){s+=new Array(prec-(s.length-decPos-1)).join(0)+'0';}
else if(prec>=1&&decPos===-1){s+=dec+new Array(prec).join(0)+'0';}
return s;}

// Превращает поле пароля в текстовое поле и обратно
// @LinkObject - ссылка по которой кликнули
// @InputObject - объект у которого нужно изменить тип поля
function ChangePasswordFieldType (LinkObject, InputObject) {
  var
    // Ссылка по которой кликнули
    LObject = $(LinkObject),
    // Объект у которого изменяем тип с password на text
    IObject = $(InputObject),
    // Старый текст ссылки
    txtOld = LObject.text(),
    // Новый текст ссылки
    txtNew = LObject.attr('rel');

  // Если объекты не получены, завершим работу функции
  if( LObject.length==0 || IObject.length==0 ) {
    return false;
  }

  // Изменяем у ссылки текст со старого на новый
  LObject.html(txtNew);
  // Старый текст ссылки сохраняем в атрибуте rel
  LObject.attr('rel', txtOld);

  // Изменяем тип input поля
  if(IObject[0].type == 'text') {
    IObject[0].type = 'password';
  } else {
    IObject[0].type = 'text';
  }
}

// Крутит изображение при обновлении картинки защиты от роботов
function RefreshImageAction(img,num,cnt) {
  if(cnt>13) {
    return false;
  }

  $(img).attr('src', $(img).attr('rel') + 'icon/refresh/' + num + '.gif');
  num = (num==6)?0:num;
  setTimeout(function(){RefreshImageAction(img, num+1, cnt+1);}, 50);
}

$(document).ready(function(){

  // Валидация формы на странице оформления заказа, а так же формы на страницы связи с администрацией
  $('.order form, .feedbackForm, .clientForm, .goodsDataOpinionAddForm').submit(function(){
    if($(this).valid()) {
      // Кнопка отправки формы
      SubmitButton = $(this).find('input:submit, button:submit');
      // Если кнопку уже нажали, видимо отправка формы производилась по нажатию на кнопку enter, не допускаем этого.
      if($(SubmitButton.get(0)).attr('disabled')) {
        return false;
      }
      // Устанавливаем на кнопку отправки формы блокировку повторной оптравки
      SubmitButton.attr('disabled', true);
      // Через 10 секунд блокировка отправки формы снимается.
      setTimeout('SubmitButton.attr("disabled", false);', 10000);
    }
  }).validate();

  // Отправка формы по Ctrl+Enter
  $('form').bind('keypress', function(e){
    if((e.ctrlKey) && ((e.which==10)||(e.which==13))) {$(this).submit();}
  // Отправка данных формы по нажатию на Enter в случае если курсор находится в input полях (В некоторых браузерах при нажатии по enter срабатывает клик по первому submit полю, которое является кнопкой назад. Для этого написан этот фикс)
  }).find('input').bind('keypress', function(e){
    if(((e.which==10)||(e.which==13))) { try{$(this.form).submit();} catch(e){} return false; }
  });

  // при клике на маленькие изображения инициализируем действие вызова галереи fancybox
  $('a[rel="gallery"]').fancybox();

  // Увеличение изображение при клике на него и открытие галереи изображений
  $('.fullimg a, .zoomimg a').click(function(){

        // Идентификатор главной картинки
    var goodsImageId = $('.fullimg input').attr("rel"),

        // Маленькое изображение, по которому на самом деле будем кликать
        goodsImageIconElement = $('.zoomicon input[rel="'+goodsImageId+'"]').parent().find('a');

    // Для иконки изображения запустим галерею  
    // goodsImageIconElement.nyroModalManual();
    goodsImageIconElement.click();
    return false;
  });


  // Добавление товара в корзину через ajax
  $('.goodsDataForm, .goodsToCartFromCompareForm, .goodsListForm').submit(function(){

    $(this).nyroModalManual({
      formIndicator: 'ajax_q',  // Value added when a form is sent
      minWidth: 450, // Minimum width
      minHeight: 140, // Minimum height
      gallery: null // Gallery name if provided
    });
    return false;
  });

  // Изменение главного изображения товара при нажатии на миниатюру
  $('.zoomicon a').click(function(){
        // Путь к среднему изображению
    var MediumImageUrl = $(this).find('img').attr('rel'),

        // Главное изображение, в которое будем вставлять новое изображение
        MainImage = $('.fullimg img'),

        // В этом объекте хранится идентификатор картинки главного изображения для коректной работы галереи изображений
        MainImageIdObject = $('.fullimg input'),

        // Получаем идентификатор этого изображения из соседнего input поля
        GoodsImageIconId = $(this).parent().find('input').attr("rel");

    // Изменяем главное изображение
    MainImage.attr('src',MediumImageUrl);

    // Изменяем идентификатор главного изображения
    MainImageIdObject.attr("rel",GoodsImageIconId);

    return false;
  });

  // Функция собирает свойства в строку, для определения модификации товара
  function getSlugFromGoodsDataFormModificationsProperties(obj) {
    var properties = new Array();
    $(obj).each(function(i){
      properties[i] = parseInt($(this).val());
    });
    return properties.sort(function(aaa, bbb){return aaa - bbb}).join('_');
  }


  var
    // Запоминаем поля выбора свойств, для ускорения работы со значениями свойств
    goodsDataProperties = $('form.goodsDataForm select[name="form[properties][]"]'),

    // Запоминаем блоки с информацией по модификациям, для ускорения работы
    goodsDataModifications = $('div.ModificationsList');

  // Обновляет возможность выбора свойств модификации, для отключения возможности выбора по характеристикам модификации которой не существует.
  function updateVisibility (y) {
    // Проверяем в каждом соседнем поле выбора модификаций, возможно ли подобрать модификацию для указанных свойств
    goodsDataProperties.each(function(j){
      // Если мы сравниваем значения свойства не с самим собой, а с другим списком значений свойств
      if( j != y ) {
        // Проходим по всем значениям текущего свойства модификации товара
        $(this).find('option').each(function(){
          // Записываем временный массив свойств, которые будем использовать для проверки существования модификации
          var checkProperties = new Array();
          $(goodsDataProperties).each(function(i){
            checkProperties[i] = parseInt($(this).val());
          });
          // Пытаемся найти модификацию соответствующую выбранным значениям свойств
          checkProperties[j] = parseInt($(this).attr('value'));
          // Собираем хэш определяющий модификацию по свойствам
          slug = checkProperties.sort(function(a,B){return a - b}).join('_');
          // Ищем модификацию по всем выбранным значениям свойств товара. Если модификации нет в возможном выборе, отмечаем потенциальное значение выбора как не доступное для выбора, т.к. такой модификации нет.
          var modification = goodsDataModifications.filter('[rel="'+slug+'"]');
if(!modification.length || (modification.length && !parseInt(modification.find('input[name="rest_value"]').val()))) {
$(this).attr('disabled', true);
          // Если выбрав данное значение свойства товара можно подобрать модификацию, то выделяем вариант выбора как доступный.
          } else {
            $(this).attr('disabled', false);
          }
        });
      }
    });
  }
  // Обновляем возможность выбора модификации товара по свойствам. Для тех свойств, выбор по которым не возможен, отключаем такую возможность.
  // Проверяем возможность выбора на всех полях кроме первого, чтобы отключить во всех остальных варианты, которые не возможно выбрать
  updateVisibility (0);
  // Проверяем возможность выбора на всех полях кроме второго, чтобы в первом поле так же отключилась возможность выбора не существующих модификаций
  updateVisibility (1);

  // Изменение цены товара при изменении у товара свойства для модификации
  goodsDataProperties.each(function(y){
    $(this).change(function(){

      var slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties),
          submitButtonBlock             = $('li.goodsPageSubmitButtonBlock:eq(0)'),
          modificationBlock             = goodsDataModifications.filter('[rel="'+slug+'"]'),
          modificationId                = parseInt(modificationBlock.find('[name="id"]').val()),
          modificationArtNumber         = modificationBlock.find('[name="art_number"]').val(),
          modificationPriceNow          = parseFloat(modificationBlock.find('[name="price_now"]').val()),
          modificationPriceNowFormated  = modificationBlock.find('.price_now_formated').html(),
          modificationPriceOld          = parseFloat(modificationBlock.find('[name="price_old"]').val()),
          modificationPriceOldFormated  = modificationBlock.find('.price_old_formated').html(),
          modificationRestValue         = parseFloat(modificationBlock.find('[name="rest_value"]').val()),
          modificationDescription       = modificationBlock.find('.description').html(),
          modificationMeasureId         = parseInt(modificationBlock.find('[name="measure_id"]').val()),
          modificationMeasureName       = modificationBlock.find('[name="measure_name"]').val(),
          modificationMeasureDesc       = modificationBlock.find('[name="measure_desc"]').val(),
          modificationMeasurePrecision  = modificationBlock.find('[name="measure_precision"]').val(),
          modificationIsHasInCompareList= modificationBlock.find('[name="is_has_in_compare_list"]').val(),
          goodsModificationId           = $('.goodsDataMainModificationId'),
          goodsPriceNow                 = $('.goodsDataMainModificationPriceNow'),
          goodsPriceOld                 = $('.goodsDataMainModificationPriceOld'),
          goodsAvailable                = $('.goodsDataMainModificationAvailable'),
          goodsAvailableTrue            = goodsAvailable.find('.available-true'),
          goodsAvailableFalse           = goodsAvailable.find('.available-false'),
          goodsArtNumberBlock           = $('.goodsDataMainModificationArtNumber'),
          goodsArtNumber                = goodsArtNumberBlock.find('span');
          goodsCompareAddButton         = $('.goodsDataCompareButton.add');
          goodsCompareDeleteButton      = $('.goodsDataCompareButton.delete');
          goodsModDescriptionBlock      = $('.goodsDataMainModificationsDescriptionBlock');


       // Изменяем данные товара для выбранных параметров. Если нашлась выбранная модификация
       if(modificationBlock.length) {
         // Цена товара
         goodsPriceNow.html(modificationPriceNowFormated);

         // Старая цена товара
         if(modificationPriceOld>modificationPriceNow) {
          goodsPriceOld.html(modificationPriceOldFormated);
         } else {
           goodsPriceOld.html('');
         }

         // Есть ли товар есть в наличии
if(modificationRestValue>0) {
// Показываем кнопку "Положить в корзину"
submitButtonBlock.show();
// Показываем табличку, что товар есть в наличии
goodsAvailableTrue.show();
// Скрываем табличку, о том что товара нет в наличии
goodsAvailableFalse.hide();
$('#button-cart').html('В корзину');
// Если товара нет в наличии
} else {
// Скрываем кнопку "Положить в корзину"
submitButtonBlock.show();
// Скрываем табличку, что товар есть в наличии
goodsAvailableTrue.hide();
// Скрываем табличку, о том что товар есть в наличии
goodsAvailableFalse.show();
$('#button-cart').html('Уведомить меня');
}
         // Если товар есть в списке сравнения
         if(modificationIsHasInCompareList>0) {
           goodsCompareAddButton.hide();
           goodsCompareDeleteButton.show();
         // Если товара нет в списке сравнения
         } else {
           goodsCompareAddButton.show();
           goodsCompareDeleteButton.hide();
         }

         // Покажем артикул модификации товара, если он указан
         if(modificationArtNumber.length>0) {
           goodsArtNumberBlock.show();
           goodsArtNumber.html(modificationArtNumber);
         // Скроем артикул модификации товара, если он не указан
         } else {
           goodsArtNumberBlock.hide();
           goodsArtNumber.html('');
         }

         // Описание модификации товара. Покажем если оно есть, спрячем если его у модификации нет
         if(modificationDescription.length > 0) {
           goodsModDescriptionBlock.show().html('<div>' + modificationDescription + '</div>');
         } else {
           goodsModDescriptionBlock.hide().html();
         }


         // Идентификатор товарной модификации
         goodsModificationId.val(modificationId);
       } else {
         // Отправим запись об ошибке на сервер
         sendError('no modification by slug '+slug);
         alert('К сожалению сейчас не получается подобрать модификацию соответствующую выбранным параметрам.');
       }

       // Обновляем возможность выбора другой модификации для текущих значений свойств модификации товара.
       updateVisibility(y);
    });
  });

  // Кнопка добавления товара на сравнение сравнения товаров
  $('.goodsDataCompareButton').click(function(){
    window.location.href = $(this).attr('rel') +
    ($(this).attr('rel').indexOf( '\?' ) > -1 ? '&' : '?') +
    'id='+
    $('.goodsDataMainModificationId').val()+
    '&from='+
    $('input[name="form[goods_from]"]').val();
    return false;
  });


  // Сравнение товаров. Увеличение изображение при клике на ссылку увеличения и открытие галереии с изображениями этого товара
  $('.CompareGoodsImageZoom').click(function(){

    // Галлерея фотографий для данной модификации товаров
    var galleryBlock = $('.galleryBlock' +  $(this).attr('rel')),

    // Главное изображение товара, которое сейчас стоит у товара
    galleryMainImage = $('.CompareGoodsImageMain' +  $(this).attr('rel')),

    // Изображение по которому нужно кликнуть в галлерее изображений
    ImageIngallery = galleryBlock.find('.CompareGoodsImageGallery'+galleryMainImage.attr('rel'));

    // Запускаем галлерею изображений от изображения товара, чтобы если например кликнули по гайке, то и открылись гайка, а не еще какой-либо изображение этого товара

    // при клике на маленькие изображения создаём галерею изображений fancybox и запускаем её просмотр
    $('a[rel="gallery' +  $(this).attr('rel') + '"]').fancybox();
    ImageIngallery.click();

    /*
    ImageIngallery.nyroModalManual({
      gallery: 'gallery' +  $(this).attr('rel')
    });
*/
    return false;
  });

  // Сравнение товаров. Инвертирование свойств для сравнения товара
  $('.CompareCheckbox.invert').click(function(){
    var checked = true,
        checkboxes = $('.CompareCheckbox:not(.invert)');

    checkboxes.each(function(){
      if($(this).attr('checked')) {
        checked = false;
        return false;
      }
    });

    checkboxes.each(function(){
      $(this).attr('checked', checked);
    });

    $(this).attr('checked', checked);
  });

  // Сравнение товаров. Скрытие характеристик товара, которые выделил пользователь
  $('.CompareGoodsHideSelected').click(function(){

    $('.CompareGoodsTableTbodyComparisonLine').each(function(){
      var CheckedCheckbox = $(this).find('.CompareCheckbox:checked:not(.invert)');
      if(CheckedCheckbox.length>0) {
        $(this).hide();
      }
    });

    // отменяем выделение характеристик товаров
    $('.CompareCheckbox').attr('checked',false);

    return false;
  });

  // Сравнение товаров. Отображение скрытых характеристик товара
  $('.CompareGoodsShowAll').click(function(){
    $('.CompareGoodsTableTbodyComparisonLine:hidden').show();
    return false;
  });

  // Сравнение товаров. Верхняя навигация изменение фильтра на отображение всех характеристик товаров
  $('.CompareGoodsTableFilterShowAll').click(function(){
    $('.CompareGoodsTableFilterSelected').removeClass('CompareGoodsTableFilterSelected');
    $('.CompareGoodsTableTbodyComparisonLine:hidden').show();

    $(this).addClass('CompareGoodsTableFilterSelected');
    return false;
  });

  // Сравнение товаров. Фильтр в верхней навигации. Отображение только различающихся характеристик товара
  $('.CompareGoodsTableFilterShowOnlyDifferent').click(function(){
    $('.CompareGoodsTableFilterSelected').removeClass('CompareGoodsTableFilterSelected');
    $('.CompareGoodsTableTbodyComparisonLine:not(.same)').show();
    $('.CompareGoodsTableTbodyComparisonLine.same').hide();

    $(this).addClass('CompareGoodsTableFilterSelected');
    return false;
  });

  // Сравнение товаров. При наведении на строку сравнения, она выделяется цветом
  $('.CompareGoodsTableTbodyComparisonLine').hover(
    function () { $(this).addClass('hover'); },
    function () { $(this).removeClass('hover'); }
  );

  // При клике по строке выделяем свойство
  $('.CompareGoodsTableTbodyComparisonLine td:not(.ceil1)').click(function(){
    var CompareCheckbox = $(this).parent().find('.CompareCheckbox');

    if(CompareCheckbox.attr('checked')) {
      CompareCheckbox.attr('checked', false);
    } else {
      CompareCheckbox.attr('checked', true);
    }
  });

  // Форма регистрации нового пользователя, действие ссылки "показать пароль"
  $('.clientForm .showPass').click(function(){
    ChangePasswordFieldType(this, $('#sites_client_pass'));
    return false;
  });

  // Форма регистрации нового пользователя, при оформлении заказа
  $('.OrderShowPass').click(function(){
    ChangePasswordFieldType(this, $('#contactPassWord'));
    return false;
  });

  // При вводе пароля с caps lockом, покажет блок с сообщением для пользователя
  $('#sites_client_pass, #contactPassWord').capslock({
    caps_lock_on:function(){$("#caps_lock").show();},
    caps_lock_off:function(){$("#caps_lock").hide();}
  });

  // При оформлении заказа дадим возможность зарегистрироваться пользователю
  $('#contactWantRegister').click(function(){
    if($(this).attr("checked")) {
      $('.contactRegisterNeedElement').show();
      $('#contactEmail, #contactPassWord').addClass('required');
    } else {
      $('.contactRegisterNeedElement').hide();
      $('#contactEmail, #contactPassWord').removeClass('required');
    }
  });

  // Добавление отзыва о товаре. Рейтинг
  if(typeof($('.goodsDataOpinionTableRating').stars) == "function" ) {
    $('.goodsDataOpinionTableRating').stars({
      inputType: "input",
      split: 2,
      captionEl: $(".goodsDataOpinionMsg"),
      cancelShow: false
    });
  }

  // Список отзывов о товаре. Ссылка на отображение формы для добавление отзыва о товаре
  $('.goodsDataOpinionShowAddForm').click(function(){
    if(0 == $('.otziv:visible').length) {
      $('.otziv').show('blind');
    } else {
      $('.otziv').hide('blind');
      return false;
    }
  });

  // Добавление отзыва о товаре. кнопка reset скрывающая форму добавления отзыва о товаре
  $('.goodsDataOpinionAddForm input:reset').click(function(){
    $('#goodsDataOpinionAddBlock').hide('blind');
  });

  // Иконка для обновления изображение капчи
  $('.goodsDataOpinionCaptchaRefresh').click(function(){
    RefreshImageAction(this,1,1);
    $('.goodsDataOpinionCaptchaImg').attr('src',$('.goodsDataOpinionCaptchaImg').attr('src')+'&rand'+Math.random(0,10000));
    return false;
  });


  // Фильтры по товарам.
  // При нажании на какую-либо характеристику или свойство товара происходит фильтрация товаров
  $('.contentTbodySearchFilterBlock input').click(function(){
    $(this)[0].form.submit();
  });
  var
    // Минимальное значение цены для фильтра
    priceFilterMinAvailable = parseInt($('.goodsFilterPriceRangePointers .min').text())
    // Максимальное значение цены для фильтра
    ,priceFilterMaxAvailable = parseInt($('.goodsFilterPriceRangePointers .max').text())
    // Максимальное значение цены для фильтра
    ,priceSliderBlock = $('#goods-filter-price-slider')
    // Поле ввода текущего значения цены "От"
    ,priceInputMin = $( "#goods-filter-min-price" )
    // Поле ввода текущего значения цены "До"
    ,priceInputMax = $( "#goods-filter-max-price" )
    // Блок с кнопкой, которую есть смысл нажимать только тогда, когда изменялся диапазон цен.
    ,priceSubmitButtonBlock = $( ".goodsFilterPriceSubmit" )
  ;
  // Изменяет размер ячеек с ценой, т.к. у них нет рамок, есть смысл менять размеры полей ввода, чтобы они выглядили как текст
  function priceInputsChangeWidthByChars() {
    // Если есть блок указания минимальной цены
    if(priceInputMin.length) {
      priceInputMin.css('width', (priceInputMin.val().length*7 + 3) + 'px');
      priceInputMax.css('width', (priceInputMax.val().length*7 + 3) + 'px');
    }
  }
  // Слайдер, который используется для удобства выбора цены
  priceSliderBlock.slider({
    range: true,
    min: priceFilterMinAvailable,
    max: priceFilterMaxAvailable,
    values: [
      parseInt($('#goods-filter-min-price').val())
      ,parseInt($('#goods-filter-max-price').val())
    ],
    slide: function( event, ui ) {
      priceInputMin.val( ui.values[ 0 ] );
      priceInputMax.val( ui.values[ 1 ] );
      priceSubmitButtonBlock.show();
      priceInputsChangeWidthByChars();
    }
  });
  // При изменении минимального значения цены
  priceInputMin.keyup(function(){
    var newVal = parseInt($(this).val());
    if(newVal < priceFilterMinAvailable) {
      newVal = priceFilterMinAvailable;
    }
    priceSliderBlock.slider("values", 0, newVal);
    priceSubmitButtonBlock.show();
    priceInputsChangeWidthByChars();
  });
  // При изменении максимального значения цены
  priceInputMax.keyup(function(){
    var newVal = parseInt($(this).val());
    if(newVal > priceFilterMaxAvailable) {
      newVal = priceFilterMaxAvailable;
    }
    priceSliderBlock.slider("values", 1, newVal);
    priceSubmitButtonBlock.show();
    priceInputsChangeWidthByChars();
  });
  // Обновить размеры полей ввода диапазона цен
  priceInputsChangeWidthByChars();
  // END Фильтры по товарам.


  // Действия при выборе варианта доставки на этапе оформления заказа
  $('.deliveryRadio').click(function(){

    // Если текущая выделенная зона доставки не относится к выбранному варианту доставки, снимаем выделение с зоны доставки
    if($('.deliveryZoneRadio:checked').attr('deliveryid') != $(this).val()) {
      $('.deliveryZoneRadio:checked').click().attr('checked', false);
    }
  });

  // Действия при выборе зоны внутри варианта доставки на этапе оформления заказа
  $('.deliveryZoneRadio').click(function(){

    var
      deliveryId = $(this).attr('deliveryid')
      ,deliveryZonePrice = $(this).parent().parent().find('.deliveryZonePrice b span')  // ++++++++++++++++++++++++
      ,deliveryTbody = $('.orderStageDeliveryListTable tbody[rel="' + deliveryId + '"]')
      ,deliveryBlock = deliveryTbody.find('#deliveryId' + deliveryId)
      ,deliveryZonePriceBlock = deliveryTbody.find('.orderStageDeliveryZonePrice')  // ++++++++++++++++++++++++
      ,deliveryDefaultPriceBlock = deliveryTbody.find('.orderStageDeliveryDefaultPrice')  // ++++++++++++++++++++++++
    ;

    // Если этот пункт уже выбран, при повторном клике пользователь видимо хочет снять выделение зоны доставки
    if('true' == $(this).attr('rel')) {
      $(this).attr('checked', false);
      $(this).attr('rel', 'false');

      // Показываем цену по умолчанию
      deliveryDefaultPriceBlock.show();
      // Скрываем цену образованную от зоны
      deliveryZonePriceBlock.hide();

    // Отмечаем у всех радио баттонов зон доставки свойство говорящее что они не отмечены
    } else {
      $('.deliveryZoneRadio').attr('rel', 'false');
      $(this).attr('rel', 'true');

      // Показываем цену по умолчанию
      deliveryDefaultPriceBlock.hide();
      // Скрываем цену образованную от зоны
      deliveryZonePriceBlock.show().html(deliveryZonePrice.html());

      // Выделяем вариант доставки к которому относится зона доставки
      deliveryBlock.attr('checked', true);
    }

  });

   $("#deliveryConvenientDate").datepicker({
   dayNames     : ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'],
dayNamesMin   : ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб' ],
closeText     : 'Готово',
currentText   : 'Сегодня' ,
duration     : '',
monthNames   : ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
monthNamesShort : ['Янв','Фев','Март','Апр','Май','Июнь','Июль','Авг','Сен','Окт','Ноя','Дек'],
yearRange     : "-6:+6",
dateFormat   : 'dd.mm.yy',
minDate         : new Date(),
firstDay     : 1
});
});

$(function()  {
  setTimeout(function() {
         var maxprice = 0;
         $('.goodsDataMainModificationsList').each(function() {
                var rest = parseInt($(this).find('[name="rest_value"]').val());
                var price = parseFloat($(this).find('[name="price_now"]').val());
                if(rest && price > maxprice) {
                  maxprice = price;
                  var id = $(this).attr('rel').split('_');
                  var block = $('.goodsDataMainModificationsBlockProperty');
                  $('.goodsDataMainModificationsBlockProperty select option').removeAttr('selected');
                  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').attr('selected', 'selected');
                  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[1] + '"]').attr('selected', 'selected');
                  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').parent().trigger('change');
                }
         });
  }, 600);
});

#6 batta

batta

    Активный участник

  • Пользователи
  • PipPipPipPip
  • 1 142 сообщений
  • ГородНижний Новгород

Отправлено 20 Август 2014 - 12:20

Просмотр сообщенияOPEX (20 Август 2014 - 08:30) писал:

Не совсем понял, что значит блоки "поехали". И не вижу где синтаксис нарушен, я просто скопировал и вставил в конец main.js:
$(function() {
  setTimeout(function() {
var maxprice = 0;
$('.goodsDataMainModificationsList').each(function() {
var rest = parseInt($(this).find('[name="rest_value"]').val());
var price = parseFloat($(this).find('[name="price_now"]').val());
if(rest && price > maxprice) {
  maxprice = price;
  var id = $(this).attr('rel').split('_');
  var block = $('.goodsDataMainModificationsBlockProperty');
  $('.goodsDataMainModificationsBlockProperty select option').removeAttr('selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').attr('selected', 'selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[1] + '"]').attr('selected', 'selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').parent().trigger('change');
}
});
  }, 600);
});


Подскажите, пожалуйста, что нужно сделать чтобы автоматически выбиралась модификация которая есть в наличии. Как я понял, для этого нужно вставить код который я вставил в конец  main.js получается либо код не работает либо я его "криво" вставил?


Вот код:

// Отправляет ошибку на сервер, для того, чтобы служба тех поддержки могла разобраться в проблеме как можно быстрее.
function sendError (desc, page, line) {
  var img=document.createElement('img');
  img.src = 'http://storeland.ru/...IComponent(desc)+'&page='+encodeURIComponent(window.location)+'&line=0';
  img.style.position = 'absolute';
  img.style.top = '-9999px';

  try { document.getElementsByTagName('head').appendChild(img) } catch (e){}
  return false;
}

// Форматирует цену
function number_format(number,decimals,dec_point,thousands_sep){var n=number,prec=decimals;var toFixedFix=function(n,prec){var k=Math.pow(10,prec);return(Math.round(n*k)/k).toString();};n=!isFinite(+n)?0:+n;prec=!isFinite(+prec)?0:Math.abs(prec);var sep=(typeof thousands_sep==='undefined')?',':thousands_sep;var dec=(typeof dec_point==='undefined')?'.':dec_point;var s=(prec>0)?toFixedFix(n,prec):toFixedFix(Math.round(n),prec);var abs=toFixedFix(Math.abs(n),prec);var _,i;if(abs>=1000){_=abs.split(/\D/);i=_[0].length%3||3;_[0]=s.slice(0,i+(n<0))+
_[0].slice(i).replace(/(\d{3})/g,sep+'$1');s=_.join(dec);}else{s=s.replace('.',dec);}
var decPos=s.indexOf(dec);if(prec>=1&&decPos!==-1&&(s.length-decPos-1)<prec){s+=new Array(prec-(s.length-decPos-1)).join(0)+'0';}
else if(prec>=1&&decPos===-1){s+=dec+new Array(prec).join(0)+'0';}
return s;}

// Превращает поле пароля в текстовое поле и обратно
// @LinkObject - ссылка по которой кликнули
// @InputObject - объект у которого нужно изменить тип поля
function ChangePasswordFieldType (LinkObject, InputObject) {
  var
// Ссылка по которой кликнули
LObject = $(LinkObject),
// Объект у которого изменяем тип с password на text
IObject = $(InputObject),
// Старый текст ссылки
txtOld = LObject.text(),
// Новый текст ссылки
txtNew = LObject.attr('rel');

  // Если объекты не получены, завершим работу функции
  if( LObject.length==0 || IObject.length==0 ) {
return false;
  }

  // Изменяем у ссылки текст со старого на новый
  LObject.html(txtNew);
  // Старый текст ссылки сохраняем в атрибуте rel
  LObject.attr('rel', txtOld);

  // Изменяем тип input поля
  if(IObject[0].type == 'text') {
IObject[0].type = 'password';
  } else {
IObject[0].type = 'text';
  }
}

// Крутит изображение при обновлении картинки защиты от роботов
function RefreshImageAction(img,num,cnt) {
  if(cnt>13) {
return false;
  }

  $(img).attr('src', $(img).attr('rel') + 'icon/refresh/' + num + '.gif');
  num = (num==6)?0:num;
  setTimeout(function(){RefreshImageAction(img, num+1, cnt+1);}, 50);
}

$(document).ready(function(){

  // Валидация формы на странице оформления заказа, а так же формы на страницы связи с администрацией
  $('.order form, .feedbackForm, .clientForm, .goodsDataOpinionAddForm').submit(function(){
if($(this).valid()) {
  // Кнопка отправки формы
  SubmitButton = $(this).find('input:submit, button:submit');
  // Если кнопку уже нажали, видимо отправка формы производилась по нажатию на кнопку enter, не допускаем этого.
  if($(SubmitButton.get(0)).attr('disabled')) {
return false;
  }
  // Устанавливаем на кнопку отправки формы блокировку повторной оптравки
  SubmitButton.attr('disabled', true);
  // Через 10 секунд блокировка отправки формы снимается.
  setTimeout('SubmitButton.attr("disabled", false);', 10000);
}
  }).validate();

  // Отправка формы по Ctrl+Enter
  $('form').bind('keypress', function(e){
if((e.ctrlKey) && ((e.which==10)||(e.which==13))) {$(this).submit();}
  // Отправка данных формы по нажатию на Enter в случае если курсор находится в input полях (В некоторых браузерах при нажатии по enter срабатывает клик по первому submit полю, которое является кнопкой назад. Для этого написан этот фикс)
  }).find('input').bind('keypress', function(e){
if(((e.which==10)||(e.which==13))) { try{$(this.form).submit();} catch(e){} return false; }
  });

  // при клике на маленькие изображения инициализируем действие вызова галереи fancybox
  $('a[rel="gallery"]').fancybox();

  // Увеличение изображение при клике на него и открытие галереи изображений
  $('.fullimg a, .zoomimg a').click(function(){

// Идентификатор главной картинки
var goodsImageId = $('.fullimg input').attr("rel"),

// Маленькое изображение, по которому на самом деле будем кликать
goodsImageIconElement = $('.zoomicon input[rel="'+goodsImageId+'"]').parent().find('a');

// Для иконки изображения запустим галерею  
// goodsImageIconElement.nyroModalManual();
goodsImageIconElement.click();
return false;
  });


  // Добавление товара в корзину через ajax
  $('.goodsDataForm, .goodsToCartFromCompareForm, .goodsListForm').submit(function(){

$(this).nyroModalManual({
  formIndicator: 'ajax_q',  // Value added when a form is sent
  minWidth: 450, // Minimum width
  minHeight: 140, // Minimum height
  gallery: null // Gallery name if provided
});
return false;
  });

  // Изменение главного изображения товара при нажатии на миниатюру
  $('.zoomicon a').click(function(){
// Путь к среднему изображению
var MediumImageUrl = $(this).find('img').attr('rel'),

// Главное изображение, в которое будем вставлять новое изображение
MainImage = $('.fullimg img'),

// В этом объекте хранится идентификатор картинки главного изображения для коректной работы галереи изображений
MainImageIdObject = $('.fullimg input'),

// Получаем идентификатор этого изображения из соседнего input поля
GoodsImageIconId = $(this).parent().find('input').attr("rel");

// Изменяем главное изображение
MainImage.attr('src',MediumImageUrl);

// Изменяем идентификатор главного изображения
MainImageIdObject.attr("rel",GoodsImageIconId);

return false;
  });

  // Функция собирает свойства в строку, для определения модификации товара
  function getSlugFromGoodsDataFormModificationsProperties(obj) {
var properties = new Array();
$(obj).each(function(i){
  properties[i] = parseInt($(this).val());
});
return properties.sort(function(aaa, bbb){return aaa - bbb}).join('_');
  }


  var
// Запоминаем поля выбора свойств, для ускорения работы со значениями свойств
goodsDataProperties = $('form.goodsDataForm select[name="form[properties][]"]'),

// Запоминаем блоки с информацией по модификациям, для ускорения работы
goodsDataModifications = $('div.ModificationsList');

  // Обновляет возможность выбора свойств модификации, для отключения возможности выбора по характеристикам модификации которой не существует.
  function updateVisibility (y) {
// Проверяем в каждом соседнем поле выбора модификаций, возможно ли подобрать модификацию для указанных свойств
goodsDataProperties.each(function(j){
  // Если мы сравниваем значения свойства не с самим собой, а с другим списком значений свойств
  if( j != y ) {
// Проходим по всем значениям текущего свойства модификации товара
$(this).find('option').each(function(){
  // Записываем временный массив свойств, которые будем использовать для проверки существования модификации
  var checkProperties = new Array();
  $(goodsDataProperties).each(function(i){
checkProperties[i] = parseInt($(this).val());
  });
  // Пытаемся найти модификацию соответствующую выбранным значениям свойств
  checkProperties[j] = parseInt($(this).attr('value'));
  // Собираем хэш определяющий модификацию по свойствам
  slug = checkProperties.sort(function(a, B){return a - b}).join('_');
  // Ищем модификацию по всем выбранным значениям свойств товара. Если модификации нет в возможном выборе, отмечаем потенциальное значение выбора как не доступное для выбора, т.к. такой модификации нет.
  var modification = goodsDataModifications.filter('[rel="'+slug+'"]');
if(!modification.length || (modification.length && !parseInt(modification.find('input[name="rest_value"]').val()))) {
$(this).attr('disabled', true);
  // Если выбрав данное значение свойства товара можно подобрать модификацию, то выделяем вариант выбора как доступный.
  } else {
$(this).attr('disabled', false);
  }
});
  }
});
  }
  // Обновляем возможность выбора модификации товара по свойствам. Для тех свойств, выбор по которым не возможен, отключаем такую возможность.
  // Проверяем возможность выбора на всех полях кроме первого, чтобы отключить во всех остальных варианты, которые не возможно выбрать
  updateVisibility (0);
  // Проверяем возможность выбора на всех полях кроме второго, чтобы в первом поле так же отключилась возможность выбора не существующих модификаций
  updateVisibility (1);

  // Изменение цены товара при изменении у товара свойства для модификации
  goodsDataProperties.each(function(y){
$(this).change(function(){

  var slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties),
  submitButtonBlock = $('li.goodsPageSubmitButtonBlock:eq(0)'),
  modificationBlock = goodsDataModifications.filter('[rel="'+slug+'"]'),
  modificationId = parseInt(modificationBlock.find('[name="id"]').val()),
  modificationArtNumber = modificationBlock.find('[name="art_number"]').val(),
  modificationPriceNow   = parseFloat(modificationBlock.find('[name="price_now"]').val()),
  modificationPriceNowFormated  = modificationBlock.find('.price_now_formated').html(),
  modificationPriceOld   = parseFloat(modificationBlock.find('[name="price_old"]').val()),
  modificationPriceOldFormated  = modificationBlock.find('.price_old_formated').html(),
  modificationRestValue = parseFloat(modificationBlock.find('[name="rest_value"]').val()),
  modificationDescription    = modificationBlock.find('.description').html(),
  modificationMeasureId = parseInt(modificationBlock.find('[name="measure_id"]').val()),
  modificationMeasureName    = modificationBlock.find('[name="measure_name"]').val(),
  modificationMeasureDesc    = modificationBlock.find('[name="measure_desc"]').val(),
  modificationMeasurePrecision  = modificationBlock.find('[name="measure_precision"]').val(),
  modificationIsHasInCompareList= modificationBlock.find('[name="is_has_in_compare_list"]').val(),
  goodsModificationId    = $('.goodsDataMainModificationId'),
  goodsPriceNow = $('.goodsDataMainModificationPriceNow'),
  goodsPriceOld = $('.goodsDataMainModificationPriceOld'),
  goodsAvailable = $('.goodsDataMainModificationAvailable'),
  goodsAvailableTrue = goodsAvailable.find('.available-true'),
  goodsAvailableFalse    = goodsAvailable.find('.available-false'),
  goodsArtNumberBlock    = $('.goodsDataMainModificationArtNumber'),
  goodsArtNumber = goodsArtNumberBlock.find('span');
  goodsCompareAddButton = $('.goodsDataCompareButton.add');
  goodsCompareDeleteButton   = $('.goodsDataCompareButton.delete');
  goodsModDescriptionBlock   = $('.goodsDataMainModificationsDescriptionBlock');


   // Изменяем данные товара для выбранных параметров. Если нашлась выбранная модификация
   if(modificationBlock.length) {
// Цена товара
goodsPriceNow.html(modificationPriceNowFormated);

// Старая цена товара
if(modificationPriceOld>modificationPriceNow) {
  goodsPriceOld.html(modificationPriceOldFormated);
} else {
   goodsPriceOld.html('');
}

// Есть ли товар есть в наличии
if(modificationRestValue>0) {
// Показываем кнопку "Положить в корзину"
submitButtonBlock.show();
// Показываем табличку, что товар есть в наличии
goodsAvailableTrue.show();
// Скрываем табличку, о том что товара нет в наличии
goodsAvailableFalse.hide();
$('#button-cart').html('В корзину');
// Если товара нет в наличии
} else {
// Скрываем кнопку "Положить в корзину"
submitButtonBlock.show();
// Скрываем табличку, что товар есть в наличии
goodsAvailableTrue.hide();
// Скрываем табличку, о том что товар есть в наличии
goodsAvailableFalse.show();
$('#button-cart').html('Уведомить меня');
}
// Если товар есть в списке сравнения
if(modificationIsHasInCompareList>0) {
   goodsCompareAddButton.hide();
   goodsCompareDeleteButton.show();
// Если товара нет в списке сравнения
} else {
   goodsCompareAddButton.show();
   goodsCompareDeleteButton.hide();
}

// Покажем артикул модификации товара, если он указан
if(modificationArtNumber.length>0) {
   goodsArtNumberBlock.show();
   goodsArtNumber.html(modificationArtNumber);
// Скроем артикул модификации товара, если он не указан
} else {
   goodsArtNumberBlock.hide();
   goodsArtNumber.html('');
}

// Описание модификации товара. Покажем если оно есть, спрячем если его у модификации нет
if(modificationDescription.length > 0) {
   goodsModDescriptionBlock.show().html('<div>' + modificationDescription + '</div>');
} else {
   goodsModDescriptionBlock.hide().html();
}


// Идентификатор товарной модификации
goodsModificationId.val(modificationId);
   } else {
// Отправим запись об ошибке на сервер
sendError('no modification by slug '+slug);
alert('К сожалению сейчас не получается подобрать модификацию соответствующую выбранным параметрам.');
   }

   // Обновляем возможность выбора другой модификации для текущих значений свойств модификации товара.
   updateVisibility(y);
});
  });

  // Кнопка добавления товара на сравнение сравнения товаров
  $('.goodsDataCompareButton').click(function(){
window.location.href = $(this).attr('rel') +
($(this).attr('rel').indexOf( '\?' ) > -1 ? '&' : '?') +
'id='+
$('.goodsDataMainModificationId').val()+
'&from='+
$('input[name="form[goods_from]"]').val();
return false;
  });


  // Сравнение товаров. Увеличение изображение при клике на ссылку увеличения и открытие галереии с изображениями этого товара
  $('.CompareGoodsImageZoom').click(function(){

// Галлерея фотографий для данной модификации товаров
var galleryBlock = $('.galleryBlock' +  $(this).attr('rel')),

// Главное изображение товара, которое сейчас стоит у товара
galleryMainImage = $('.CompareGoodsImageMain' +  $(this).attr('rel')),

// Изображение по которому нужно кликнуть в галлерее изображений
ImageIngallery = galleryBlock.find('.CompareGoodsImageGallery'+galleryMainImage.attr('rel'));

// Запускаем галлерею изображений от изображения товара, чтобы если например кликнули по гайке, то и открылись гайка, а не еще какой-либо изображение этого товара

// при клике на маленькие изображения создаём галерею изображений fancybox и запускаем её просмотр
$('a[rel="gallery' +  $(this).attr('rel') + '"]').fancybox();
ImageIngallery.click();

/*
ImageIngallery.nyroModalManual({
  gallery: 'gallery' +  $(this).attr('rel')
});
*/
return false;
  });

  // Сравнение товаров. Инвертирование свойств для сравнения товара
  $('.CompareCheckbox.invert').click(function(){
var checked = true,
checkboxes = $('.CompareCheckbox:not(.invert)');

checkboxes.each(function(){
  if($(this).attr('checked')) {
checked = false;
return false;
  }
});

checkboxes.each(function(){
  $(this).attr('checked', checked);
});

$(this).attr('checked', checked);
  });

  // Сравнение товаров. Скрытие характеристик товара, которые выделил пользователь
  $('.CompareGoodsHideSelected').click(function(){

$('.CompareGoodsTableTbodyComparisonLine').each(function(){
  var CheckedCheckbox = $(this).find('.CompareCheckbox:checked:not(.invert)');
  if(CheckedCheckbox.length>0) {
$(this).hide();
  }
});

// отменяем выделение характеристик товаров
$('.CompareCheckbox').attr('checked',false);

return false;
  });

  // Сравнение товаров. Отображение скрытых характеристик товара
  $('.CompareGoodsShowAll').click(function(){
$('.CompareGoodsTableTbodyComparisonLine:hidden').show();
return false;
  });

  // Сравнение товаров. Верхняя навигация изменение фильтра на отображение всех характеристик товаров
  $('.CompareGoodsTableFilterShowAll').click(function(){
$('.CompareGoodsTableFilterSelected').removeClass('CompareGoodsTableFilterSelected');
$('.CompareGoodsTableTbodyComparisonLine:hidden').show();

$(this).addClass('CompareGoodsTableFilterSelected');
return false;
  });

  // Сравнение товаров. Фильтр в верхней навигации. Отображение только различающихся характеристик товара
  $('.CompareGoodsTableFilterShowOnlyDifferent').click(function(){
$('.CompareGoodsTableFilterSelected').removeClass('CompareGoodsTableFilterSelected');
$('.CompareGoodsTableTbodyComparisonLine:not(.same)').show();
$('.CompareGoodsTableTbodyComparisonLine.same').hide();

$(this).addClass('CompareGoodsTableFilterSelected');
return false;
  });

  // Сравнение товаров. При наведении на строку сравнения, она выделяется цветом
  $('.CompareGoodsTableTbodyComparisonLine').hover(
function () { $(this).addClass('hover'); },
function () { $(this).removeClass('hover'); }
  );

  // При клике по строке выделяем свойство
  $('.CompareGoodsTableTbodyComparisonLine td:not(.ceil1)').click(function(){
var CompareCheckbox = $(this).parent().find('.CompareCheckbox');

if(CompareCheckbox.attr('checked')) {
  CompareCheckbox.attr('checked', false);
} else {
  CompareCheckbox.attr('checked', true);
}
  });

  // Форма регистрации нового пользователя, действие ссылки "показать пароль"
  $('.clientForm .showPass').click(function(){
ChangePasswordFieldType(this, $('#sites_client_pass'));
return false;
  });

  // Форма регистрации нового пользователя, при оформлении заказа
  $('.OrderShowPass').click(function(){
ChangePasswordFieldType(this, $('#contactPassWord'));
return false;
  });

  // При вводе пароля с caps lockом, покажет блок с сообщением для пользователя
  $('#sites_client_pass, #contactPassWord').capslock({
caps_lock_on:function(){$("#caps_lock").show();},
caps_lock_off:function(){$("#caps_lock").hide();}
  });

  // При оформлении заказа дадим возможность зарегистрироваться пользователю
  $('#contactWantRegister').click(function(){
if($(this).attr("checked")) {
  $('.contactRegisterNeedElement').show();
  $('#contactEmail, #contactPassWord').addClass('required');
} else {
  $('.contactRegisterNeedElement').hide();
  $('#contactEmail, #contactPassWord').removeClass('required');
}
  });

  // Добавление отзыва о товаре. Рейтинг
  if(typeof($('.goodsDataOpinionTableRating').stars) == "function" ) {
$('.goodsDataOpinionTableRating').stars({
  inputType: "input",
  split: 2,
  captionEl: $(".goodsDataOpinionMsg"),
  cancelShow: false
});
  }

  // Список отзывов о товаре. Ссылка на отображение формы для добавление отзыва о товаре
  $('.goodsDataOpinionShowAddForm').click(function(){
if(0 == $('.otziv:visible').length) {
  $('.otziv').show('blind');
} else {
  $('.otziv').hide('blind');
  return false;
}
  });

  // Добавление отзыва о товаре. кнопка reset скрывающая форму добавления отзыва о товаре
  $('.goodsDataOpinionAddForm input:reset').click(function(){
$('#goodsDataOpinionAddBlock').hide('blind');
  });

  // Иконка для обновления изображение капчи
  $('.goodsDataOpinionCaptchaRefresh').click(function(){
RefreshImageAction(this,1,1);
$('.goodsDataOpinionCaptchaImg').attr('src',$('.goodsDataOpinionCaptchaImg').attr('src')+'&rand'+Math.random(0,10000));
return false;
  });


  // Фильтры по товарам.
  // При нажании на какую-либо характеристику или свойство товара происходит фильтрация товаров
  $('.contentTbodySearchFilterBlock input').click(function(){
$(this)[0].form.submit();
  });
  var
// Минимальное значение цены для фильтра
priceFilterMinAvailable = parseInt($('.goodsFilterPriceRangePointers .min').text())
// Максимальное значение цены для фильтра
,priceFilterMaxAvailable = parseInt($('.goodsFilterPriceRangePointers .max').text())
// Максимальное значение цены для фильтра
,priceSliderBlock = $('#goods-filter-price-slider')
// Поле ввода текущего значения цены "От"
,priceInputMin = $( "#goods-filter-min-price" )
// Поле ввода текущего значения цены "До"
,priceInputMax = $( "#goods-filter-max-price" )
// Блок с кнопкой, которую есть смысл нажимать только тогда, когда изменялся диапазон цен.
,priceSubmitButtonBlock = $( ".goodsFilterPriceSubmit" )
  ;
  // Изменяет размер ячеек с ценой, т.к. у них нет рамок, есть смысл менять размеры полей ввода, чтобы они выглядили как текст
  function priceInputsChangeWidthByChars() {
// Если есть блок указания минимальной цены
if(priceInputMin.length) {
  priceInputMin.css('width', (priceInputMin.val().length*7 + 3) + 'px');
  priceInputMax.css('width', (priceInputMax.val().length*7 + 3) + 'px');
}
  }
  // Слайдер, который используется для удобства выбора цены
  priceSliderBlock.slider({
range: true,
min: priceFilterMinAvailable,
max: priceFilterMaxAvailable,
values: [
  parseInt($('#goods-filter-min-price').val())
  ,parseInt($('#goods-filter-max-price').val())
],
slide: function( event, ui ) {
  priceInputMin.val( ui.values[ 0 ] );
  priceInputMax.val( ui.values[ 1 ] );
  priceSubmitButtonBlock.show();
  priceInputsChangeWidthByChars();
}
  });
  // При изменении минимального значения цены
  priceInputMin.keyup(function(){
var newVal = parseInt($(this).val());
if(newVal < priceFilterMinAvailable) {
  newVal = priceFilterMinAvailable;
}
priceSliderBlock.slider("values", 0, newVal);
priceSubmitButtonBlock.show();
priceInputsChangeWidthByChars();
  });
  // При изменении максимального значения цены
  priceInputMax.keyup(function(){
var newVal = parseInt($(this).val());
if(newVal > priceFilterMaxAvailable) {
  newVal = priceFilterMaxAvailable;
}
priceSliderBlock.slider("values", 1, newVal);
priceSubmitButtonBlock.show();
priceInputsChangeWidthByChars();
  });
  // Обновить размеры полей ввода диапазона цен
  priceInputsChangeWidthByChars();
  // END Фильтры по товарам.


  // Действия при выборе варианта доставки на этапе оформления заказа
  $('.deliveryRadio').click(function(){

// Если текущая выделенная зона доставки не относится к выбранному варианту доставки, снимаем выделение с зоны доставки
if($('.deliveryZoneRadio:checked').attr('deliveryid') != $(this).val()) {
  $('.deliveryZoneRadio:checked').click().attr('checked', false);
}
  });

  // Действия при выборе зоны внутри варианта доставки на этапе оформления заказа
  $('.deliveryZoneRadio').click(function(){

var
  deliveryId = $(this).attr('deliveryid')
  ,deliveryZonePrice = $(this).parent().parent().find('.deliveryZonePrice b span')  // ++++++++++++++++++++++++
  ,deliveryTbody = $('.orderStageDeliveryListTable tbody[rel="' + deliveryId + '"]')
  ,deliveryBlock = deliveryTbody.find('#deliveryId' + deliveryId)
  ,deliveryZonePriceBlock = deliveryTbody.find('.orderStageDeliveryZonePrice')  // ++++++++++++++++++++++++
  ,deliveryDefaultPriceBlock = deliveryTbody.find('.orderStageDeliveryDefaultPrice')  // ++++++++++++++++++++++++
;

// Если этот пункт уже выбран, при повторном клике пользователь видимо хочет снять выделение зоны доставки
if('true' == $(this).attr('rel')) {
  $(this).attr('checked', false);
  $(this).attr('rel', 'false');

  // Показываем цену по умолчанию
  deliveryDefaultPriceBlock.show();
  // Скрываем цену образованную от зоны
  deliveryZonePriceBlock.hide();

// Отмечаем у всех радио баттонов зон доставки свойство говорящее что они не отмечены
} else {
  $('.deliveryZoneRadio').attr('rel', 'false');
  $(this).attr('rel', 'true');

  // Показываем цену по умолчанию
  deliveryDefaultPriceBlock.hide();
  // Скрываем цену образованную от зоны
  deliveryZonePriceBlock.show().html(deliveryZonePrice.html());

  // Выделяем вариант доставки к которому относится зона доставки
  deliveryBlock.attr('checked', true);
}

  });

   $("#deliveryConvenientDate").datepicker({
   dayNames : ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'],
dayNamesMin   : ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб' ],
closeText : 'Готово',
currentText   : 'Сегодня' ,
duration : '',
monthNames   : ['Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
monthNamesShort : ['Янв','Фев','Март','Апр','Май','Июнь','Июль','Авг','Сен','Окт','Ноя','Дек'],
yearRange : "-6:+6",
dateFormat   : 'dd.mm.yy',
minDate : new Date(),
firstDay : 1
});
});

$(function()  {
  setTimeout(function() {
var maxprice = 0;
$('.goodsDataMainModificationsList').each(function() {
var rest = parseInt($(this).find('[name="rest_value"]').val());
var price = parseFloat($(this).find('[name="price_now"]').val());
if(rest && price > maxprice) {
  maxprice = price;
  var id = $(this).attr('rel').split('_');
  var block = $('.goodsDataMainModificationsBlockProperty');
  $('.goodsDataMainModificationsBlockProperty select option').removeAttr('selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').attr('selected', 'selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[1] + '"]').attr('selected', 'selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').parent().trigger('change');
}
});
  }, 600);
});
Здравствуйте.
Сделайте бэкап нынешней модификации шаблона, после сделайте восстановление до того места где всё работало.

#7 OPEX

OPEX

    Пользователь

  • Пользователи
  • PipPip
  • 16 сообщений

Отправлено 20 Август 2014 - 13:36

Просмотр сообщенияbatta (20 Август 2014 - 12:20) писал:

Здравствуйте.
Сделайте бэкап нынешней модификации шаблона, после сделайте восстановление до того места где всё работало.

Так у меня не работает только последний код:

$(function()  {
  setTimeout(function() {
var maxprice = 0;
$('.goodsDataMainModificationsList').each(function() {
var rest = parseInt($(this).find('[name="rest_value"]').val());
var price = parseFloat($(this).find('[name="price_now"]').val());
if(rest && price > maxprice) {
  maxprice = price;
  var id = $(this).attr('rel').split('_');
  var block = $('.goodsDataMainModificationsBlockProperty');
  $('.goodsDataMainModificationsBlockProperty select option').removeAttr('selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').attr('selected', 'selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[1] + '"]').attr('selected', 'selected');
  $('.goodsDataMainModificationsBlockProperty select option[value="' + id[0] + '"]').parent().trigger('change');
}
});
  }, 600);
});

который по идее  (как я понял)  должен делать так, чтобы выводилась по умолчанию модификация которая есть в наличии.  Но его вставляю в конце  main.js и ничего не меняется.

#8 Сake

Сake

    Активный участник

  • Модератоpы
  • 5 979 сообщений

Отправлено 21 Август 2014 - 00:34

Проблема в структуре используемого вами шаблона. Вам необходимо строку

$('.goodsDataMainModificationsList').each(function() {

в используемом коде заменить на

$('.ModificationsList').each(function() {

После этого код будет работать.

#9 OPEX

OPEX

    Пользователь

  • Пользователи
  • PipPip
  • 16 сообщений

Отправлено 21 Август 2014 - 07:52

Просмотр сообщенияСake (21 Август 2014 - 00:34) писал:

Проблема в структуре используемого вами шаблона. Вам необходимо строку

$('.goodsDataMainModificationsList').each(function() {

в используемом коде заменить на

$('.ModificationsList').each(function() {

После этого код будет работать.



Спасибо большое! Работает!

#10 Alexvik1982

Alexvik1982

    Новичок

  • Пользователи
  • Pip
  • 8 сообщений

Отправлено 09 Октябрь 2015 - 21:58

Просмотр сообщенияOPEX (18 Август 2014 - 11:01) писал:

Здравствуйте. У меня возникла проблема решение которой на форуме не нашел. Проблема:
У товара несколько модификаций (в моем случае вкус) какие то модификации есть в наличии каких то нет. Но когда посетитель сайта переходит на страницу товара то у товара автоматически выбирается модификация, которой нет в наличии (как я понимаю потому что она была создана первой) и соответственно у товара надпись "Нет в наличии" . У посетителя складывается впечатление. что товара нет вообще. Можно ли сделать так чтобы первой у товар выводилась модификация которая есть в наличии или которой самое большое количество?
Здравствуйте столкнулся с данной проблемой тоже. Как вариант нашел следующий выход: в шаблоне main.css в коде .noavalible{padding:10px;
background:rgb(197, 81, 128);margin:0 auto;color:white;font-weight:bold;} поменял цветовую палитру некликабельной кнопки "Под заказ". Получилось -  .noavalible{padding:10px;

background:rgb(255, 255, 255);margin:0 auto;color:white;font-weight:bold;} кнопка в этом случае полностью сливается с фоном, а покупатель кликая по миниатюре витрины товара попадает на корректную страницу на которой может выбрать цвет, размер, производителя и т.п. и сделать товар тех вещей которые есть в наличии. Надеюсь это Вам поможет. )

#11 lenasmith

lenasmith

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 166 сообщений
  • ГородМосква

Отправлено 28 Январь 2016 - 14:54

Здравствуйте, Подскажите, пожалуйста, как сделать так, чтобы красный ярлычок с надписью ТОВАРА НЕТ в наличии вообще не показывался? а Зеленый (ТОВАР ЕСТЬ в наличии) пусть останется.

#12 Юля123

Юля123

    Активный участник

  • Пользователи
  • PipPipPipPip
  • 2 567 сообщений

Отправлено 28 Январь 2016 - 15:00

Просмотр сообщенияlenasmith (28 Январь 2016 - 14:54) писал:

Здравствуйте, Подскажите, пожалуйста, как сделать так, чтобы красный ярлычок с надписью ТОВАРА НЕТ в наличии вообще не показывался? а Зеленый (ТОВАР ЕСТЬ в наличии) пусть останется.

Здравствуйте, изменения требуются для аккаунта  SL-220182?

В шаблоне Товар удалите код:

		  <span rel="false" class="available-false" {% IF GOODS_MOD_REST_VALUE>0 %}style="display:none;"{% ENDIF %}>
			<div class="stikno"></div>
		  </span>


#13 lenasmith

lenasmith

    Продвинутый пользователь

  • Пользователи
  • PipPipPip
  • 166 сообщений
  • ГородМосква

Отправлено 28 Январь 2016 - 15:09

Извините, пожалуйста, не написала для какого аккаунта и сайта
Аккаунт SL-220182


Просмотр сообщенияЮля123 (28 Январь 2016 - 15:00) писал:

Здравствуйте, изменения требуются для аккаунта  SL-220182?

В шаблоне Товар удалите код:

		 <span rel="false" class="available-false" {% IF GOODS_MOD_REST_VALUE>0 %}style="display:none;"{% ENDIF %}>
		 <div class="stikno"></div>
		 </span>
Спасибо! Все получилось!




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных