05.11.2019, 15:48
|
Интересующийся
|
|
Регистрация: 30.10.2019
Сообщений: 19
|
|
Сообщение от laimas
|
А корзина что "в облаках витает"? Если страница содержит корзину, то есть, есть товары добавленные, то зачем же ее дублировать?
Не работать может только потому, что вы не так или не к тому обращаетесь, пример показанный это подтверждает.
Кто формирует корзину? Если это делает сервер при каждом запросе страницы, то ему не сложно при выводе кода страницы и корзины на ней, определить товар в корзине и прописать класс/текст кнопке. Если корзина хранится у клиента или он ее получает отдельным запросом после загрузки страницы, значит нужно взять массив товаров корзины, обойти их циклом, в котором кнопкам связанных с ними товаров присвоить класс и текст.
|
верно, корзина не витает в облаках), она хранится в локальном хранилище localStorage
>>> значит нужно взять массив товаров корзины, обойти их циклом, в котором кнопкам связанных с ними товаров присвоить класс и текст
___
сейчас попробую
|
|
05.11.2019, 15:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от sty-wolf
|
сейчас попробую
|
Пробуйте, но только это:
productsArr[sbId] ? $(this).addClass('button-active').find('span[data-sb-id-button]').text('Удалить в корзину') : $(this).removeClass('button-active').find('span[data-sb-id-button]').text('Добавить в корзину');
верно для события щелчка по кнопке, а для отметить кнопку цветом при загрузке страницы нужно иное действие, то есть
$('span[data-sb-id-button='+id+']').text('Удалить из корзины').closest('button').addClass('button-active');
где id, это текущий идентификатор товара в итерации, а button селектор кнопки.
|
|
05.11.2019, 16:13
|
Интересующийся
|
|
Регистрация: 30.10.2019
Сообщений: 19
|
|
получается вот это нужно загнать в цикл?
productsArr[sbId] ? $(this).addClass('button-active').find('span[data-sb-id-button]').text('Удалить в корзину') : $(this).removeClass('button-active').find('span[data-sb-id-button]').text('Добавить в корзину');
for(leti=0; i<productsArr[sbId].length; i++) {
productsArr[sbId] ? $(this).addClass('button-active').find('span[data-sb-id-button]').text('Удалить в корзину') : $(this).removeClass('button-active').find('span[data-sb-id-button]').text('Добавить в корзину');
}
Последний раз редактировалось sty-wolf, 05.11.2019 в 16:18.
|
|
05.11.2019, 16:29
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от sty-wolf
|
получается вот это нужно загнать в цикл?
|
Зачем? Когда выбирается/удаляется товар, вот тогда требуется определить класс/текст кнопке. А страница загружается с кнопками по умолчанию, то есть с не выбранными, следовательно нужно только добавить класс/текст для тех, товары которых есть в корзине.
Вы бы вместо картинок html код кнопки выставили, и структуру корзины описали, достаточно было бы пути в ней к товарам.
Если объект/массив корзины или свойство объекта корзины содержащего товары всегда на странице есть, но может быть пустым, то сначала проверяется не пуст ли объект. В противном случае проверяется наличие корзины на странице, и если доступно, только тогда обход товаров в цикле, вернее их идентификаторов.
Например, пусть условно корзина cart всегда на странице и под свойством products содержит объект с товарами, в котором первичные свойства это их идентификаторы. Тогда:
var cart = {
products: {
'23': {
name: 'name',
count: 2
},
'67': {
name: 'name',
count: 2
}
}
};
var ids = Object.keys(cart.products); //получить идентификаторы товаров
if(ids.length) { //если есть товары в корзине
ids.forEach((id) => {
$('span[data-sb-id-button='+id+']').text('Удалить из корзины').closest('button').addClass('button-active') //пометить кнопку товара
})
}
Если товары, это массив объектов, в которых есть свойство содержащее идентификатор товара, то выбор несколько иной будет.
|
|
05.11.2019, 16:34
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Судя по картинке, логика добавления/удаления товара в корзину означает, что даже условия:
товар в корзине ? красная : синяя
вообще не потребуется.
|
|
05.11.2019, 16:48
|
Интересующийся
|
|
Регистрация: 30.10.2019
Сообщений: 19
|
|
получается вместо prodacts будет basketItems
Снимок.JPG
|
|
05.11.2019, 17:06
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от sty-wolf
|
получается вместо prodacts будет basketItems
|
если basketItems, то как показано ранее:
var ids = Object.keys(basketItems); //получить идентификаторы товаров
....
и если это непосредственно и требует проверки наличия, то сразу:
Object.keys(basketItems).forEach((id) => {
$('span[data-sb-id-button='+id+']').text('Удалить из корзины').closest('button').addClass('button-active') //пометить кнопку товара
})
}
|
|
05.11.2019, 17:12
|
Интересующийся
|
|
Регистрация: 30.10.2019
Сообщений: 19
|
|
вот так работает, т.е меняет цвет при нажатии на кнопку
Object.keys(basketItems).forEach((id) => {
$('span[data-sb-id-button='+sbId+']').text('Удалить из корзины').closest('button').addClass('button-active') //пометить кнопку товара
});
но все равно сбрасывается после перезагрузки страницы... если прописывать просто по id $('span[data-sb-id-button='+Id+']'), то не срабатывает смена цвета кнопки
|
|
05.11.2019, 17:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от sty-wolf
|
вот так работает, т.е меняет цвет при нажатии на кнопку
|
А зачем эта операция при нажатии на кнопку?
Есть поле выбора количества товаров. Есть кнопка добавить в корзину.
При выборе количества должен проверяться лимит, величина которого должна определяться полем, ибо в корзине такого товара еще нет, и какого черта этот лимит прописан в корзине я не знаю. Соответствие количества лимиту должен проверять и сервер, а делать это он должен ни как не потому, что ему сообщит клиент. Если это держать в корзине, то как параметр для всех товаров, а не для каждого индивидуально, потому как в таком случае это полнейший бред. И, допустим, что выбрать количество менее 1 шт. этим полем нельзя.
Щелчок по кнопке добавления в корзину добавляет/удаляет товар. То есть если один обработчик, то достаточно toggleClass и смена текста. Все, никакой проверки наличия в корзине не требуется. У вас в комнате по умолчанию свет выключен, следующий щелчок по выключателю зажжет его, следующий выключит и т.д. Вы же не станете рассуждать - "выключен свет, ага, значит если щелкну, то выключится" и наоборот. Так и с этой кнопкой.
И состояние кнопки не запоминается, да и нет его смысла запоминать, ибо ее состояние будет определяться наличием товара в корзине. И это нужно для того чтобы определить это состояние только во время загрузки страницы. Только тут нужно обходить циклом товаров корзины, а при нажатии на нее, это действие полный бред.
Сообщение от sty-wolf
|
если прописывать просто по id $('span[data-sb-id-button='+Id+']'), то не срабатывает смена цвета кнопки
|
Код кнопки показать не мешало бы, а то речь словно о неизвестных планетах.
Последний раз редактировалось laimas, 05.11.2019 в 18:02.
|
|
05.11.2019, 18:11
|
Интересующийся
|
|
Регистрация: 30.10.2019
Сообщений: 19
|
|
Сообщение от laimas
|
Код кнопки показать не мешало бы, а то речь словно о неизвестных планетах.
|
вот более развернуто как у меня это устроено
<div class="product">
<div class="product__list">
<div class="product__element">
<img class="product__img" src="smartbasket/img/pizza.png" alt="Пицца">
<div class="product__name">Пицца «Ветчина и грибы»</div>
<div class="product__price"><span class="product__price-number">320</span> Р</div>
<div class="product__size">
<div class="product__size-element" data-sb-curent-price="320" data-sb-curent-size="32" data-sb-curent-id-or-vendor-code="0032pz">32 см</div>
<div class="product__size-element" data-sb-curent-price="260" data-sb-curent-size="26" data-sb-curent-id-or-vendor-code="0026pz">26 см</div>
<div class="product__size-element" data-sb-curent-price="220" data-sb-curent-size="22" data-sb-curent-id-or-vendor-code="0022pz">22 см</div>
</div>
<div class="product__quantity"></div>
<button class="product__add-to-cart-button" data-sb-id-or-vendor-code="0032pz" data-sb-product-size="32" data-sb-product-name="Пицца «Ветчина и грибы»" data-sb-product-price="320" data-sb-product-quantity="1" data-sb-product-img="smartbasket/img/pizza.png">
<i class="fas fa-cart-plus"></i> <span data-sb-id-button="0032pz">Добавить в корзину</span>
</button>
</div>
<div class="product__element">
<img class="product__img" src="smartbasket/img/pizza2.png" alt="Пицца">
<div class="product__name">Пицца «Креветки и грибы»</div>
<div class="product__price"><span class="product__price-number">320</span> Р</div>
<div class="product__size">
<div class="product__size-element" data-sb-curent-price="320" data-sb-curent-size="32" data-sb-curent-id-or-vendor-code="1132pz">32 см</div>
<div class="product__size-element" data-sb-curent-price="260" data-sb-curent-size="26" data-sb-curent-id-or-vendor-code="1126pz">26 см</div>
<div class="product__size-element" data-sb-curent-price="160" data-sb-curent-size="16" data-sb-curent-id-or-vendor-code="1116pz">16 см</div>
</div>
<div class="product__quantity"></div>
<button class="product__add-to-cart-button" data-sb-id-or-vendor-code="1132pz" data-sb-product-size="32" data-sb-product-name="Пицца «Ветчина и грибы»" data-sb-product-price="320" data-sb-product-quantity="1" data-sb-product-img="smartbasket/img/pizza2.png">
<i class="fas fa-cart-plus"></i> <span data-sb-id-button="1132pz">Добавить в корзину</span>
</button>
</div>
<div class="product__element">
<img class="product__img" src="smartbasket/img/pizza3.png" alt="Пицца">
<div class="product__name">Пицца «Сыр,колбаса и оливки»</div>
<div class="product__price"><span class="product__price-number">520</span> Р</div>
<div class="product__size">
<div class="product__size-element" data-sb-curent-price="520" data-sb-curent-size="52" data-sb-curent-id-or-vendor-code="2252pz">52 см</div>
<div class="product__size-element" data-sb-curent-price="260" data-sb-curent-size="26" data-sb-curent-id-or-vendor-code="2226pz">26 см</div>
<div class="product__size-element" data-sb-curent-price="160" data-sb-curent-size="16" data-sb-curent-id-or-vendor-code="2216pz">16 см</div>
</div>
<div class="product__quantity"></div>
<button class="product__add-to-cart-button" data-sb-id-or-vendor-code="2252pz" data-sb-product-size="52" data-sb-product-name="Пицца «Ветчина и грибы»" data-sb-product-price="320" data-sb-product-quantity="1" data-sb-product-img="smartbasket/img/pizza3.png">
<i class="fas fa-cart-plus"></i> <span data-sb-id-button="2252pz">Добавить в корзину</span>
</button>
</div>
addToBasketButton.click(function () {
let productsArr = methods.getProducts() || {}; // получаем данные корзины или создаём новый объект, если данных еще нет
let sbId = $(this).attr("data-sb-id-or-vendor-code"); // ID товара
let getQuantity = 0; // количество товара начинаем считать с 0
let limitationInBasket = 3; // ограничение товара при добавлении в корзину
for (let key in productsArr) {
for (let value in productsArr[key]) {
if (value === 'sbQuantity') {
getQuantity += +productsArr[key][value];
}
}
}
productsArr[sbId] ? $(this).removeClass('button-active').find('span[data-sb-id-button]').text('Добавить в корзину') : $(this).addClass('button-active').find('span[data-sb-id-button]').text('Удалить в корзину');
if (productsArr[sbId]) {
// let beforeClickHtml = $(this).html();
// $(this).text('Товар уже в корзине');
// $('body').append(methods.alertBlock('alreadyAdded'));
// setTimeout(() => {
// $(this).html(beforeClickHtml);
// }, 1500);
// return false;
delete productsArr[sbId]; //Удаляем из массива
methods.setProducts(productsArr); //Обновляем хранилище
methods.getSmartBasketMinState(productsArr, 'updateSmartBasketMin'); // обновляем корзину
methods.commonResult(productsArr, 'updateCommonResult'); //обновляем общий результат
} else {
let productProperties = {};
productProperties.sbId = sbId;
productProperties.sbImg = $(this).data("sbProductImg");
productProperties.sbName = $(this).data("sbProductName");
if (defaults.productSize && defaults.productPrice) {
productProperties.sbSize = $(this).attr("data-sb-product-size");
}
if (defaults.productQuantityWrapper) {
productProperties.sbQuantity = $(this).parents('.' + defaults.productElement).find('.' + inputProductQuantity.attr('class')).val();
} else {
productProperties.sbQuantity = +$(this).data("sbProductQuantity");
}
productProperties.sbPrice = +$(this).attr("data-sb-product-price");
productProperties.sbPrice.toFixed(2);
if (defaults.productQuantityWrapper) {
productProperties.sbPriceCommon = +$(this).attr("data-sb-product-price") * $(this).parents('.' + defaults.productElement).find('.' + inputProductQuantity.attr('class')).val();
productProperties.sbPriceCommon.toFixed(2)
} else {
productProperties.sbPriceCommon = +$(this).attr("data-sb-product-price") * +$(this).data("sbProductQuantity");
productProperties.sbPriceCommon.toFixed(2)
}
// проверяем превышен лимит или нет
if ( limitationInBasket <= getQuantity) {
$('span[data-sb-id-button="'+sbId+'"]').text('Добавить в корзину');//Меняем текст
$(this).removeClass('button-active'); // удалить цвет
$('body').append(methods.alertBlock('limitationInBasket'));
} else { // иначе товар добавлен в корзину
productsArr[sbId] = productProperties;
methods.setProducts(productsArr); //записываем в localStore
smartBasket.empty(); // проверка пустой переменной
smartBasket.append(methods.showProducts(productsArr));
methods.getSmartBasketMinState(productsArr, 'updateSmartBasketMin');
methods.commonResult(productsArr, 'updateCommonResult');
}
}
});
return smartBasket;
},
Последний раз редактировалось sty-wolf, 05.11.2019 в 18:16.
|
|
|
|