这里的问题在于空间限制,而非技术限制。
正如这里所指出的
想象一下你作为用户的体验:如果你在网站上打开一个菜单,它看起来是这样的。
你至少会感到不知所措。尤其是因为该菜单没有搜索功能来帮助你缩小结果范围。
因此,让我们试着在你想要实现的功能和用户体验之间找到平衡点。我们该如何做到这一点?我们展示有限数量的标签组,并提示还有更多内容可供查看。例如:
那么,如何实现这一点呢?
代码如下:
<script type="text/discourse-plugin" version="0.8">
const MAX_TAGS_TO_SHOW = 20;
const Category = require("discourse/models/category").default;
const siteSettings = api.container.lookup("site-settings:main");
const tagStyle = siteSettings.tag_style;
const getNumberOfTags = (tags, categoryTagsGroups) => {
let count = 0;
count = tags.length;
for (const categoryTagsGroup of categoryTagsGroups) {
count = count + categoryTagsGroup.tags.length;
}
return count;
};
fetch("/tags.json")
.then(response => response.json())
.then(data => {
try {
const tags = data.tags;
const hasCategoryTagGroups = data.extras?.categories;
if (hasCategoryTagGroups) {
const categoryTagsGroups = data.extras.categories;
let moreCount = getNumberOfTags(tags, categoryTagsGroups);
let visibleCount = 0;
const content = [];
for (const categoryTagsGroup of categoryTagsGroups) {
const category = Category.findById(categoryTagsGroup.id);
const name = category.name;
const childTags = categoryTagsGroup.tags;
const childTagNodes = [];
childTags.forEach((tag, index) => {
if (visibleCount <= MAX_TAGS_TO_SHOW) {
childTagNodes.push(
api.h(
"li.tag-link-item",
api.h(
`a.discourse-tag.tag-link.${tagStyle}`,
{ href: `/tag/${tag.text}` },
tag.text
)
)
);
moreCount--;
visibleCount++;
}
});
if (childTagNodes.length) {
content.push([
api.h("li.heading", api.h("span", name)),
childTagNodes
]);
}
}
api.decorateWidget("menu-links:after", helper => {
if (helper.attrs.name !== "general-links") return;
return api.h("div.clearfix", [
api.h("ul.tag-links", [
api.h("a.categories-link", { href: "/tags" }, [
"标签 ",
moreCount ? `(${moreCount} 更多)...` : ""
]),
content
]),
api.h("hr")
]);
});
}
} catch (error) {
console.error("汉堡包标签主题组件存在问题");
console.error(error);
}
})
.catch(console.error);
</script>
这段代码应放入你主题的 header 选项卡中。你可以将顶部的
const MAX_TAGS_TO_SHOW = 20;
修改为你想要显示的标签数量。
然后,你只需要添加一些 CSS 来样式化这些链接。这里有一个基础示例供你参考:
.tag-links {
.heading {
padding: 0.25em 0.5em;
}
.tag-link-item {
background-color: transparent;
display: inline-flex;
align-items: center;
padding: 0.25em 0.5em;
width: 50%;
box-sizing: border-box;
.tag-link {
display: inline-flex;
width: 100%;
&:hover {
color: var(--primary);
}
}
}
}
请注意,上述 JavaScript 代码会尊重你在站点设置中设置的标签样式。此外,如果你的网站非常依赖标签,那么你可能不需要在该菜单中显示类别。隐藏它们有助于减少用户的困惑。
另外,如果你添加了一个展开的标签部分,那么这个链接就变得多余了。
因此,让我们通过类似以下方式将其隐藏:
.panel-body {
.category-links,
.categories-separator,
.widget-link[href="/tags"] {
display: none;
}
}
最后,正如这里所指出的:
除非访问 /tags,否则默认情况下这些数据不会传递给客户端,因此上述代码会在主页上添加额外的请求(每次访问仅运行一次)。Discourse 力求保持简单,因此除非数据是必要的,否则默认情况下不会加载它。
我认为短期内这不会被添加到 Discourse 核心中。因此,除非你愿意编写一个在服务器端运行的插件,否则额外的请求几乎是你唯一的选择。