Переопределить шаблон только на конкретной странице

Здравствуйте! Я настраиваю внешний вид своего форума Discourse в поле «Custom HTML» темы.
Я использую script type="text/x-handlebars" data-template-name="components/categories-only" и аналогичные конструкции для переопределения некоторых конкретных шаблонов. Существует ли способ переопределять их только на определённых страницах, например, на главной, и использовать другой код для просмотра подкатегорий?
Я всё ещё довольно новичок в Discourse, даже не уверен, что это правильный способ делать это через кастомный HTML/CSS в теме (я знаю, что эти изменения теряются при обновлении). Если кто-то сможет помочь, я буду очень признателен.


Сначала давайте проясним этот момент.

Это неверно: вы не теряете изменения при обновлении, если они внесены в тему. Они сохраняются. Вы теряете изменения только в том случае, если редактируете файлы напрямую на сервере, чего, разумеется, делать не следует.

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

Для начала вам нужно каким-то образом определять, находится ли пользователь на главной странице. В случае компонента «только категории» один из способов — проверить searchContext. Когда вы находитесь на странице подкатегории, контекст поиска устанавливается в значение «category». Если контекст поиска отсутствует, значит, вы находитесь на главной странице.

Чтобы передать эту информацию в шаблон, добавьте следующее:

<script type="text/discourse-plugin"
        version="0.8">
  const categoriesOnlyComponent = require('discourse/components/categories-only').default;
  categoriesOnlyComponent.reopen({
    isHomepage: function() {
      return !this.parentView.searchService.contextType
    }.property()
  });
</script>

Это позволяет использовать isHomepage в шаблоне для categories-only. Если контекст поиска отсутствует (то есть вы на главной странице), это возвращает true. В противном случае — false.

Далее вам нужно скопировать стандартный шаблон следующим образом:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
  ... остальная часть шаблона
  {{/if}}
</script>

и использовать добавленное свойство isHomepage. Для этого потребуется хелпер Handlebars {{#if}}. По сути, вам нужно что-то вроде этого:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
    {{#if isHomepage}}
      ... шаблон только для главной страницы
    {{else}}
    ... остальная часть стандартного шаблона, если вы не на главной странице
  {{/if}}
</script>

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

<script type='text/x-handlebars'
        data-template-name='components/categories-only-homepage'>
  <h1>Вы находитесь на главной странице!</h1>
  <p>
    Используйте эту секцию для отображения шаблона компонента «только категории», если пользователь находится на главной странице.
  </p>
</script>

Последний шаг — вызвать этот шаблон как частичный (partial) в шаблоне categories-only внутри секции isHomepage:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
    {{#if isHomepage}}
      {{partial 'components/categories-only-homepage'}}
    {{else}}
    ... остальная часть стандартного шаблона, если вы не на главной странице
  {{/if}}
</script>

В результате при посещении главной страницы вы увидите следующее:

а компонент на страницах подкатегорий останется без изменений.

Это необязательно, но вам может быть интересно также посмотреть:

поскольку это новый рекомендуемый способ работы с темами, позволяющий избежать использования тегов <script>.}

Потрясающе, большое спасибо! Теперь я тоже кое-как понимаю, как использовать text/discourse-plugin. Очень ценю вашу помощь!

Привет! У меня ещё один вопрос.Подскажите, пожалуйста, как получить самую свежую тему в конкретной подкатегории?Я могу использовать category.latestTopic, чтобы получить последнюю тему категории, но для подкатегорий это не работает. Есть ли какое-то умное решение?Мне нужно отображать последнюю тему подкатегории при выводе списка подкатегорий.