Меню

Показать выбранные параметры умного фильтра над товарами, с возможностью отмены выбора

RSS
Показать выбранные параметры умного фильтра над товарами, с возможностью отмены выбора
 
Показать выбранные параметры умного фильтра над товарами, с возможностью отмены выбора

Задача: При выборе параметров товаров в умном фильтре показать выбранные параметры из чекбоксов в виде кнопок и предоставить возможность отмены выбора, кликая по этим кнопкам.
 
Михаил, добрый день. Очень полезная функция.
Но кнопки с выбранными параметрами появляются и сразу исчезают, если включен режим Ajax в каталоге.
Если Ajax выключить, то кнопки не исчезают, но и не отрабатывают на удаление.
 
Под Ajax режим да, надо докручивать этот способ, возможно позже допишу в заметку.

А вот почему не отрабатывают на удаление затрудняюсь сказать, проверил на одном проекте - все нормально. Попробуйте в консоли поизучать на конфликты, может с каким-то другим скриптом конфликтует у вас.
Изменено: Михаил Базаров - 28.11.2023 17:07:49
 
Цитата
Алексей написал:
Михаил, добрый день. Очень полезная функция.
Но кнопки с выбранными параметрами появляются и сразу исчезают, если включен режим Ajax в каталоге.
Если Ajax выключить, то кнопки не исчезают, но и не отрабатывают на удаление.
Для того, чтобы работало без включенного ajax, можно немного изменить логику и работать с параметрами url, которые передает фильтр. Но для этого надо немного доработать шаблон самого умного фильтра. Там, где идет foreach с чекбоксами, в тег input надо добавить заполнение дата-атрибута data-url:
Код
data-url="<?= $ar['URL_ID']; ?>
После этого можно изменить функцию removeCheckboxAndClickSubmit из кода, который приводил Михаил
Код
    function removeCheckboxAndClickSubmit(button) {
        button.remove();
        const url = new URL(window.location).toString();
        const itemUrl = button.getAttribute('data-url');
        let newUrl;

        if (url.includes(`-${itemUrl}-or`)) {
            newUrl = url.replace(`-${itemUrl}-or`, '');
        } else {
            if (url.includes(`-or-${itemUrl}`)) {
                newUrl = url.replace(`-or-${itemUrl}`, '');
            } 
            else {
                newUrl = url.replace(`-${itemUrl}`, '');
            }
        }

        window.location.replace(newUrl);
    }

Этот код теперь становится нам не нужен, его можно просто удалить или закомментировать:
Код
    checkboxes.forEach((checkbox) => {        checkbox.addEventListener('change', function () {
            const buttonId = this.id;
            const existingButton = checkedItemsContainer.querySelector(`#${buttonId}`);

            if (this.checked) {
                if (!existingButton) {
                    const button = document.createElement('button');
                    button.id = buttonId;
                    button.textContent = this.nextElementSibling.querySelector('span').textContent;
                    checkedItemsContainer.appendChild(button);
                }
            } else {
                if (existingButton) {
                    existingButton.remove();
                }
            }
        });
    });
Изменено: Михаил Базаров - 02.12.2023 17:14:38
 
Проверил. Страница просто перезагружается и свойство не удаляется.

"url" и "itemUrl" приходят пустые. В итоге "newUrl" не изменяется при клике на кнопку.
 
Понял, что кнопкам тоже нужно передавать атрибут "data-url"

Поэтому код выглядит так и вроде работает:
Код
const checkboxes = document.querySelectorAll('input[type="checkbox"]');
const checkedItemsContainer = document.querySelector('.smart_filter_checked_items');

function removeCheckboxAndClickSubmit(button) {
        button.remove();
        const url = new URL(window.location).toString();
        const itemUrl = button.getAttribute('data-url'); // берем атрибут у кнопки, чтобу удалить из урл
        let newUrl;

        if (url.includes(`-${itemUrl}-or`)) {
            newUrl = url.replace(`-${itemUrl}-or`, '');
        } else {
            if (url.includes(`-is-${itemUrl}`)) { // тут изменение,т.к. у меня 'is' встречается чаще чем 'or'
                newUrl = url.replace(`-is-${itemUrl}`, '');
            } 
            else {
                newUrl = url.replace(`-${itemUrl}`, '');
            }
        }

        window.location.replace(newUrl);
   console.log(itemUrl);
}

checkedItemsContainer.addEventListener('click', (event) => {
    if (event.target.tagName === 'BUTTON') {
        removeCheckboxAndClickSubmit(event.target);
    }
});

function addCheckedButtonsOnLoad() {
    checkboxes.forEach((checkbox) => {
        if (checkbox.checked) {
            const buttonId = checkbox.id;
            const buttonData = checkbox.getAttribute('data-url'); // берем атрибуты у input checkbox
            const existingButton = checkedItemsContainer.querySelector(`#${buttonId}`);

            if (!existingButton) {
                const button = document.createElement('button');
                button.id = buttonId;
                button.textContent = checkbox.parentElement.querySelector('span').textContent; // тут изменение,т.к. у меня больше span в label
                button.setAttribute('data-url', buttonData); // добавляем атрибуты ко кнопкам
                checkedItemsContainer.appendChild(button);
            }
   console.log(buttonData);
        }
    });
}

addCheckedButtonsOnLoad();

Ну и вверху забыли ковычку в коде:

Там, где идет foreach с чекбоксами, в тег input надо добавить заполнение дата-атрибута data-url: data-url="<?= $ar['URL_ID']; ?>"
Изменено: Михаил Базаров - 05.12.2023 14:27:26
 
Алексей, точно, извиняюсь, упустил этот момент
 
Думаю умеет смысл уточнить, что для приведенного примера блок с классом .smart_filter_checked_items должен быть вставлен после вывода всех чекбоксов, например после вызова фильтра. Если он будет вызван ДО, то будет конфликт и чекбоксы будут работать некорректно.
 
Сделал легкий рефакторинг, может пригодится кому smart.mobile.filter
Читают тему
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Bst

Блог-note: заметки разработчика

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Установить цену товара из свойства инфоблока

На одном из проектов, нужно было единоразово заполнить цены товаров из свойства инфоблока. Сделать это можно через API, ...

Почтовое событие на создание нового элемента инфоблока, через API

Иногда при разработке сайта требуется реализовать функционал добавления элементов инфоблока простыми пользователям.Будет...

Заполнение габаритов товара, после обмена с 1С, из свойств элемента инфоблока.

Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1С не умеет выгружать параметры...

Очистка корзины в 1С-Битрикс одним нажатием

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

Самодельная форма добавления элемента на API Битрикс

Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как уг...

Получить список элементов инфоблока с ценами с помощью D7

Задача: использовать D7 в 1С-Битрикс для получения списка элементов инфоблока вместе с их ценами. Это может быть полезно...

Как вывести свойства инфоблока по отдельности и немного плюшек не в тему

Если у инфоблока несколько свойств- то при выводе их всех, скажем в детальном описании новости, они выводятся все вместе...

Связанные элементы в карточке товара, с помощью catalog.section

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