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

时间:2017-09-12 09:17:54

标签: nodes freemarker jcr magnolia

我目前正在处理组件,我需要一个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,那么做组件rending,这些页面对象是jrc子节点,当渲染组件这种类型的节点搞乱东西模板时,所以我需要过滤out并确保页面为null,然后渲染。

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

1 个答案:

答案 0 :(得分:2)

FreeMarker(2.x)的模板语言有这个......怪癖,它没有null值。因此,您无法将null存储在变量中。如果foo.bar bar对应于返回getBar()的Java null,那么就模板语言而言,foo根本不包含bar。并且,引用不存在的内容是非法的,除非您在引用表达式上直接应用null /缺少处理程序运算符 (如foo.bar!'myDefault'或{{1 }})。

因此,最简单的方法是避免像foo.bar??这样的分配。但有时这是不可接受的,因此你必须再次让[#if cmsfn.page(component)??]...[/#if]进一步下降。然后,您可以使用一些默认值,您可以区分非默认值。假设对于page对象page给出?has_content(除非你使用了一些奇怪的true),一个默认值如ObjectWrapper(空哈希) )足够了。 {}运算符可以用作速记,因为它还提供了exp!为false的默认值:

?has_content