Автор Тема: Изменить Blocklayered, чтобы выбрать только один цвет (отменить предыдущий цвет)  (Прочитано 81 раз)

24 Январь 2018, 10:38:17
  • Старожил
  • ****
  • Сообщений: 391
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Подскажите с чего начать?
Требуется доработать модуль blocklayered.
В обычном режиме мы можем выбрать несколько цветов при фильтрации продуктов, мне нужно изменить его,
чтобы клиент не выбирал больше одного цвета ...

если клиент выбирает другой цвет, первый цвет должен быть отменен ...
24 Январь 2018, 11:25:38
Ответ #1
  • Старожил
  • ****
  • Сообщений: 367
  • Репутация: +2/-0
  • Сообщество PrestaShop
    • Просмотр профиля
24 Январь 2018, 11:52:59
Ответ #2
  • Старожил
  • ****
  • Сообщений: 391
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
в фильтре advansedsearch есть такая возможность

Спасибо, но решение необходимо для blocklayered.
24 Январь 2018, 12:03:49
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1145
  • Репутация: +5/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Фильтры выбираются в blocklayered.js в нем есть функция /*Click on color*/ при клике можно спрятать  блок color-group.
24 Январь 2018, 12:24:28
Ответ #4
  • Старожил
  • ****
  • Сообщений: 391
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Фильтры выбираются в blocklayered.js в нем есть функция /*Click on color*/ при клике можно спрятать  блок color-group.

Спасибо,
да это я сделаю.

Как запретить выбор нескольких цветов в самом фильтре либо отменить предыдущий цвет?

24 Январь 2018, 12:25:24
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 15144
  • Репутация: +14589/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Фильтры выбираются в blocklayered.js в нем есть функция /*Click on color*/ при клике можно спрятать  блок color-group.
Прятать то зачем? Добавить сброс всех выбранных фильтров цвета remove() и дальше по дефолту выбор нового.

Как запретить выбор нескольких цветов в самом фильтре либо отменить предыдущий цвет?
Не нужно запрещать. Вам же выбор только одного нужен. Сброс выбраного значения перед инициализацией добавьте.
Функция сброса уже есть remove().
24 Январь 2018, 12:32:50
Ответ #6
  • Старожил
  • ****
  • Сообщений: 391
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Фильтры выбираются в blocklayered.js в нем есть функция /*Click on color*/ при клике можно спрятать  блок color-group.
Прятать то зачем? Добавить сброс всех выбранных фильтров цвета remove() и дальше по дефолту выбор нового.

Как запретить выбор нескольких цветов в самом фильтре либо отменить предыдущий цвет?
Не нужно запрещать. Вам же выбор только одного нужен. Сброс выбраного значения перед инициализацией добавьте.
Функция сброса уже есть remove().

Спасибо за подсказку.

Как я понял вся магия происходит здесь blocklayered.js
При клике на цвет в фильтре срабатывает вот этот момент:
За перерисовку отвечает: reloadContent(true);
$(document).on('click', '#layered_form input[type=button]', function(e) {
if (!$('input[name='+$(this).attr('name')+'][type=hidden]').length)
{
$('<input />').attr('type', 'hidden').attr('name', $(this).attr('name')).val($(this).data('rel')).appendTo('#layered_form');
}
else
$('input[name='+$(this).attr('name')+'][type=hidden]').remove();
reloadContent(true);
});

По Remove Вы предлагаете вот это?:
$('input[name='+$(this).attr('name')+'][type=hidden]').remove();
24 Январь 2018, 13:11:18
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 15144
  • Репутация: +14589/-5
  • Сообщество PrestaShop
    • Просмотр профиля
$(document).on('click', '#layered_form input[type=button]', function(e) {
        // определить ид группы атрибутов цвета
        // в div#enabled_filters по ид найти элемент
        // вызвать cancelFilter() с ид найденого элемента

        if (!$('input[name='+$(this).attr('name')+'][type=hidden]').length)
...
Вот так, осталось только в код перевести.
24 Январь 2018, 13:49:25
Ответ #8
  • Старожил
  • ****
  • Сообщений: 391
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Спасибо, хорошая идея..

Вся магия в этой строке:
$('#layered_form input[type=hidden][name='+$(this).data('rel')+']').remove();
reloadContent(true);
e.preventDefault();

Главное указать правильный '+$(this).data('rel')+']' для удаления цвета.

Я правильно понял?
24 Январь 2018, 14:15:39
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 15144
  • Репутация: +14589/-5
  • Сообщество PrestaShop
    • Просмотр профиля
$(this) - не нужен, так как элемент не выбирается
reloadContent(true) - не нужна, так как в конце функции эта вызыывается, два раза перегружать контент ненужно
24 Январь 2018, 15:34:29
Ответ #10
  • Старожил
  • ****
  • Сообщений: 391
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$(this) - не нужен, так как элемент не выбирается
reloadContent(true) - не нужна, так как в конце функции эта вызыывается, два раза перегружать контент ненужно

Ещё раз спасибо,

В итоге вот что получилось, в blocklayered.js

$(document).on('click', '#layered_form input[type=button]', function(e) {
$('#layered_form #enabled_filters a').each(function () {
var attr = $(this).attr("data-rel");
if(attr.indexOf('id_attribute') + 1)
{
$('#layered_form input[type=hidden][name='+attr+']').remove();
}
});
if (!$('input[name='+$(this).attr('name')+'][type=hidden]').length)
{
$('<input />').attr('type', 'hidden').attr('name', $(this).attr('name')).val($(this).data('rel')).appendTo('#layered_form');
}
else
$('input[name='+$(this).attr('name')+'][type=hidden]').remove();
reloadContent(true);
});

Добавлены вот эти строки

$('#layered_form #enabled_filters a').each(function () {
var attr = $(this).attr("data-rel");
if(attr.indexOf('id_attribute') + 1)
{
$('#layered_form input[type=hidden][name='+attr+']').remove();
}
});

Вроде всё работает..