对于模板元数据的操作实例。
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 处理模板指令顺序的原因。
完成。
默认评论
Halo系统提供的评论