上下文: 我正在运行 Magnolia CMS 5.x 并尝试以编程方式(在 freemarker
中)检查节点是否存在,以避免在尝试时抛出异常通过 ${damfn.getAssetLink(<someUUID>)}
访问它或类似的。
有没有办法检查具有给定 UUID 的节点是否存在?
查看 NodeUtil.java 时我没有发现任何有趣的内容。 , SessionUtil.java , Session.java , JCRUtils , TemplatingFunction ( cmsfn:
) & DamTemplateFunctions ( damfn:
)
我只发现你可以使用 jackrabbit.510166.n4.nabble.com/Checking-if-node-exists-td516003.html 通过路径检查
<小时/>资源:
- Node.java - API doc - Adobe's Content Repository for Java 2.0
- Session.java - API doc - Adobe's Content Repository for Java 2.0
- JCRUtils.java - API doc - Apache Jackrabbit 2.0.0 API
- NodeUtil.java - code - Magnolia Main Project
- NodeUtil.java - API doc - Magnolia Main Project 5.5
- SessionUtil.java - code - Magnolia Main Project
- SessionUtil.java - API doc - Magnolia Main Project 5.5
-
TemplatingFunction.java
(cmsfn:
) explained by Magnolia CMS' team -
DamTemplatingFunctions.java
(damfn:
) explained by Magnolia CMS' team -
DamTemplatingFunctions.java
code
最佳答案
(请参阅下面我的更新,了解使用标准 Magnolia 指令的简单解决方案)
如何使用搜索searchfn
https://documentation.magnolia-cms.com/display/DOCS/searchfn
或QueryUtil
并按 UUID 搜索:
https://wiki.magnolia-cms.com/display/WIKI/JCR+Query+Cheat+Sheet
SELECT * FROM [nt:base] WHERE [jcr:uuid] = '7fd401be-cada-4634-93fa-88069f46297b'
<小时/>
在 Freemarker 中使用它:
您可以将每个 Java 函数(例如搜索)包装在自定义 freemarker 指令中。
参见documentation.magnolia-cms.com/display/DOCS/Templating+functions
在你的模块 xml 中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module SYSTEM "module.dtd" >
<module>
...
<components>
<id>main</id>
<component>
<type>com.company.my.MyTemplatingFunctions</type>
<implementation>com.company.my.MyTemplatingFunctions</implementation>
<scope>singleton</scope>
</component>
</components>
...
com.company.my.MyTemplatedFunctions.doesNodeExist()
调用 QueryUtil
标准类 - 或 SessionUtil
,例如:
package com.company.my;
public class MyTemplatingFunctions {
public boolean doesNodeExist(String workspace, String id){
if ( SessionUtil.getNodeByIdentifier(workspace, id) != null ){
return true;
}
return false;
}
}
然后在您的.ftl
中:
[#-- @ftlvariable name="myfn" type="com.company.my.MyTemplatingFunctions" --]
${myfn.doesNodeExist(relevantWorkspace, someUUID)}
<小时/>
==更新==
只需检查 Magnolia 文档:
https://documentation.magnolia-cms.com/display/DOCS/damfn#damfn-Getasset
这不起作用吗?
[#assign myAsset = damfn.getAsset("jcr:20d6e4e3-fe53-4b23-8d64-6e67a1c1667f")!]
然后您可以在 Freemarker 中使用 if
/else
检查 myAsset
吗?
这看起来是最简单的解决方案。尚未测试过,但看起来应该可以将 UUID 与 jcr:
前缀一起传递。
此外:如果您不需要显式检查 Assets 是否存在,只是不想在日志中收到模板错误,您可以添加一个 !
,如下所示:
${damfn.getAssetLink(<someUUID>)!}
那么您就不会收到模板错误,只会在日志中收到一条警告消息。
关于java - 检查给定 UUID 的节点是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40720134/