При добавлении дополнительного уровня вложенности на странице категорий отображаются все категории, включая дочерние

Я добавил ещё один уровень вложенности категорий. Однако при добавлении подкатегорий к дочерней категории все эти категории отображаются на главной странице. Я планирую создать около 100 категорий, которые должны отображаться на главной странице. В каждой подкатегории будет по 30–50 подразделов. Сейчас все категории отображаются на одной странице. Я не нашёл настроек для скрытия категорий второго уровня вложенности на главной странице.

Необходимо добавить настройку «показывать только дочерние категории», чтобы на главной странице не отображалось всё дерево категорий. Иначе категории второго и третьего уровня вложенности всегда будут отображаться на главной странице. А если их тысячи?

3 лайка

Обычно считается плохой идеей иметь более нескольких сотен категорий. Возможно, стоит взглянуть на Пришло время поговорить о тегах. Функция вложенных подкатегорий, насколько мне известно, в значительной степени не поддерживается, но, возможно, существует способ скрыть их так, как вам нужно.

2 лайка

Теги не так структурированы, как иерархия категорий. Функция подкатегорий поддерживается уже давно, и её следует включать отдельно. Однако отображается всё дерево категорий целиком. Например, для NodeBB всё работает корректно: на странице отображаются дочерние подкатегории, но не показываются категории более глубокого уровня вложенности.

3 лайка

Кто-нибудь уже решил эту проблему? @Johani, ты можешь мне помочь?

1 лайк

То, что вы ищете, определяется свойством isGrandParent в шаблоне здесь:

discourse/app/assets/javascripts/discourse/app/templates/components/parent-category-row.hbs at 1472e47aae5bfdfb6fd9abfe89beb186c751f514 · discourse/discourse · GitHub

Если у категории есть внучатые категории, мы рендерим соответствующую разметку для них. В противном случае рендерятся дочерние категории.

Самый простой способ обойти это — переопределить это свойство в компоненте Ember parent-category-row.

Это можно сделать с помощью метода плагина modifyClass.

Developing Discourse Themes & Theme Components

modifyClass позволяет переоткрыть класс компонента parent-category-row и добавить новые методы.

Чтобы эти методы сработали и данные были доступны, необходимо подключить их к хуку didReceiveAttrs.

Для этого можно использовать встроенный декоратор @on.

Когда всё готово, вы можете просто переопределить isGrandParent для всех категорий, рендеримых через шаблон этого компонента, и установить их значение в false.

Вот как это выглядит в сборе:

<script type="text/discourse-plugin" version="0.8">
  const { on } = require("discourse-common/utils/decorators");

  api.modifyClass("component:parent-category-row", {
    @on("didReceiveAttrs")
    removeGrandchildCategories() {
      this.category?.set("isGrandParent", false);
    }
  });
</script>

Добавьте этот код на вкладку header вашей темы в разделе common.

Это приведёт к тому, что шаблон будет рендерить только дочерние категории и игнорировать внучатые.

Вы можете использовать этот же подход для изменения любого свойства в любом компоненте.

2 лайка