Тема: [Решение] Фильтр категорий EasyStore выводит все корневые папки (Исправление логики)
Всем привет!
Многие, кто использует EasyStore, после недавних обновлений (когда разработчики перевели базу на Nested Sets в версии 2.0) столкнулись с неприятным багом: модуль фильтра категорий на фронтенде перестал понимать контекст.
Теперь он всегда вываливает абсолютно все корневые категории магазина. Если у вас на сайте несколько непересекающихся разделов (например, "Одежда" и "Запчасти"), фильтр покажет их все в одной куче, что ломает навигацию.
Пока мы ждем официального патча от JoomShaper, предлагаю небольшое и универсальное исправление в коде компонента. Этот код делает фильтр «умным»:
- Если пользователь зашел в конкретную категорию — фильтр покажет только её подкатегории.
- Если пользователь находится на главной странице магазина (где нет выбранной категории), вы можете задать ID нужной вам папки, чтобы фильтр показал только её внутренности, спрятав остальные корневые разделы сайта.
Как применить фикс:
Шаг 1: Через FTP или панель хостинга откройте файл:
components/com_easystore/src/Helper/FilterHelper.php
Шаг 2: Найдите метод getCategories() (примерно 50-я строка). Внутри него найдите вот этот кусок кода:
Код:
$rootId = self::getRootCategoryId();
$selectedCategories = $app->input->get('filter_categories', '', 'STRING');
$selectedCategories = $selectedCategories ? explode(',', $selectedCategories) : [];
$query->where($db->quoteName('id') . ' <> ' . (int) $rootId);
$query->order($db->quoteName('lft') . ' ASC');
Шаг 3: Замените этот блок на следующий код:
Код:
$rootId = self::getRootCategoryId();
$selectedCategories = $app->input->get('filter_categories', '', 'STRING');
$selectedCategories = $selectedCategories ? explode(',', $selectedCategories) : [];
// --- ИСПРАВЛЕНИЕ КОНТЕКСТА КАТЕГОРИЙ ---
// Укажите ID вашей главной категории каталога, если хотите скрыть другие корневые папки на главной странице магазина.
// Оставьте 0, если хотите сохранить стандартное поведение на главной странице.
// Пример: $defaultCategoryId = 15;
$defaultCategoryId = 0;
if ($catid > 0 && $catid != $rootId) {
// 1. Мы внутри категории -> показываем только её подкатегории
$query->where($db->quoteName('parent_id') . ' = ' . (int) $catid);
} elseif ($defaultCategoryId > 0) {
// 2. Мы на главной -> показываем подкатегории выбранной категории по умолчанию
$query->where($db->quoteName('parent_id') . ' = ' . (int) $defaultCategoryId);
} else {
// 3. Стандартное поведение EasyStore (выводит всё)
$query->where($db->quoteName('id') . ' <> ' . (int) $rootId);
}
// --- КОНЕЦ ИСПРАВЛЕНИЯ ---
$query->order($db->quoteName('lft') . ' ASC');
Шаг 4: Сохраните файл и
обязательно очистите кэш Joomla.
Пара советов:
- В коде выше обратите внимание на переменную $defaultCategoryId = 0;. Вместо 0 вы можете вписать ID нужной вам категории (посмотреть можно в админке в списке категорий).
- Если после применения кода вы хотите получить просто ровный плоский список чекбоксов (как было в старых версиях), зайдите в настройки аддона Filter в SP Page Builder и отключите опцию Show Hierarchy.
Важно: Поскольку это хак ядра (core hack), при следующем обновлении EasyStore этот файл перезапишется на стандартный. Сохраните этот код себе в блокнот, чтобы можно было быстро вернуть его на место, если в обновлении разработчики так и не починят эту проблему.
Надеюсь, это сэкономит кому-то пару часов нервов!