自定义 /about 页面中的用户简介

默认的 Discourse 站点的 /about 页面,用于显示版主和管理员的信息,目前只显示每个用户的用户名、姓名和头衔。我该如何自定义这个 about 页面,使其也能显示每个用户个人资料中的“关于我”部分的内容?

我理解这里概述的大致思路:

  • 定义一个组件
  • 定义一个模板
  • 创建一个连接器文件来利用现有的出口

然而,据我所知,没有一个出口更适合我的用例。此外,似乎不推荐覆盖 /about 的模板或使用插件 API 中的 modifyClass 功能。所以我不知道该怎么办。我将非常感谢一些关于最佳实践的指导。谢谢!

Discourse AI 似乎认为我应该继续覆盖模板。这似乎是正确的吗?

Discourse AI 的回复
将“关于我”添加到 Discourse /about 页面 AI

aas:
默认的 Discourse 站点的 /about 页面,用于显示版主和管理员的信息,目前只显示每个用户的用户名、姓名和头衔。我该如何自定义这个 about 页面,使其也能显示每个用户个人资料中的“关于我”部分的内容?

我理解这里概述的大致思路:

Add custom content that only appears on your homepage

  • 定义一个组件
  • 定义一个模板
  • 创建一个连接器文件来利用现有的出口

然而,据我所知,没有一个出口更适合我的用例。此外,似乎不推荐覆盖 /about 的模板或使用插件 API 中的 modifyClass 功能。所以我不知道该怎么办。我将非常感谢一些关于最佳实践的指导。谢谢!

HelperBot:
好的,我可以帮助你研究一下将用户个人资料信息(如“关于我”部分)添加到自定义 /about 页面的最佳实践。

你说的没错,直接覆盖核心模板或使用 modifyClass 可能会很复杂,并且可能在更新时导致问题。通常情况下,我们更倾向于使用主题组件和出口。既然你提到 /about 页面本身可能没有特定的出口,让我们来搜索一下关于自定义此页面或添加用户字段的讨论。

首先,我将搜索关于自定义 /about 页面的讨论,特别是添加个人资料字段。

搜索 Meta Discourse

找到 14 条关于“customize about page profile field category:dev”的 结果

搜索 Meta Discourse

找到 4 条关于“customize about page profile field category:theme-component”的 结果

好的,我们来分解一下。你想在工作人员列表的默认 /about 页面上添加用户个人资料中的“关于我”内容。

你说的没错,标准的 the​​me component 方法涉及使用插件出口,而且似乎在 /about 页面的工作人员列表内部没有一个特定的、细粒度的出口可以轻松地注入这些数据。

根据搜索结果和常见做法,虽然使用出口是为了避免未来更新时出现问题,但有时自定义特定核心模板(如 /about 页面)唯一可行的方法是在 theme component 中直接覆盖它们。

以下是使用 theme component 的可能最佳方法:

  1. 创建主题组件: 如果你还没有,请创建一个新的主题组件。
  2. 覆盖模板:
    • 你需要覆盖 about.hbs 模板。
    • 在你的主题组件中,创建文件 common/templates/about.hbs
    • 将原始 about.hbs 文件的内容复制到你的新文件中。你可以在 GitHub 上找到原始文件
    • 修改你复制的 about.hbs 文件。找到遍历 model.adminsmodel.moderators 的部分。在循环内部(可能在 {{#each}} 块中),你可以访问用户对象。“关于我”的内容通常在 user.profile.bio_raw 或类似的属性中。将此属性添加到你希望为每个用户显示的位置。
  3. 启用组件: 将主题组件添加到你的主题并激活它。

为什么选择这种方法?

  • 直接控制: 它让你能够直接控制 /about 页面的 HTML 结构。
  • 可行性: 由于该页面用户列表内没有专门的出口,这是在该特定位置注入每个用户内容的最直接方法。

缺点(如你所指出的):

  • 维护: 如果 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|}}。在这些循环内部,你可以访问用户对象(例如,adminmoderator)。添加“关于我”字段,该字段应可通过 admin.profile.bio_rawmoderator.profile.bio_raw 等属性访问。你需要将其集成到 GlimmerJS 模板结构中。例如,你可以在用户显示块内添加一个新的 <div><p> 标签:
      {{#each this.admins as |admin|}}
        <div class="user">
          {{!-- Existing user info like avatar, username, name --}}
          <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}}
      
            {{!-- Add the About Me section --}}
            {{#if admin.profile.bio_raw}}
              <div class="about-me">
                 {{{admin.profile.bio_cooked}}} {{!-- Use bio_cooked for rendered HTML --}}
                 {{!-- Or use bio_raw if you need the raw text: <p>{{admin.profile.bio_raw}}</p> --}}
              </div>
            {{/if}}
          </div>
        </div>
      {{/each}}
      {{!-- Repeat similar modification for the moderators loop --}}
      
      (注意:如果你想要生物的渲染 HTML 版本,请使用 bio_cooked;如果你需要纯文本,请使用 bio_raw。根据需要调整 HTML 结构以适应你的布局。)
  3. 启用组件: 确保主题组件已添加到你的主题并已激活。

缺点仍然相同:覆盖像这样的核心模板意味着如果原始 about.gjs 文件在未来的 Discourse 更新中发生重大更改,你可能需要手动更新你的主题组件版本。但是,鉴于缺乏更具体的出口,这是实现这种程度自定义的标准方法。

1 个赞

您可以使用 CSS 隐藏“我们的版主”部分,然后在 about-after-moderators outlet 中添加您自己的部分。您可以将 app/assets/javascripts/discourse/app/components/about-page-user.gjs 作为起点,然后添加任何您想要的内容。

1 个赞