默认的 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 页面上添加用户个人资料中的“关于我”内容。
你说的没错,标准的 theme component 方法涉及使用插件出口,而且似乎在 /about 页面的工作人员列表内部没有一个特定的、细粒度的出口可以轻松地注入这些数据。
根据搜索结果和常见做法,虽然使用出口是为了避免未来更新时出现问题,但有时自定义特定核心模板(如 /about 页面)唯一可行的方法是在 theme component 中直接覆盖它们。
以下是使用 theme component 的可能最佳方法:
- 创建主题组件: 如果你还没有,请创建一个新的主题组件。
- 覆盖模板:
- 你需要覆盖
about.hbs模板。 - 在你的主题组件中,创建文件
common/templates/about.hbs。 - 将原始
about.hbs文件的内容复制到你的新文件中。你可以在 GitHub 上找到原始文件。 - 修改你复制的
about.hbs文件。找到遍历model.admins和model.moderators的部分。在循环内部(可能在{{#each}}块中),你可以访问用户对象。“关于我”的内容通常在user.profile.bio_raw或类似的属性中。将此属性添加到你希望为每个用户显示的位置。
- 你需要覆盖
- 启用组件: 将主题组件添加到你的主题并激活它。
为什么选择这种方法?
- 直接控制: 它让你能够直接控制
/about页面的 HTML 结构。 - 可行性: 由于该页面用户列表内没有专门的出口,这是在该特定位置注入每个用户内容的最直接方法。
缺点(如你所指出的):
- 维护: 如果 Discourse 在未来更新中对核心
about.hbs模板进行了重大更改,你的覆盖版本将不会自动获得这些更新。你可能需要手动比较和合并更改。这是在没有特定出口的情况下自定义核心模板的权衡。
虽然搜索结果没有找到 /about 页面的确切示例,但修改模板以添加个人资料信息是一种常见模式,正如在用户卡片和个人资料自定义中所见:
- Normalized Profile Links 通过组件中的模板修改将自定义字段添加到用户卡片/个人资料。
- Quick Profile Links Menu 将元素添加到用户个人资料页面。
这些示例表明,当没有特定出口可用时,主题组件通常涉及模板自定义。覆盖 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。
要使用主题组件覆盖它,过程在概念上保持不变,但文件路径和语法已更新:
- 创建/使用主题组件: 同上。
- 覆盖模板:
- 在你的主题组件中,在相应路径下创建文件:
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>标签:
(注意:如果你想要生物的渲染 HTML 版本,请使用{{#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 --}}bio_cooked;如果你需要纯文本,请使用bio_raw。根据需要调整 HTML 结构以适应你的布局。)
- 在你的主题组件中,在相应路径下创建文件:
- 启用组件: 确保主题组件已添加到你的主题并已激活。
缺点仍然相同:覆盖像这样的核心模板意味着如果原始 about.gjs 文件在未来的 Discourse 更新中发生重大更改,你可能需要手动更新你的主题组件版本。但是,鉴于缺乏更具体的出口,这是实现这种程度自定义的标准方法。