如何在 magnolia freemarker(.ftl) 中定义对象是否等于 null

How to define if object is equal to null in magnolia freemarker(.ftl)

我目前正在开发一个组件,我需要一个 if else 语句来过滤页面对象是否为 null,这是我的尝试:

[#assign page = cmsfn.page(component)]
[#if page IS NULL ] // not working...
   [@cms.component content=cmsfn.asContentMap(component) editable=false/]
[/#if]

还有这个

[#assign page = cmsfn.page(component)]
[#if !page?has_content ] // not working...
   [@cms.component content=cmsfn.asContentMap(component) editable=false/]
[/#if]

我想在这里做的是,如果页面对象是 null ,然后进行组件渲染,这些页面对象是 jrc 子节点,渲染组件时这种类型的节点会弄乱模板,所以我需要过滤掉并确保页面为空,然后呈现。

有什么建议吗?请给我一个代码示例。 谢谢

FreeMarker (2.x) 的模板语言有这个……怪癖,它没有 null 值。因此,您不能将 null 存储在变量中。当你有 foo.bar 其中 bar 对应 Java getBar() 其中 return null,那么就模板语言而言,foo 根本不包含 bar。并且,引用不存在的内容是非法的,除非您在引用表达式(如 foo.bar!'myDefault'foo.bar??).

所以最简单的方法就是避免像[#if cmsfn.page(component)??]...[/#if]这样的赋值。但有时这是不可接受的,因为你必须再次向下获取 page。然后,您可以使用一些可以与非默认值区分开来的默认值。假设对于 page 对象 ?has_content 给出 true (除非你使用一些奇怪的 ObjectWrapper 它确实如此),默认值如 {} (空哈希) 就足够了。 exp! 运算符可以用作 shorthand,因为它还给出了默认值 ?has_content 为 false:

[#assign page = cmsfn.page(component)!]
[#if page?has_content]
   [@cms.component content=cmsfn.asContentMap(component) editable=false/]
   ... Do something with `page`, otherwise we need not use #assign.
[#else]
   ... Don't do anything with `page`, it's that strange default object.
[/#if]