【问题标题】:Check if Node exists for given UUID检查给定 UUID 的节点是否存在
【发布时间】:2017-04-04 20:18:11
【问题描述】:

上下文:我正在运行 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通过路径检查


资源:

【问题讨论】:

    标签: java freemarker uuid jcr magnolia


    【解决方案1】:

    (有关使用标准 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 中使用它:

    您可以将每个 Java 函数(例如搜索)包装在自定义 freemarker 指令中。

    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

    这看起来是最简单的解决方案。尚未对其进行测试,但看起来应该可以将 UUID 与 jcr: 前缀一起传递。

    此外:如果您不需要显式检查资产是否存在,而只是不想在日志中出现模板错误,则可以像这样添加!

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

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

    【讨论】:

    • 感谢马蒂亚斯。我已经澄清了这个问题,表明我想在 freemarker 中执行此操作。也许您可以为您建议的每个解决方案添加 freemarker 示例?
    • 注意:searchfn 需要MTE module,如Templating functions Magnolia doc 的“功能集”表中所示。
    • 查看我的更新回复。关于 MTE:您不使用 MTE 吗? MTE 是当前 5.x 中的标准,而 STK 已“弃用”。或者您根本不想依赖任何这些模板引擎?以上应该可以在没有 MTE 的情况下工作,但它需要您自己的自定义 Java 类作为自定义指令。
    • @AdrienBe 查看我的第二次更新。使用damfn 指令甚至还有更简单的方法。 damfn:getAsset('jcr:'+uuid) 然后使用ifelse
    • 感谢详尽的回答和 cmets。很好发现,没有看到 damfn.getAsset(String UUID) 如果资产不存在则返回 null (而不是抛出错误)。否则,使用自定义 freemarker 指令的解决方案非常简洁。对于! 解决方案:这可以“降低”任何异常的日志级别吗?还是只针对特定方法抛出的异常?
    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多