Список будет храниться в local storage браузера. При входе с другого устройства/браузера пользователь не увидит своего избранного.
Добавляем в блок, в котором будет выводиться количество товаров в избранном, необходимы атрибуты:
<span class="js_list_count" data-list="favorite" id="js_favorite_block">0</span>
Добавляем в кнопку “Добавить в избранное необходимые атрибуты”:
<span class="js_manage_list" data-list="favorite" data-type="add" data-id="<?=$id?>"></span>
Добавляем javascript переменные и функции для управления списком:
/** @type {string} class блока c количеством товара в сравнении или избранном */
const listCounterClass = '.js_list_count';
/** @type {string} class кнопки добавления/удаления в избранное, сравнение */
const listManageButtonClass = '.js_manage_list';
/** Проставляет количество товаров в сравнении, избранном и тп */
setListCount() {
$(document).find($(listCounterClass)).each(function () {
let count = 0;
const list = $(this).data('list');
const listArray = localStorage.getItem(list);
if (listArray !== null) {
count = JSON.parse(listArray).length;
}
$(this).text(count);
});
},
/** Проставляет состояние кнопок Сравнения, Избранного... */
setListButton() {
$(document).find($(listManageButtonClass)).each(function () {
const $this = $(this);
const id = $this.data('id');
// const type = $this.data('type');
const list = $this.data('list');
let listArray = localStorage.getItem(list);
if (listArray !== null) {
let newArray = JSON.parse(listArray);
let index;
for (let i = 0; i < newArray.length; i++) {
if (newArray[i] === id) {
index = i;
break;
}
}
if (index !== undefined) {
$this.data('type', 'remove');
$this.attr('title', getLabel(`js-title-remove-from-${list}`));
// $this.find('span').text(getLabel(`js-remove-from-${list}`));
$this.addClass('selected');
}
}
});
},
Добавляем листнер клика по кнопке добавления/удаления.
/** Инициализирует нажатие на ссылку добавления/удаления товара из сравнения, избранных и тп */
function initAddToLIstClickHandler() {
$(document).on('click', listManageButtonClass, function (e) {
e.preventDefault();
const $this = $(this);
$this.find('span').fadeOut(300);
const id = $this.data('id');
const type = $this.data('type');
const list = $this.data('list');
const blockId = `#js_${list}_block`;
let listArray = localStorage.getItem(list);
let newArray = [];
let count = 0;
let index;
// const link = $(this).attr('action');
if (type === 'add') {
if (listArray === null) {
newArray = [id];
count = 1;
} else {
newArray = JSON.parse(listArray);
for (let i = 0; i < newArray.length; i++) {
if (newArray[i] === id) {
index = i;
break;
}
}
if (index === undefined) {
newArray.push(id);
}
count = newArray.length;
}
} else if (type === 'remove') {
if (listArray !== null) {
newArray = JSON.parse(listArray);
for (let i = 0; i < newArray.length; i++) {
if (newArray[i] === id) {
index = i;
break;
}
}
if (index !== undefined) {
newArray.splice(index, 1);
}
count = newArray.length;
}
}
localStorage.setItem(list, JSON.stringify(newArray));
if ($(blockId).length) {
$(blockId).text(count);
}
if (type === 'add') {
$this.data('type', 'remove');
// $this.find('span').text(getLabel(`js-remove-from-${list}`));
// $this.attr('title', getLabel(`js-title-remove-from-${list}`)).tooltip('_fixTitle').tooltip('show');
} else {
$this.data('type', 'add');
// $this.find('span').text(getLabel(`js-add-to-${list}`));
// $this.attr('title', getLabel(`js-title-add-to-${list}`)).tooltip('_fixTitle').tooltip('show');
}
$this.toggleClass('selected');
return false;
});
}
При загрузке стрвницывызываем функции:
setListCount(); setListButton();
После ajax загрузки объектов вызываем:
setListButton();
Вывод списка на отдельной странице рассмотрим позднее.

Добавить комментарий