Freemarker模板:“Sort_by”中的一个或其他

时间:2013-01-15 12:24:13

标签: java templates freemarker

我有一个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>

(请注意,这与排序两列不同)

2 个答案:

答案 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>