Templates 对Velocity模板中的对象进行排序-Liferay

Templates 对Velocity模板中的对象进行排序-Liferay,templates,sorting,structure,liferay,liferay-velocity,Templates,Sorting,Structure,Liferay,Liferay Velocity,我在Liferay中创建了一个结构,如下所示 现在头部可重复块,我有4-5个相同的元素块。其中每一个都有不同的“日期”值。“日期”是简单的文本类型。日期格式为(日/月/年) 现在我想根据输入的日期按排序顺序显示所有元素 我的模板如下 <ul> #set($count = 0) #foreach( $nm in $header.getSiblings()) #set($conte

我在Liferay中创建了一个结构,如下所示


现在头部可重复块,我有4-5个相同的元素块。其中每一个都有不同的“日期”值。“日期”是简单的文本类型。日期格式为(日/月/年)

现在我想根据输入的日期按排序顺序显示所有元素

我的模板如下

<ul>
                #set($count = 0)
                #foreach( $nm in $header.getSiblings())
                    #set($content="content"+$count)
                    <li id="$content">
                        <div class="event">
                        #set($monthnameid="month"+$count)
                        #set($dayid="day"+$count)
                        <p class="date-section">
                            <span class="month" id="$monthnameid">$nm.date.data</span>
                            <span class="date" id="$dayid"></span>
                        </p>
                        <p class="event-detail-section">
                            #if($nm.headerlink.data !="")
                                <span class="event-title"><a class="event-link" href="$nm.headerlink.data">$nm.data</a></span>
                            #else
                                <span class="event-header">$nm.data</span>
                            #end

                            #if($nm.description.data.toString().length() >100)
                                <span class="event-description">$nm.description.data.toString().substring(0,100)</span>
                            #else
                                <span class="event-description">$nm.description.data.toString()</span>
                            #end
                            <span class="event-location">Location: $nm.location.data</span>
                        </p>
                    </div>
                </li>
                #set($count = $count +1)
            #end
            </ul>
    #设置($count=0) #foreach($header.getsibles()中的nm) #设置($content=“content”+$count)
  • #设置($monthnameid=“month”+$count) #设置($dayid=“day”+$count)

    $nm.date.data

    #如果($nm.headerlink.data!=“”) #否则 $nm.data #结束 #如果($nm.description.data.toString().length()>100) $nm.description.data.toString()子字符串(0100) #否则 $nm.description.data.toString() #结束 位置:$nm.Location.data

  • #设置($count=$count+1) #结束
我不知道如何在速度内对物体进行排序


在此方面的任何帮助都将不胜感激。

您可以创建实用程序jar并将其放入servers lib文件夹中,以便所有应用程序都可以使用它

您需要创建java项目,将下面的代码放入其中(根据需要进行修改)。
将其导出到jar并复制到服务器。重新启动正在运行的服务器

package com.tejas.liferay.util.cms;
导入java.text.simpleDataFormat;
导入java.util.Comparator;
导入java.util.Date;
导入java.util.Map;
公共最终类DateComparator实现了Comparator{
私有字符串m_node=null;
私有字符串m_sort=null;
私有字符串m_格式=null;
公共日期比较器(最终字符串p_节点、最终字符串p_排序、最终字符串p_格式){
m_节点=p_节点;
m_排序=p_排序;
m_格式=p_格式;
}
publicstaticdatecomparatornewinstance(最终字符串p_节点、最终字符串p_排序、最终字符串p_格式){
返回新的DateComparator(p_节点、p_排序、p_格式);
}
公共int比较(对象p_object1、对象p_object2){
final Date date1=getDate((Map)p_object1,m_节点);
final Date date2=getDate((Map)p_object2,m_节点);
if(“asc”。相等信号情况(m_排序)){
返回compareAsc(日期1、日期2);
}else if(“desc”.equalsIgnoreCase(m_sort)){
返回compareDesc(日期1、日期2);
}
返回0;
}
公共整数比较SC(日期p_Date 1,日期p_Date 2){
如果(p_date1==null){
返回-1;
}
如果(p_date2==null){
返回1;
}
返回(p_日期1.与(p_日期2)相比)*-1);
}
公共国际比较(日期p_Date 1,日期p_Date 2){
如果(p_date1==null){
返回-1;
}
如果(p_date2==null){
返回1;
}
返回(p_日期1.与(p_日期2)相比);
}
私有日期getDate(最终映射p_映射,最终字符串p_节点){
最终映射Map=(Map)p_Map.get(p_节点);
if(map==null){
返回null;
}
最终字符串dateStr=(String)map.get(“数据”);
最终日期date1=parseDate(dateStr,m_格式);
返回日期1;
}
公共静态日期解析日期(最终字符串p_字符串,最终字符串p_格式){
if(p_字符串==null){
返回null;
}
最终SimpleDataFormat sdf=新SimpleDataFormat(p_格式);
试一试{
返回sdf.parse(p_字符串);
}捕获(例外e){
//你有没有用手失误
}
返回null;
}
}
然后更新您的velocity模板,使其具有

#set($comparator = $portal.getClass().forName("com.tejas.liferay.util.cms.DateComparator").getMethod("newInstance", $portal.getClass().forName("java.lang.String"), $portal.getClass().forName("java.lang.String"), $portal.getClass().forName("java.lang.String")).invoke(null, "date", "asc", "dd/MM/yyyy"))
#set($void = $portal.getClass().forName("java.util.Collections").getMethod("sort", $portal.getClass().forName("java.util.List"), $portal.getClass().forName("java.util.Comparator")).invoke(null, $header.getSiblings(), $comparator))
而不是模板中的原始内容。

注意第一条速度线的终点

invoke(null, "date", "asc", "dd/MM/yyyy"))
“date”是保存日期的字段的名称,“asc”是排序参数(可以是“desc”),最后一个参数是日期格式

更新:
上面两条速度线中的第二条显示在呈现的html中,因此我已更新为不显示:)

更新: 关于评论中的其他问题

将其他类添加到您的jar(从上面开始)

package com.tejas.liferay.util.cms;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Collections;
导入java.util.Date;
导入java.util.List;
导入java.util.Locale;
导入java.util.Map;
公共最后一节课VelocityUtil{
私有VelocityUtil(){
//实用类
}
public static void filter older than today from List and sort(最终列表p_List、最终字符串p_dateFieldName、最终字符串p_dateFormat、最终字符串p_sort){
filterOlderThanTodayFromList(p_列表、p_日期字段名、p_日期格式);
排序(p_列表,新的DateComparator(p_dateFieldName,p_排序,p_dateFormat));
}
公共静态void filterOlderThanTodayFromList(最终列表p_List,最终字符串p_dateFieldName,最终字符串p_dateFormat){
最终日期todayMidnight=getTodayMidnight();
对于(int i=p_list.size()-1;i>=0;i--){
Map Map=p_list.get(i);
最终日期=getDate(地图,p_dateFieldName,p_dateFormat);
如果(今天午夜,在(日期)之后){
p_列表。删除(i);
#set($classString = $portal.getClass().forName("java.lang.String"))
#set($classList = $portal.getClass().forName("java.util.List"))
#set($classComparator = $portal.getClass().forName("java.util.Comparator"))

#set($void = $portal.getClass().forName("com.tejas.liferay.util.cms.VelocityUtil").getMethod("filterOlderThanTodayFromList", $classList, $classString, $classString).invoke(null, $header.getSiblings(), "date", "dd/MM/yyyy"))