我在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" />
答案 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
文件,然后搜索您想要设置的变量。