背景信息:我正在运行 Magnolia CMS 5.x &尝试以编程方式(在freemarker
中)检查是否存在节点,以避免在尝试通过${damfn.getAssetLink(<someUUID>)}
或类似方法访问时抛出异常。
有没有办法检查具有给定UUID的节点是否存在?
在查看NodeUtil.java,SessionUtil.java,Session.java,JCRUtils,TemplatingFunction (cmsfn:
)&amp; DamTemplatingFunctions(damfn:
)
我只能发现您可以使用jackrabbit.510166.n4.nabble.com/Checking-if-node-exists-td516003.html
检查路径TemplatingFunction.java
(cmsfn:
) explained by Magnolia CMS' team DamTemplatingFunctions.java
(damfn:
) explained by Magnolia CMS' team DamTemplatingFunctions.java
code 答案 0 :(得分:2)
(有关使用标准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中使用
您可以在自定义freemarker指令中包装每个Java函数,例如搜索。
请参阅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.MyTemplatingFunctions.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
?
这看起来像是最简单的解决方案。 Haven没有对它进行测试,但看起来应该可以将UUID与jcr:
前缀一起传递。
此外:如果您不需要明确检查资产是否存在,但只是不想在日志中出现模板错误,则可以添加!
,如下所示:
${damfn.getAssetLink(<someUUID>)!}
然后您不会收到模板错误,只会在日志中显示WARN消息。