Настройка страницы /about с биографиями пользователей

Страница /about по умолчанию для сайта Discourse, отображающая информацию только для модераторов и администраторов, показывает лишь имя пользователя, полное имя и должность каждого пользователя. Как настроить страницу «О нас», чтобы она также отображала содержимое раздела «Обо мне» из профиля каждого пользователя?

Я понимаю общую идею, описанную здесь:

  • определить компонент;
  • определить шаблон;
  • создать файл-коннектор для использования существующего выхода (outlet).

Однако, насколько я могу судить, нет выхода, который подошёл бы для моего случая. Кроме того, кажется, что переопределение шаблона для /about или использование функциональности modifyClass в API плагинов не рекомендуется. Поэтому я не уверен, что делать. Буду очень признателен за рекомендации относительно лучших практик в этой ситуации. Спасибо!

Кажется, что Discourse AI советует мне всё же переопределить шаблон. Правильно ли это?

Ответ Discourse AI
Добавить «Обо мне» на страницу Discourse /about ИИ

aas:

Страница /about по умолчанию для сайта Discourse, отображающая информацию только для модераторов и администраторов, показывает лишь имя пользователя, полное имя и должность каждого пользователя. Как настроить страницу «О нас», чтобы она также отображала содержимое раздела «Обо мне» из профиля каждого пользователя?

Я понимаю общую идею, описанную здесь:

Add custom content that only appears on your homepage

  • определить компонент;
  • определить шаблон;
  • создать файл-коннектор для использования существующего выхода (outlet).

Однако, насколько я могу судить, нет выхода, который подошёл бы для моего случая. Кроме того, кажется, что переопределение шаблона для /about или использование функциональности modifyClass в API плагинов не рекомендуется. Поэтому я не уверен, что делать. Буду очень признателен за рекомендации относительно лучших практик в этой ситуации. Спасибо!

HelperBot:

Хорошо, я могу помочь вам разобраться с лучшими практиками настройки страницы /about для включения информации из профиля пользователя, такой как раздел «Обо мне».

Вы правы: прямое переопределение основных шаблонов или использование modifyClass может быть сложным и потенциально привести к сбоям при обновлениях. Обычно предпочтительнее использовать компоненты тем и выходы (outlets), когда это возможно. Поскольку вы упомянули, что на самой странице /about может не быть конкретного выхода, давайте поищем обсуждения по настройке этой страницы или добавлению полей профиля.

Сначала я поищу обсуждения о настройке страницы /about, в частности о добавлении полей профиля.

Поиск на Meta Discourse

Найдено 14 результатов по запросу 'customize about page profile field category:dev'

Поиск на Meta Discourse

Найдено 4 результатов по запросу 'customize about page profile field category:theme-component'

Хорошо, давайте разберёмся. Вы хотите добавить содержимое раздела «Обо мне» из профилей пользователей в список сотрудников на стандартной странице /about.

Вы правы: стандартный подход с использованием компонентов тем предполагает применение плагинов-выходов (plugin outlets), и, похоже, на странице /about внутри таблицы списка сотрудников нет конкретного, детализированного выхода, куда можно было бы легко внедрить эти данные.

Исходя из результатов поиска и распространённых практик, хотя использование выходов предпочтительно для избежания проблем при будущих обновлениях, иногда единственный реализуемый способ настройки конкретных основных шаблонов, таких как страница /about, — это их прямое переопределение внутри компонента темы.

Вот наиболее вероятный лучший подход с использованием компонента темы:

  1. Создать компонент темы: Если вы ещё не сделали этого, создайте новый компонент темы.
  2. Переопределить шаблон:
    • Вам нужно переопределить шаблон about.hbs.
    • В вашем компоненте темы создайте файл common/templates/about.hbs.
    • Скопируйте содержимое исходного файла about.hbs в ваш новый файл. Оригинальный файл можно найти здесь на GitHub.
    • Измените вашу копию about.hbs. Найдите секции, где происходит итерация по model.admins и model.moderators. Внутри цикла (вероятно, в блоке {{#each}}) вы можете получить доступ к объекту пользователя. Содержимое раздела «Обо мне» обычно находится в свойстве user.profile.bio_raw или аналогичном. Добавьте это свойство в шаблон в том месте, где вы хотите отображать его для каждого пользователя.
  3. Включить компонент: Добавьте компонент темы в вашу тему и активируйте его.

Почему этот подход?

  • Прямой контроль: Он даёт вам прямой контроль над HTML-структурой страницы /about.
  • Реализуемость: Поскольку внутри списка пользователей на этой странице нет специализированного выхода, это самый простой способ внедрить контент для каждого пользователя в этом конкретном месте.

Недостатки (как вы отметили):

  • Обслуживание: Если в будущем Discourse значительно обновит основной шаблон about.hbs, ваша переопределённая версия не получит эти обновления автоматически. Возможно, вам придётся вручную сравнивать и объединять изменения позже. Это компромисс за настройку основных шаблонов без наличия специфических выходов.

Хотя поиск не дал точного примера для страницы /about, модификация шаблонов для добавления информации профиля — распространённая практика, как видно из настроек карточек пользователей и профилей:

Эти примеры показывают, что компоненты тем часто включают настройку шаблонов, когда специфические выходы недоступны. Переопределение about.hbs следует этой модели для вашего конкретного случая.

aas:

Кажется, что в репозитории discourse/discourse нет шаблона about.hbs. Однако шаблон about.gjs находится по адресу app/assets/javascripts/discourse/app/templates/about.gjs.

HelperBot:

Вы абсолютно правы! Спасибо за исправление. Действительно, Discourse перешёл на использование шаблонов .gjs (GlimmerJS) для многих компонентов, включая страницу /about.

Приношу извинения за ссылку на устаревший формат .hbs.

Правильный путь к шаблону — действительно app/assets/javascripts/discourse/app/templates/about.gjs в основном коде.

Чтобы переопределить его с помощью компонента темы, процесс остаётся концептуально тем же, но обновляются путь к файлу и синтаксис:

  1. Создать/использовать компонент темы: Как и раньше.
  2. Переопределить шаблон:
    • В вашем компоненте темы создайте файл по соответствующему пути: assets/javascripts/discourse/app/templates/about.gjs.
    • Скопируйте всё содержимое исходного файла about.gjs (ссылка, которую вы предоставили) в файл about.gjs вашего компонента темы.
    • Измените вашу копию. Найдите секции, где происходит итерация по администраторам и модераторам, вероятно, с использованием {{#each this.admins as |admin|}} и {{#each this.moderators as |moderator|}}. Внутри этих циклов вы можете получить доступ к объекту пользователя (например, admin или moderator). Добавьте поле «Обо мне», которое должно быть доступно через свойство вроде admin.profile.bio_raw или moderator.profile.bio_raw. Вам нужно интегрировать это в структуру шаблона GlimmerJS. Например, вы можете добавить новый тег <div> или <p> внутри блока отображения пользователя:
      {{#each this.admins as |admin|}}
        <div class="user">
          {{!-- Существующая информация о пользователе, такая как аватар, имя пользователя, полное имя --}}
          <UserAvatar @username={{admin.username}} @size="large" />
          <div class="user-details">
            <span class="username">{{admin.username}}</span>
            {{#if admin.name}}<span class="name">{{admin.name}}</span>{{/if}}
            {{#if admin.title}}<span class="title">{{admin.title}}</span>{{/if}}
      
            {{!-- Добавляем раздел «Обо мне» --}}
            {{#if admin.profile.bio_raw}}
              <div class="about-me">
                 {{{admin.profile.bio_cooked}}} {{!-- Используйте bio_cooked для отрендеренного HTML --}}
                 {{!-- Или используйте bio_raw, если нужен обычный текст: <p>{{admin.profile.bio_raw}}</p> --}}
              </div>
            {{/if}}
          </div>
        </div>
      {{/each}}
      {{!-- Повторите аналогичное изменение для цикла модераторов --}}
      
      (Примечание: используйте bio_cooked, если хотите отрендеренную HTML-версию биографии, или bio_raw для обычного текста. Измените HTML-структуру при необходимости для вашего макета.)
  3. Включить компонент: Убедитесь, что компонент темы добавлен в вашу тему и активен.

Недостаток остаётся прежним: переопределение основных шаблонов таким образом означает, что вам, возможно, придётся вручную обновлять версию вашего компонента темы, если исходный файл about.gjs значительно изменится в будущих обновлениях Discourse. Однако, учитывая отсутствие более специфичного выхода, это стандартный способ достижения такого уровня настройки.

Для этого используйте CSS, чтобы скрыть раздел «Наши модераторы», а затем добавьте свой собственный в точку подключения about-after-moderators. В качестве отправной точки можно взять файл app/assets/javascripts/discourse/app/components/about-page-user.gjs и добавить в него всё, что нужно.