Недоступные варианты фильтров не перемещаются в конец списка

Где возникла проблема: CS-Cart Ultimate 4.12.1

Суть проблемы: При выборе любого фильтра недоступные варианты теперь не перемещаются в конец списка. Стало очень неудобно пользоваться фильтрами.

Как воспроизвести проблему: Просто применить фильтр и посмотреть на список вариантов. На dev.demo.cs-cart.ru воспроизводится:

Временное решение. В app/functions/fn.filters.php найти код (1379 строка):

foreach ($filters[$filter_id]['variants'] as $variant_id => $v) {
	if (empty($available_variants[$filter_id]['variants'][$variant_id])) {
		$filters[$filter_id]['variants'][$variant_id]['disabled'] = true;
	}
}

и заменить его на:

foreach ($filters[$filter_id]['variants'] as $variant_id => $v) {
	if (empty($available_variants[$filter_id]['variants'][$variant_id])) {
		unset($filters[$filter_id]['variants'][$variant_id]);
		$v['disabled'] = true;
		$filters[$filter_id]['variants'][$variant_id] = $v;
	}
}

UPD: дополнительно надо заменить код со строки 1371:

if (!empty($filters[$filter_id]['variants'][$variant_id])) {
	$filters[$filter_id]['variants'][$variant_id]['selected'] = true;
	$filters[$filter_id]['selected_variants'][$variant_id] = $filters[$filter_id]['variants'][$variant_id];
}

на:

if (!empty($filters[$filter_id]['variants'][$variant_id])) {
	$filters[$filter_id]['selected_variants'][$variant_id] = $filters[$filter_id]['variants'][$variant_id];
	unset($filters[$filter_id]['variants'][$variant_id]);
}
5 лайков

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

1 лайк

Фикс бага – до 45 дней.
Добавление опциональности – до бесконечности.

1 лайк

Кто-нибудь знает исправили проблему в 4.12.2 ?
В списке изменений не нашёл ничего.

Пока багом не признано, я так понимаю

Присоединяюсь. Тоже начали жаловаться и клиенты и менеджеры.

Помогите плиз.
на 4.12.2 на 1379 совсем другой код. Как его поменять?

// If we selected any variants in filter, disabled unavailable variants
            foreach (array_keys($filters[$filter_id]['variants']) as $variant_id) {
                if (
                    !empty($available_variants)
                    && isset($available_variants[$filter_id])
                    && (
                        empty($available_variants)
                        || empty($available_variants[$filter_id])
                        || !empty($available_variants[$filter_id]['variants'][$variant_id])
                    )
                ) {
                    continue;
                }

                $filters[$filter_id]['variants'][$variant_id]['disabled'] = true;
            }

Можно заменить

$filters[$filter_id]['variants'][$variant_id]['disabled'] = true;

на

if (!empty($available_variants) && !empty($available_variants[$filter_id])) {
	foreach ($filters[$filter_id]['variants'] as $variant_id => $v) {
		if (empty($available_variants[$filter_id]['variants'][$variant_id])) {
			unset($filters[$filter_id]['variants'][$variant_id]);
			$v['disabled'] = true;
			$filters[$filter_id]['variants'][$variant_id] = $v;
		}
	}
}

И вот эту часть делать не нужно, вызывает конфликт с tpl-шаблоном фильтров:

1 лайк

:+1: Работает! Спасибо!
Активные / Доступные варианты фильтра переместить вверх - текст, чтоб в след раз найти поиском)