在Freemarker模板中设置嵌套属性

时间:2015-03-17 11:29:35

标签: alfresco freemarker

我在Alfresco工作,我想创建自己的自定义组件(用于表单),扩展现有组件。在我的情况下“number.ftl”。

我想提供设置defaultValue的功能,这样如果field.value为空,则会使用默认值

默认-number.flt

<#if field.control.params.defaultValue?? && !field.value?has_content>
    <#assign field.value=field.control.params.defaultValue>
</#if>
<#include "/org/alfresco/components/form/controls/number.ftl" />

它抱怨field.value中的点(。):

  

引起:freemarker.core.ParseException:第3行第23行模板“org / alfresco / components / form / controls / year.ftl”中的解析错误:   遇到“。”,但期待其中一个:       “=”       “在”       “&gt;” 中

如何设置变量?

更新

我已经按照abarisone的建议进行了尝试(但是在导入“number.ftl”后我无法设置变量或者会使用旧值):

<#if field.control.params.curretYearDefaultValue?? && !field.value?has_content>
    <#assign value in field>
        ${.now?string("yy")}
    </#assign>
</#if>
<#include "/org/alfresco/components/form/controls/number.ftl" />

但我明白了:

  

FreeMarker模板错误:对于“#assign”命名空间:预期命名空间,但是这被评估为extended_hash +字符串(org.alfresco.web.scripts.forms.FormUIGet $ Field包装到f.e.b.StringModel中):==&gt;字段[在模板“org / alfresco / components / form / controls / year.ftl”第3行第27列]

UPDATE2 (已解决)

根据ddekany的建议,这里有一个可行的解决方案

<#if field.control.params.useCurretYearAsDefaultValue?? && field.control.params.useCurretYearAsDefaultValue = "true" && !field.value?has_content>
    ${field.setValue(.now?string("yyyy"))!}
</#if>
<#include "/org/alfresco/components/form/controls/number.ftl" />

2 个答案:

答案 0 :(得分:3)

FreeMarker模板不支持数据模型修改。它们只是为了阅读已经由Java代码准备的东西。您可以设置顶级变量,因为它们不是数据模型的一部分(它们位于顶级数据模型变量前面的范围内)。所以FreeMarker甚至没有修改子变量的语法。但是,可能存在后门以实现您想要的效果。根据配置设置和field在Java级别上的内容,${field.setValue(...)}可能有效。请注意,这样做非常黑客。操纵模板中的表单内容,这很糟糕。你应该至少调用一些Java帮助方法。

答案 1 :(得分:0)

如果查看Freemarker assign reference,您会看到当您使用assign时,通常会写<#assign name=value>,其中name是变量的名称。这不是表达。 事实上,编译器抱怨它期望“=”或“在”的事实。 如果你进一步观察,后者是有道理的:

<#assign name in namespacehash>
  capture this
</#assign>

解释如下:

  

如果您知道名称空间是什么:assign指令在名称空间中创建变量。通常,它在当前名称空间中创建变量(即在与标记所在的模板相关联的名称空间中)。但是,如果在namespacehash中使用,则可以创建/替换除当前名称空间之外的另一个名称空间的变量。例如,在这里创建/替换用于/mylib.ftl的命名空间的变量bgColor:

<#import "/mylib.ftl" as my>
<#assign bgColor="red" in my>  

因此我建议您先导入number.ftl文件,然后搜索您想要设置的变量。