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

Check if Node exists for given UUID

上下文: 我是 运行 Magnolia CMS 5.x 并尝试以编程方式(在 freemarker) 检查节点是否存在以避免在尝试通过 ${damfn.getAssetLink(<someUUID>)} 或类似方式访问它时抛出异常。


有没有办法检查给定 UUID 的节点是否存在?

我在查看 NodeUtil.java, SessionUtil.java, Session.java, JCRUtils, TemplatingFunction (cmsfn:) 和 DamTemplatingFunctions (damfn:) 时没有发现任何有趣的东西

我只发现您可以使用 jackrabbit.510166.n4.nabble.com/Checking-if-node-exists-td516003.html

通过路径进行检查

资源:

(请参阅下面的更新,了解使用标准 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 标准 class - 或 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: 前缀一起传递。

此外:如果你不需要显式地检查资产是否存在,只是不想在日志中得到一个模板错误,你可以像这样添加一个!

${damfn.getAssetLink(<someUUID>)!}

那么您不会收到模板错误,只会在日志中收到一条 WARN 消息。