您好,有没有办法只为私人消息主题列表使用不同的主题?我目前正在使用 Sam 的 https://meta.discourse.org/t/sams-simple-theme/23552,我和我的社区都非常喜欢它用于 /latest 列表,因为它会以文本形式打印出 OP 和最近发帖者的用户名,并且消除了没有人关心的频繁发帖者头像列表的混乱。不幸的是,同样的模式在 /my/messages 列表上会失效,特别是当 PM 主题的创建者与最近发帖者是同一个人时:

因此,在 /my/messages 的情况下,我理想中是想将默认 Discourse 主题的 td.posters.topic-list-data 列注入到这个视图中。但如果这太费时,那么能够选择某种方式为 PM 视图切换到默认 Discourse 主题也会很好。
其他自定义主题也存在同样的问题,例如 Kris 的 https://meta.discourse.org/t/minima-a-minimal-theme-for-discourse/108178。
Don
2
你好 
可以通过覆盖主题来实现,因此您必须先将其分叉或向主题创建请求。在自定义模板中,您可以使用以下方法仅更改 pm 主题列表项。
{{#if topic.isPrivateMessage}}
...
{{/if}}
隐藏 pm 主题列表项中的某些内容。
{{#unless topic.isPrivateMessage}}
...
{{/unless}}
3 个赞
所以我的懒人解决方案是不使用 {{#if topic.isPrivateMessage}} 逻辑,而是直接在 /latest 和 /my/messages 中都放入 posters.topic-list-data。
<script type='text/x-handlebars' data-template-name='topic-list-header.raw'>
<tr class="topic-list-header-row">
{{~raw-plugin-outlet name="topic-list-header-before"}}
{{#if bulkSelectEnabled}}
<th class="bulk-select topic-list-data">
{{#if canBulkSelect}}
{{raw "flat-button" class="bulk-select" icon="list" title="topics.bulk.toggle"}}
{{/if}}
</th>
{{/if}}
{{raw "topic-list-header-column" order='default' name=listTitle bulkSelectEnabled=bulkSelectEnabled showBulkToggle=toggleInTitle canBulkSelect=canBulkSelect canDoBulkActions=canDoBulkActions showTopicsAndRepliesToggle=showTopicsAndRepliesToggle newListSubset=newListSubset newRepliesCount=newRepliesCount newTopicsCount=newTopicsCount}}
{{#if showPosters}}
{{raw "topic-list-header-column" order='posters' forceName='Participants'}}
{{/if}}
{{#if showLikes}}
{{raw "topic-list-header-column" sortable='true' order='likes' number='true' forceName='thanks'}}
{{/if}}
{{#if showOpLikes}}
{{raw "topic-list-header-column" sortable='true' order='op_likes' number='true' forceName='thanks'}}
{{/if}}
{{raw "topic-list-header-column" sortable='true' number='true' order='posts' forceName='Replies'}}
{{raw "topic-list-header-column" sortable='true' order='activity' forceName='Last Post'}}
</tr>
</script>
<script type='text/x-handlebars' data-template-name='list/topic-list-item.raw'>
{{~raw-plugin-outlet name="topic-list-before-columns"}}
{{#if bulkSelectEnabled}}
<td class="bulk-select topic-list-data">
<label for="bulk-select-{{topic.id}}">
<input type="checkbox" class="bulk-select" id="bulk-select-{{topic.id}}">
</label>
</td>
{{/if}}
<td class='main-link clearfix topic-list-data'>
{{~raw-plugin-outlet name="topic-list-before-status"}}
{{raw "topic-status" topic=topic}}
{{~topic-link topic class="raw-link raw-topic-link"}}
{{~#if showTopicPostBadges}}
{{~raw "topic-post-badges" unreadPosts=topic.unread_posts unseen=topic.unseen url=topic.lastUnreadUrl newDotText=newDotText}}
{{~/if}}
{{discourse-tags topic mode="list" tagsForUser=tagsForUser}}
{{#if expandPinned}}
{{raw "list/topic-excerpt" topic=topic}}
{{/if}}
<div class='creator'>
{{#unless hideCategory}}
{{#unless topic.isPinnedUncategorized}}
{{category-link topic.category}}
{{/unless}}
{{/unless}}
{{~#if topic.creator ~}}
<a href="/u/{{topic.creator.username}}" data-auto-route="true" data-user-card="{{topic.creator.username}}">{{topic.creator.username}}</a> <a href={{topic.url}}>{{format-date topic.createdAt format="tiny"}}</a>
{{~/if ~}}
{{raw "list/action-list" topic=topic postNumbers=topic.liked_post_numbers className="likes" icon="heart"}}
</div>
</td>
{{#if showPosters}}
{{raw "list/posters-column" posters=topic.featuredUsers}}
{{/if}}
{{#if showLikes}}
<td class="num likes topic-list-data">
{{#if hasLikes}}
<a href='{{topic.summaryUrl}}'>
{{number topic.like_count}} {{d-icon "heart"}}
</a>
{{/if}}
</td>
{{/if}}
{{#if showOpLikes}}
<td class="num likes topic-list-data">
{{#if hasOpLikes}}
<a href='{{topic.summaryUrl}}'>
{{number topic.op_like_count}} {{d-icon "heart"}}
</a>
{{/if}}
</td>
{{/if}}
{{raw "list/posts-count-column" topic=topic}}
<td class="last-post topic-list-data">
<div class='poster-avatar'>
<a href="{{topic.lastPostUrl}}" data-user-card="{{topic.last_poster_username}}">{{avatar topic.lastPosterUser imageSize="medium"}}</a>
</div>
<div class='poster-info'>
<a href="{{topic.lastPostUrl}}">
{{format-date topic.bumpedAt format="tiny"}}
</a>
<span class='editor'><a href="/u/{{topic.last_poster_username}}" data-auto-route="true" data-user-card="{{topic.last_poster_username}}">{{topic.last_poster_username}}</a></span>
</div>
</td>
</script>
但我的用户不喜欢 /latest 中的视觉混乱,所以我通过 CSS 隐藏了它:
.navigation-topics .topic-list .topic-list-data.posters {
display: none;
}
如果有人有关于在 handlebars 重写中实现逻辑的建议,我仍然更倾向于这样做,而不是浪费 CPU 周期来生成 posters.topic-list-data 然后再隐藏它。
你说得对;主题数据在标题中不可用,这说得通!
CSS 可以是一个解决方案。在 topic-list-item 中保留条件,并默认将其渲染到标题中。
{{raw "topic-list-header-column" order='posters' forceName='Participants'}}
然后使用 CSS,你可以说:“选择没有(不包含)海报行的列表并隐藏它”
.topic-list:not(:has(.topic-list-body .topic-list-data.posters))
.topic-list-header
.topic-list-data.posters {
display: none;
}
对你有用吗?
1 个赞
您好,非常感谢,这是一个非常好的主意。正如建议的那样,CSS 似乎不起作用,因为它在 /latest 中仍然显示空的“参与者”列,但我的原始 CSS 似乎可以正常工作,仅在那里隐藏它:
.navigation-topics .topic-list .topic-list-data.posters {
display: none;
}
有什么缺点吗?
Hmm,会不会是因为你在 topic-list-item 中没有条件?
我确实有这个条件。否则,您将无法从我的截图中看到“参与者”列!
我认为您上面描述的是 CSS 未应用。
这是我的:
您可以看到 CSS 已应用于 /latest 页面。
请确保您已将 CSS 正确复制并粘贴到正确的位置!
2 个赞
非常感谢您的具体帮助,我现在不在电脑旁,但我一回去就会再试一次。
1 个赞
我不确定该怎么想,它肯定对我不起作用。
只是为了确认,您也在使用 Sam’s Simple Theme 吗?
另外,您是将 handlebars 代码放在了 Head 还是 Header 中?
非常感谢您的时间和帮助。
是的,我正在使用 Sam 的主题。
我创建了一个主题组件,将 CSS 和脚本放在那里,并将其附加到 Sam 的主题。
CSS
.topic-list:not(:has(.topic-list-body .topic-list-data.posters))
.topic-list-header-row
.topic-list-data.posters {
display: none;
}
Head
<script type='text/x-handlebars' data-template-name='topic-list-header.raw'>
<tr class="topic-list-header-row">
{{~raw-plugin-outlet name="topic-list-header-before"}}
{{#if bulkSelectEnabled}}
<div class="bulk-select">
{{#if canBulkSelect}}
{{raw "flat-button" class="bulk-select" icon="list" title="topics.bulk.toggle"}}
{{/if}}
</div>
{{/if}}
{{raw "topic-list-header-column" order='default' name='topic.title' bulkSelectEnabled=bulkSelectEnabled showBulkToggle=toggleInTitle canBulkSelect=canBulkSelect}}
{{#if showLikes}}
{{raw "topic-list-header-column" sortable='true' order='likes' number='true' forceName=(theme-i18n 'likes')}}
{{/if}}
{{#if showOpLikes}}
{{raw "topic-list-header-column" sortable='true' order='op_likes' number='true' forceName=(theme-i18n 'likes')}}
{{/if}}
{{raw "topic-list-header-column" order='posters' forceName='参与者'}}
{{raw "topic-list-header-column" sortable='true' number='true' order='posts' forceName='回复'}}
{{raw "topic-list-header-column" sortable='true' order='activity' forceName='最后回复'}}
</tr>
</script>
<script type='text/x-handlebars' data-template-name='list/topic-list-item.raw'>
{{#if bulkSelectEnabled}}
<td class="bulk-select topic-list-data">
<label for="bulk-select-{{topic.id}}">
<input type="checkbox" class="bulk-select" id="bulk-select-{{topic.id}}">
</label>
</td>
{{/if}}
<td class='main-link clearfix topic-list-data'>
{{~raw-plugin-outlet name="topic-list-before-status"}}
{{raw "topic-status" topic=topic}}
{{~topic-link topic class="raw-link raw-topic-link"}}
{{~#if showTopicPostBadges}}
{{~raw "topic-post-badges" unreadPosts=topic.unread_posts unseen=topic.unseen url=topic.lastUnreadUrl newDotText=newDotText}}
{{~/if}}
{{discourse-tags topic mode="list" tagsForUser=tagsForUser}}
{{#if expandPinned}}
{{raw "list/topic-excerpt" topic=topic}}
{{/if}}
<div class='creator'>
{{#unless hideCategory}}
{{#unless topic.isPinnedUncategorized}}
{{category-link topic.category}}
{{/unless}}
{{/unless}}
{{~#if topic.creator ~}}
<a href="/u/{{topic.creator.username}}" data-auto-route="true" data-user-card="{{topic.creator.username}}">{{topic.creator.username}}</a> <a href={{topic.url}}>{{format-date topic.createdAt format="tiny"}}</a>
{{~/if ~}}
{{raw "list/action-list" topic=topic postNumbers=topic.liked_post_numbers className="likes" icon="heart"}}
</div>
</td>
{{#if showLikes}}
<td class="num likes topic-list-data">
{{#if hasLikes}}
<a href='{{topic.summaryUrl}}'>
{{number topic.like_count}} {{d-icon "heart"}}
</a>
{{/if}}
</td>
{{/if}}
{{#if showOpLikes}}
<td class="num likes topic-list-data">
{{#if hasOpLikes}}
<a href='{{topic.summaryUrl}}'>
{{number topic.op_like_count}} {{d-icon "heart"}}
</a>
{{/if}}
</td>
{{/if}}
{{#if topic.isPrivateMessage}}
{{raw "list/posters-column" posters=topic.featuredUsers}}
{{/if}}
{{raw "list/posts-count-column" topic=topic}}
<td class="last-post topic-list-data">
<div class='poster-avatar'>
<a href="{{topic.lastPostUrl}}" data-user-card="{{topic.last_poster_username}}">{{avatar topic.lastPosterUser imageSize="medium"}}</a>
</div>
<div class='poster-info'>
<a href="{{topic.lastPostUrl}}">
{{format-date topic.bumpedAt format="tiny"}}
</a>
<span class='editor'><a href="/u/{{topic.last_poster_username}}" data-auto-route="true" data-user-card="{{topic.last_poster_username}}">{{topic.last_poster_username}}</a></span>
</div>
</td>
</script>
2 个赞
再次感谢您的帮助。它的行为方式相同,/latest 中有一个Participants列标题,导致列与主题列表列不对齐。我可能在其他组件中有其他自定义设置存在冲突。
此 CSS 解决方案是否存在任何潜在问题或缺点?
Don
14
我看到您正在使用 Firefox,因此 :has 选择器可能无法在您那边正常工作。它仅从 Firefox 121 开始支持。
4 个赞
这就说得通了!它在 Chromium 中确实可以工作,但我以为那是因为我没有以管理员身份登录。我使用的是 Debian 12 的 Firefox 115 ESR。非常感谢,我都要被逼疯了。 
2 个赞
哦,真的吗?我不知道,说实话,这挺令人失望的
。下次我一定会更频繁地在 Firefox 上进行测试。感谢您的反馈!
4 个赞
我希望实现一项额外的 CSS 改进,以使其更有用:在更宽的浏览器窗口上,它现在会按预期显示 PM 参与者:
但在较窄的窗口上,它会将参与者头像的数量减少到只有一个,因此我们又遇到了与本主题第一篇帖子中所述相同的问题:
有没有办法通过 CSS 来解决这个问题,以便在较窄的窗口上隐藏“Replies”列,并隐藏“Last Post”列中的头像,从而为“Participants”列腾出更多空间?
你能试试这个 CSS 吗?
@include breakpoint(extra-large, $sidebar: true) {
.user-messages-page .topic-list {
.posts {
display: none;
}
.posters {
width: 146px;
text-align: inherit;
}
.last-post {
width: auto;
.poster-avatar {
display: none;
}
}
.topic-list-header .topic-list-data.activity {
width: auto;
}
.topic-list-data.posters {
a:not(.latest) {
display: inherit;
}
a.latest {
width: auto;
}
}
}
}
1 个赞
谢谢!几乎完美,但宽度在 1380px - 1020px 之间时,仍然显示所有列,并将参与者头像缩小为一个。比这更窄就能正常工作。
将 breakpoint() 中的 medium 替换为 extra-large。它现在应该从 <= 1140px 开始。隐藏参与者头像的原始行为实际上发生在此时。有效吗?
1 个赞