api.decorateWidget — как найти названия шаблонов?

Как найти расположение шаблонов Discourse, чтобы задать их в коде?
Особенно меня интересует правильное имя usercard

Существует очень удобный компонент темы для отслеживания мест вставок плагинов в наших различных шаблонах Handlebars: (deprecated) Plugin outlet locations theme component. В конце первого сообщения есть ссылка на предпросмотр этого компонента на нашем сайте создателя тем. Вы можете использовать его, чтобы найти большинство мест вставок плагинов, даже не устанавливая его на свой сайт.

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

В этом разделе руководства для разработчиков подробно описано многое из того, что вас интересует. Также рекомендую ознакомиться с репозиториями GitHub компонентов тем в нашей категории #theme, чтобы увидеть хорошие примеры.

Спасибо за подсказку! Я нашел необходимую часть user-card-post-names:after.

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

Я заменил poster-name:after на user-card-post-names:after, но это не сработало, и пользовательское поле не отображается на карточке пользователя. Есть какие-то идеи, почему так произошло?

Вы не сможете использовать decorateWidget() для плагинного выхода. Попробуйте что-то вроде этого:

<script type="text/discourse-plugin" version="0.8.42">
    const h = require("virtual-dom").h;
    api.createWidget("user-card-custom-field", {
      html(attrs) {
        const userCustomFields = attrs.user.custom_fields;
        if (userCustomFields.user_field_4) {
            return h('span.poster-user-field', userCustomFields.user_field_4);
        }
      }
    });
</script>

<script type="text/x-handlebars" data-template-name="/connectors/user-card-post-names/user-card-custom-field">
    {{mount-widget widget="user-card-custom-field" args=(hash user=user)}}
</script>

mount-widget передаёт объект пользователя, доступный из плагинного выхода в ядре, и делает его доступным в атрибутах созданного нами виджета user-card-custom-field.

Убедитесь, что вы добавили user_field_4 в настройки сайта «Пользовательские поля для публичных пользователей» или «Пользовательские поля для сотрудников» в зависимости от необходимости.

Редактирование

Также, если вам не нужно делать что-то особенно специфичное, вы можете вообще отказаться от виджетов и просто использовать плагинный выход:

<script type="text/x-handlebars" data-template-name="/connectors/user-card-post-names/user-card-custom-field">
  {{#if user.custom_fields.user_field_1}}
    <span class="poster-user-field">{{user.custom_fields.user_field_1}}</span>
  {{/if}}
</script>

Спасибо большое! Всё работает.