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



有没有一种方法可以检查具有给定UUID的节点是否存在?

在查看NodeUtil.javaSessionUtil.javaSession.javaJCRUtilsTemplatingFunction (cmsfn:)和DamTemplatingFunctions(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

最佳答案

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

如何使用搜索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)}




==更新==

只需检查木兰文档:

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>)!}


那么您就不会收到模板错误,而只是在日志中显示警告消息。

10-01 03:06
查看更多