Java Freemarker模板:“;按“排序”;一个或另一个
我有一个Freemarker模板,涉及两次 “本地时间”和“服务器时间”。如果我可以从数据中确定用户的LocalTime,我需要使用“LocalTime”&按它排序,否则我需要按ServerTime排序。整个数据存在于列表中(来自记录) 最初使用ServerTime是可以的,其功能如下:Java Freemarker模板:“;按“排序”;一个或另一个,java,templates,freemarker,Java,Templates,Freemarker,我有一个Freemarker模板,涉及两次 “本地时间”和“服务器时间”。如果我可以从数据中确定用户的LocalTime,我需要使用“LocalTime”&按它排序,否则我需要按ServerTime排序。整个数据存在于列表中(来自记录) 最初使用ServerTime是可以的,其功能如下: <#list x.data.record?sort_by("ServerTime") as s> 但是如果我想检查是否有“本地时间”,怎么做 我在等你的消息 <#list x.data.
<#list x.data.record?sort_by("ServerTime") as s>
但是如果我想检查是否有“本地时间”,怎么做
我在等你的消息
<#list x.data.record?sort_by("ServerTime||LocalTime") as s>
(请注意,这不同于对两列进行排序)
?排序依据
无法执行此操作。这需要自定义比较器功能,但ATM不支持排序方式(myComparatorFunction)
如果您不能将已经排序的列表添加到数据模型中,或者您只想触摸表示层,您仍然可以用Java编写一个
TemplateMethodModelEx
,返回排序的列表,并使用将其拉入模板中?sort\u by
无法执行此操作。这需要自定义比较器功能,但ATM不支持排序方式(myComparatorFunction)
如果你不能将已经排序的列表添加到数据模型中,或者你只想触摸表示层,你仍然可以用Java编写一个
TemplateMethodModelEx
,返回排序后的列表,并使用将其拉入模板中,我仍然是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>
${line.displayDate}
${line.Description}
${line.CheckNum}
${line.InvoiceAmount}
${line.Credit}
${line.Remaining}
${line.Balance}
我仍然是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>
${line.displayDate}
${line.Description}
${line.CheckNum}
${line.InvoiceAmount}
${line.Credit}
${line.Remaining}
${line.Balance}