对于模板元数据的操作实例。
Halo只支持对一个分类的文章进行隐藏操作。对于单个文章的隐藏,可以用模板元数据实现。
在 Halo 2.0,所有的模型都包含了 metadata.annotations
字段,用于存储元数据信息。
以单页模型为例
SinglePageVo
{
"metadata": {
"name": "string", // 唯一标识
"labels": {
"additionalProp1": "string"
},
"annotations": {
"additionalProp1": "string"
}
......
}
通过#annotations
的三种方法进行访问
#annotations.get(extension,key):根据对象和元数据的 key 获取元数据的值。
#annotations.getOrDefault(extension,key,defaultValue):根据对象和元数据的 key 获取元数据的值,同时支持设置默认值。
#annotations.contains(extension,key):根据对象和元数据的 key 判断元数据是否存在。
extension:post
、singlePage
、category
、tag
、menuItem
、user
...(以及其他自定义类型)
定义元数据
在annotation-setting.yaml
文章的元数据定义处(kind: Post
),在 formSchema 节点下添加:
- $formkit: "select"
name: "enable_hidden"
label: "是否在主页列表隐藏文章"
value: "false"
options:
- value: "true"
label: 是
- value: "false"
label: 否
保存后重新载入主题,在文章的设置页面增加了配置项:
《图片》
元数据使用
代码里使用 Thymeleaf 的语法 th:if
对元数据进行判断,根据条件决定是否加载标签。
<th:block th:if="!(${#annotations.getOrDefault(post, 'enable_hidden', 'false')})"> ... </th:block>
但是在 index.html 的posts
遍历里不生效
<th:block th:each="post, iteration : ${posts.items}">
<!--添加在这里不生效-->
<th:block th:if="!(${#annotations.getOrDefault(post, 'enable_hidden', 'false')})" th:replace="~{modules/macro/post_item :: post_item}" />
</th:block>
而要添加到 replace 的 modules/macro/post_item
里,可能是 post 在里面才能被访问?🤔
(new)这样也能生效:
<th:block th:each="post, iteration : ${posts.items}">
<th:block th:if="!(${#annotations.getOrDefault(post, 'enable_hidden', 'false')})">
<th:block th:replace="~{modules/macro/post_item :: post_item}" />
</th:block>
</th:block>
根据豆包的解释以及上面代码,比较有可能是 Thymeleaf 处理模板指令顺序的原因。
完成。
wl
05 / 07用上了!谢!
From Nginx Proxy Manager 登录出错 Bad gateway