我使用此脚本成功地在整个网站中更改了图标,它将“已解决”插件的已解决勾选图标更改为竖起大拇指的图标。
然而,它并未在网站的所有位置生效,例如在通知列表中:
![]()
~
以下是它在网站其他生效位置的显示效果:
![]()
一些图标,包括所有通知图标,需要特殊处理,因为我们使用了不同的名称。在这种情况下,你需要查找 notification.solved.accepted_notification(所有这些异常图标名称都列在 https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse-common/lib/icon-library.js.es6 的 replacements 部分中)
<script type="text/discourse-plugin" version="0.8">
api.replaceIcon('notification.solved.accepted_notification', 'thumbs-up')
</script>
你是想专门针对该图标的位置和状态进行修改吗?如果你仍然试图全局更改图标,那么你最初发布的代码仍然是正确的:
api.replaceIcon('far-check-square', 'thumbs-up')
api.replaceIcon('check-square', 'thumbs-up')
“Kudos”旁边的这个勾选图标并非默认图标,所以你是否在某些地方存在冲突的代码?
正如 Kris 提到的,只有部分图标需要特殊处理。通知就是其中之一,因此你需要使用 notification.solved.accepted_notification。而在帖子控制栏中使用的“已解决”图标,采用的是通用图标名称,因此你只能通过 replaceIcon 方法对其进行全局修改。
如果你希望实现更精细的控制,我认为你需要重写“已解决”插件中定义的 addPostMenuButton 函数。请尝试以下代码:
<script type="text/discourse-plugin" version="0.8">
const { iconNode } = require("discourse-common/lib/icon-library");
api.addPostMenuButton("solved", attrs => {
const currentUser = api.getCurrentUser();
const canAccept = attrs.can_accept_answer;
const canUnaccept = attrs.can_unaccept_answer;
const accepted = attrs.accepted_answer;
const isOp = currentUser && currentUser.id === attrs.topicCreatedById;
const position =
!accepted && canAccept && !isOp ? "second-last-hidden" : "first";
if (canAccept) {
return {
action: "acceptAnswer",
icon: "far-check-square",
className: "unaccepted",
title: "solved.accept_answer",
label: "solved.solution",
position
};
} else if (canUnaccept && accepted) {
const title = canUnaccept
? "solved.unaccept_answer"
: "solved.accepted_answer";
return {
action: "unacceptAnswer",
icon: "thumbs-up", // 此处已修改
title,
className: "accepted fade-out",
position,
label: "solved.solution"
};
} else if (!canAccept && accepted) {
return {
className: "hidden",
disabled: "true",
position,
beforeButton(h) {
return h(
"span.accepted-text",
{
title: I18n.t("solved.accepted_description")
},
[
h("span", iconNode("thumbs-up")), // 此处已修改
h("span.accepted-label", I18n.t("solved.solution"))
]
);
}
};
}
});
</script>
哦,真奇怪!我不太确定为什么只有非管理员用户会失败……无论如何,我已经更新了脚本,补上了缺失的部分。
啊,脚本已更新。