检查节点是否存在给定的UUID

时间:2016-11-21 12:24:42

标签: java freemarker uuid jcr magnolia

1 个答案:

答案 0 :(得分:2)

(有关使用标准Magnolia指令的简单解决方案,请参阅下面的更新)

如何使用搜索searchfn

https://documentation.magnolia-cms.com/display/DOCS/searchfn

QueryUtil

https://nexus.magnolia-cms.com/content/sites/magnolia.public.sites/ref/5.4/apidocs/info/magnolia/cms/util/QueryUtil.html

并通过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消息。