检查给定 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
通过路径进行检查
资源:
- 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中使用:
您可以在自定义 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 消息。
上下文: 我是 运行 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
通过路径进行检查资源:
- 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' teamDamTemplatingFunctions.java
(damfn:
) explained by Magnolia CMS' teamDamTemplatingFunctions.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中使用:
您可以在自定义 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 消息。