На рассмотрении

+2

Многомерные комплектации. Добавление CSS класса к характеристикам с 0 остатком.

Денис Ефремов Обновлен 5 лет назад в категории CMS Общий функционал 0

Вопрос уже поднимался. Суть его в том, чтобы добавлять к характеристикам многомерных комплектаций на карточке товара класс .empty

Ждал я долго, думал что вы напишете, но клиент потребовал реализации и пришлось писать. Заморочка, конечно, была та еще.

В общем, вот 2 метода, которые нужно добавить в jquery.changeoffer.js, а затем вызвать первый метод в конце changeMultiOffer таким образом - checkEmptyOffers(selected):


/**
* Вычисляем характеристики, для которых нет в наличии товаров
* @param {obj} selected Массив выбранных характеристик checkEmptyOffers
*/
checkEmptyOffers = function(selected) {
// Из массива выбранного делаем объекты данных для каждой хар-ки отдельно
selected.forEach(function(el, i) {
// Исключаем выбранное значение из возможных
var t = selected.filter(function(v, idx) {
return idx != i;
});
disableOptions({ // готовим объект и передаем его метод для изменения DOM
name: el.title, // имя хар-ки по которой проходим
activeValue: el.value, // выбранное значение хар-ки
disabled: [], // сюда отфильтруются только нулевые остатки из всех siblings (ниже)
// фильтруем компл, оставим только актуальные для выбранных значений
siblings: data.options.multiOffersInfo.filter(function(v) {
// здесь ишем чтобы не совпадало с выбранной по которой проходим но совпадало с
return v.info.every(function(a) { // выбранными остальными
return (a[0] == el.title && a[1] != el.value) || t.some(function(o) {
return JSON.stringify(o) === JSON.stringify({ // объекты только так сравнивать)))
title: a[0],
value: a[1]
});
});
});
})
});
});
},
// @TODO перенести формирование disabled в метод checkEmptyOffers, тк disableOptions должен только DOM заниматься
// @TODO избавиться от промежуточного siblings.


/**
* Зачеркиваем характеристики
* @param {obj} data Массив данных
*/
disableOptions = function(d) {
var $listEl = $('[data-prop-title="' + d.name + '"]'),
$items,
getValueByName = function(name, info) { // хелпер. @TODO вынести объявление рядом с in_array()
return info.filter(function(ar) {
return ar[0] == name;
})[0][1];
};
d.disabled = d.siblings.filter(function(s) { // сюда фильтруем только остатки 0
s.title = d.name;
s.value = getValueByName(s.title, s.info);
return s.num < 1;
}); // @TODO этот фильтр в checkEmptyOffers вместо siblings

// Далее нужно получить набор $items $(jQuery(obj))
$items = getItems

// И само зачеркивание
$items.removeClass('empty');
d.disabled.forEach(function(val) {
$items.each(function(i, el) {
var _this = $(this);
if (_this.text().trim() == val.value) {
_this.addClass('empty');
}
});
});
},


Конечно не круто, то что вложенных циклов много, но другого я не придумал пока. Что-то не лезет в голову ничего изящнее)
Думаю, что после доработок, неплохо было бы его включить в коробку.

Комментарии 0

Написать сообщение