Отказ от ответственности для конкретной категории

Привет,

Я попытался добавить отказ от ответственности для конкретной категории. У меня возникла идея разместить «баннер» вроде:
Это первый пост пользователя — давайте поприветствуем нового участника в нашем сообществе!
или
Прошло уже много времени с тех пор, как мы видели пользователя — последний пост был год назад.
над каждым сообщением.

Я попытался реализовать это следующим образом:

common/head_tag.html
<script type="text/discourse-plugin" version="0.8">
  api.decorateWidget('post:after', (helper, args) => {
    if (args.topic.category_id === 51) {  // Моя категория
      const $post = helper.find('.cooked');
      const disclaimerText = api.decorateCooked(helper, args, settings.MY_DISCLAIMER);
      $post.prepend(`<div class="disclaimer">${disclaimerText}</div>`);
    }
  });
</script>

Для полноты картины вот настройки из файла:

settings.yml
MY_DISCLAIMER:
  type: string
  default: 'Это категория, которая предоставляется без гарантии и используется на ваш страх и риск.'
  description: Текст отказа от ответственности для категории

Также в файле common/common.scss определён класс .disclaimer.

Однако при активации этого кода само сообщение перестает отображаться, а область контента становится пустой.

Спасибо за любую помощь!

В исходном тексте тоже пусто?

Привет, добро пожаловать обратно!

Если вы видите пустое место, значит у вас ошибка. find не существует в helper.
Обычно это можно увидеть в консоли браузера (F12).

Вам, скорее всего, нужно что-то вроде этого:

api.decorateWidget('post:before', (helper, args) => {
    if (helper.widget.model.topic.category_id === 51) {
        return helper.h("div.disclaimer", settings.MY_DISCLAIMER)
    }
});

или с использованием сырого HTML:

const RawHtml = require("discourse/widgets/raw-html").default;

api.decorateWidget('post:before', (helper, args) => {
    if (helper.widget.model.topic.category_id === 51) {
         return new RawHtml({html: `<div class="container">${settings.MY_DISCLAIMER}</div>`})
    }
});

Вы можете прочитать этот пост, где объясняется, как работает этот хелпер h.

Если вы хотите добавить HTML перед обработанным содержимым, можно сделать следующее:

api.decorateWidget('post-contents:before', (helper, args) => {
    const { topic } = helper.widget.findAncestorModel();

    if (topic && topic.category_id === 51) {
         return helper.h("div.disclaimer", settings.MY_DISCLAIMER);
    }
});

Спасибо @Arkshine, это очень помогло!

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

api.decorateWidget('post:before', (helper, args) => {
    if (helper.widget.model.topic.category_id === 51) {
        return helper.h("div.disclaimer", settings.MY_DISCLAIMER)
    }
});

Привет!