我有一个Freemarker模板,涉及两次 “LocalTime”和“ServerTime”。如果我可以从数据中确定用户的LocalTime,我需要使用“LocalTime”& sort_by it,否则我需要sort_by ServerTime。整个数据存在于列表中(来自记录)
最初使用ServerTime是好的,功能就像:
<#list x.data.record?sort_by("ServerTime") as s>
但如果我想检查是否有“LocalTime”,该怎么做?
我期待一些事情......
<#list x.data.record?sort_by("ServerTime||LocalTime") as s>
(请注意,这与排序两列不同)
答案 0 :(得分:4)
?sort_by
无法做到这一点。这需要自定义比较器功能,但ATM不支持?sort_by(myComparatorFunction)
。
如果您无法添加已排序到数据模型的列表,或者您只想触摸表示层,您仍然可以在Java中编写一个TemplateMethodModelEx
来返回已排序的列表,并将其拉出来使用'<#assign sortByTime = com.example.SortByTimeMethod'?new()>
进入模板,然后您可以编写<#list sortByTime(x.data.record) as s>
。
答案 1 :(得分:0)
我仍然是freemarker的新手,但我相信我刚刚为自己解决了这个问题。它的丑陋,但它的工作原理。我大部分时间都没有处理成千上万行甚至几百行,所以效率不是这个案例的一大问题。 NetSuite是Freemarker的系统,它有点痛苦。
基本上,我在列表中运行一次并将一个值或另一个值(服务器/本地时间)存储到单个变量(invoiceDate
,在我的情况下)。然后我将该变量以及我需要的其他显示变量放入哈希中。那个哈希就是列表中的一行。
要显示:我浏览列表,该列表按我的invoiceDate
变量排序,对于每一行(哈希),我从该键/值对打印出我需要的信息。
我知道这是4年前的事情,但我今晚需要一个答案,直到我这样思考才能找到答案......希望这有助于下一个人!
<#assign y=[]>
<#list record.lines as tmpLine>
<#assign invoiceDate = tmpLine.datecol>
<#if (tmpLine.someIdentifyingMarker != "")>
<#assign invoiceDate = tmpLine.custbody_p_ending_date>
</#if>
<#assign dataLine = {"displayDate":invoiceDate, "Description":tmpLine.description, "CheckNum":tmpLine.custbody_checknumprint, "InvoiceAmount":tmpLine.charge,"Credit":tmpLine.payment,"Remaining":tmpLine.amountremaining,"Balance":tmpLine.balance}>
<#assign y = y+[dataLine]>
</#list>
<#list y?sort_by('displayDate') as line><tr>
<td colspan="4">${line.displayDate}</td>
<td colspan="10">${line.Description}</td>
<td colspan="4"><span style="background-color: rgb(255, 255, 255);">${line.CheckNum}</span></td>
<td align="right" colspan="5">${line.InvoiceAmount}</td>
<td align="right" colspan="4">${line.Credit}</td>
<td align="right" colspan="4"><span style="text-align: -webkit-right; background-color: rgb(255, 255, 255);">${line.Remaining}</span></td>
<td align="right" colspan="5">${line.Balance}</td>
</tr>
</#list></table>