1

对于接近 Alfresco 的人来说,这可能是一个问题,因为它有点具体。

我在创建网站时添加了一个自定义方面,它拥有一个日期类型的属性:

<type>d:date</type>

现在,我正在扩展site.lib.ftl文件以显示此日期:

"startdate": "<#if site.node.hasAspect("my:customAspect")>${siteNode.properties["my:customAspectDate"]?string("yyyy-MM-dd")}</#if>",

由于无法访问宏本身中的 site.node,因此我扩展了宏参数列表:

<#macro siteJSONManagers site siteNode roles>

所以我可以从site.get.json.ftlperson.sites.get.json.ftl调用它:

<@siteLib.siteJSON site=site siteNode=siteNode />

现在,对于 site.get.js,我在 javascript 中准备了 sitenode:

model.siteNode = site.node; // or the same with site.getNode;

我的日期被正确解析。但是,当从person.sites.get.json.ftl调用宏时,我无法在 javascript 控制器中准备 site.node ,所以我在 freemarker 中执行它(通过直接调用它):

<@siteLib.siteJSONManagers site=site siteNode=site.node roles=roles/>

在使用这种形式时,我得到了这个异常:

"09090011 Wrapped Exception (with status template): 09090096 Error during processing of the template 'Expected method. siteNode.properties[\"my:customAspectDate\"]?string evaluated instead to freemarker.template.SimpleScalar on line 59, column 71 in org\/alfresco\/repository\/site\/site.lib.ftl.'. Please contact your system administrator."

如果我只显示这个标量 (${siteNode.properties["my:customAspectDate"]}),我会在生成的 JSON 中得到 org.mozilla.javascript.NativeDate 作为字符串:

"startdate": "org.mozilla.javascript.NativeDate@7a6e5e2e",

我可以通过在 site.get.json.ftl 中为 siteNode 设置相同的参数来重复这一点。如果我使用 siteNode.properties["cm:created"],我什至可以重复它。

在我看来,当 javascript 控制器从节点创建模型对象时,创建的日期道具被创建为 java.util.Date 或 Freemarker 使用的任何内容,并且当 Freemarker 本身创建该属性时,它将变成 org. mozilla.javascript.NativeDate。

有人可以指出如何改进我的代码以显示日期吗?我可以使用什么来使我的调用获得相同的值?

如果有任何不同,我正在使用 SVN HEAD 的 Alfresco。

4

3 回答 3

4

如果人们经常在 Alfresco 与 Rhino 一起工作,那么这应该在那里解决。发生的事情是这样的:FreeMarker 模板不直接java.util.Date用于日期,它们使用freemareker.template.TemplateDateModel. FreeMarker 有一个名为 的设置object_wrapper,它是将对象转换为freemareker.template.Template{Something}Model-s 的对象。显然,Alfresco 使用的对象包装器不知道org.mozilla.javascript.NativeDate,它TemplateScalarModel使用toString(). 因此yourDate?string, where yourDateis a FreeMarker 字符串 ( TemplateScalarModel) 将评估为与 相同的字符串yourDate,因此(...)after 它将失败(您不能调用字符串)。何时yourDate是 FreeMarker 日期(java.util.Date正确转换为TemplateDateModel),yourDate?string评估为格式化程序方法,因此(...)之后就可以调用了。

因此,如果在 Alfresco 中使用 Rhino (JavaScript) 对象很常见,它们应该扩展它们ObjectWrapper以识别 Rhino 对象。也许他们需要做的就是混进去freemarker.ext.rhino.RhinoWrapper

于 2012-10-09T21:56:44.210 回答
3

嗨,您可以在 Freemarker 中使用以下内容:

${siteNode.properties["my:customAspectDate"]?date?string("yyyy-MM-dd")}

Alfresco 在活动 Dashlet 中执行此操作:

活动列表.get.html.ftl

于 2012-10-10T12:10:16.590 回答
1

Aaaaaand 回答我自己的问题,以防其他人也撞到这堵墙两天:

<#assign nodeR=companyhome.childByNamePath["Sites/" + site.shortName] />
"startdate": "<#if nodeR.hasAspect("my:customAspect")>${nodeR.properties["my:customAspectDate"]?string("yyyy-MM-dd")}</#if>",

就像我在论坛上所说的那样,我不知道为什么它以这种方式工作而不是其他方式。

于 2012-10-09T17:57:33.583 回答