在Velocity模板中对对象列表进行排序-Liferay [英] Sort list of objects in Velocity template - Liferay

查看:89
本文介绍了在Velocity模板中对对象列表进行排序-Liferay的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在Liferay中创建了如下结构

I've created a structure in Liferay as below

<root>
      <dynamic-element name='header' type='text' index-type='' repeatable='true'>
        <dynamic-element name='headerlink' type='text' index-type='' repeatable='false'>       </dynamic-element>
        <dynamic-element name='location' type='text' index-type='' repeatable='false'>  </dynamic-element>
        <dynamic-element name='description' type='text_box' index-type='' repeatable='false'>  </dynamic-element>
        <dynamic-element name='date' type='text' index-type='' repeatable='false'></dynamic-element>
      </dynamic-element>
</root>

现在头可重复块,我有4-5个相同的元素块.其中的每个都有不同的日期"值. 日期"是简单的文本类型.日期格式为(dd/mm/yyyy)

Now header repeatable block, I have 4-5 element blocks as same. Each one of have different "date" value inside it. "date" is simple text type. date format is (dd/mm/yyyy)

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

Now I want to display all the element in sorting order based on the date entered.

我的模板如下.

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

我不知道如何对速度内部的对象进行排序.

I am not aware regarding how can we sort object inside velocity.

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

Any help on this would be much appreciated.

推荐答案

您可以创建实用程序jar并将其放在服务器lib文件夹中,以便所有应用程序都可以使用它.

You can create utility jar and put it in servers lib folder so that it it is available to all applications.

您需要创建Java项目,然后将代码从下面放入其中(根据需要进行修改).
将其导出到jar并将其复制到服务器.如果服务器正在运行,请重新启动.

You need to create java project, put code from below in it (modify to your needs).
Export it to jar and copy it to the server. Restart your server if it is running.

package com.tejas.liferay.util.cms;

import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.Map;

public final class DateComparator implements Comparator<Object> {

    private String m_node = null;
    private String m_sort = null;
    private String m_format = null;

    public DateComparator(final String p_node, final String p_sort, final String p_format) {
        m_node = p_node;
        m_sort = p_sort;
        m_format = p_format;
    }

    public static DateComparator newInstance(final String p_node, final String p_sort, final String p_format) {
        return new DateComparator(p_node, p_sort, p_format);
    }

    public int compare(Object p_object1, Object p_object2) {
        final Date date1 = getDate((Map) p_object1, m_node);
        final Date date2 = getDate((Map) p_object2, m_node);

        if ("asc".equalsIgnoreCase(m_sort)) {
            return compareAsc(date1, date2);
        } else if ("desc".equalsIgnoreCase(m_sort)) {
            return compareDesc(date1, date2);
        }

        return 0;
    }

    public int compareDesc(Date p_date1, Date p_date2) {

        if (p_date1 == null) {
            return -1;
        }

        if (p_date2 == null) {
            return 1;
        }

        return (p_date1.compareTo(p_date2) * -1);
    }

    public int compareAsc(Date p_date1, Date p_date2) {

        if (p_date1 == null) {
            return -1;
        }

        if (p_date2 == null) {
            return 1;
        }

        return (p_date1.compareTo(p_date2));
    }

    private Date getDate(final Map p_map, final String p_node) {
        final Map map = (Map) p_map.get(p_node);
        if (map == null) {
            return null;
        }
        final String dateStr = (String) map.get("data");

        final Date date1 = parseDate(dateStr, m_format);
        return date1;
    }

    public static Date parseDate(final String p_string, final String p_format) {
        if (p_string == null) {
            return null;
        }

        final SimpleDateFormat sdf = new SimpleDateFormat(p_format);

        try {
            return sdf.parse(p_string);
        } catch (Exception e) {
            // do you error handeling
        }

        return null;
    }
}

比更新您的力度模板,使其最重要的是

Than update your velocity template so that on top it has

#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))

比模板中的原始内容要多.

注意第一条速度线的终点

than goes original content from you template.

Notice end of first velocity line

invoke(null, "date", "asc", "dd/MM/yyyy"))

日期"是保存日期的字段的名称,"asc"是排序参数(可以是"desc"),最后一个参数是日期格式.

"date" is the name of the field that holds your date, "asc" is sort parameter (it can be "desc") and last parameter is date format.

更新:
来自上方的两条速度线中的第二条在渲染的html中显示,因此我已更新为不显示:)

UPDATE:
Second of two velocity lines from above was showing in rendered html, so I've updated to not be shown :)

更新: 如有其他疑问,请在评论中

UPDATE: For additional question in comment

(从上方)向您的jar添加其他类

Add additional class to your jar (from above)

package com.tejas.liferay.util.cms;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

public final class VelocityUtil {

    private VelocityUtil() {
        // utility class
    }

    public static void filterOlderThanTodayFromListAndSort(final List<Map<String, Map<String, ?>>> p_list, final String p_dateFieldName, final String p_dateFormat, final String p_sort) {
        filterOlderThanTodayFromList(p_list, p_dateFieldName, p_dateFormat);
        Collections.sort(p_list, new DateComparator(p_dateFieldName, p_sort, p_dateFormat));
    }

    public static void filterOlderThanTodayFromList(final List<Map<String, Map<String, ?>>> p_list, final String p_dateFieldName, final String p_dateFormat) {
        final Date todayMidnight = getTodayMidnight();

        for (int i = p_list.size() - 1; i >= 0; i--) {
            Map<String, Map<String, ?>> map = p_list.get(i);
            final Date date = getDate(map, p_dateFieldName, p_dateFormat);
            if (todayMidnight.after(date)) {
                p_list.remove(i);
            }
        }
    }

    public static Date getTodayMidnight() {
        final Calendar calendar = Calendar.getInstance(Locale.getDefault());
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR_OF_DAY, 0);

        final Date todayMidnight = calendar.getTime();
        return todayMidnight;
    }

    public static Date getDate(final Map<String, Map<String, ?>> p_map, final String p_dateFieldName, final String p_dateFormat) {
        final Map<String, ?> map = p_map.get(p_dateFieldName);
        if (map == null) {
            return null;
        }
        final String dateStr = (String) map.get("data");

        final Date date1 = parseDate(dateStr, p_dateFormat);
        return date1;
    }

    public static Date parseDate(final String p_string, final String p_format) {
        if (p_string == null) {
            return null;
        }

        final SimpleDateFormat sdf = new SimpleDateFormat(p_format, Locale.getDefault());

        try {
            return sdf.parse(p_string);
        } catch (Exception e) {
            // do you error handeling
        }

        return null;
    }
}

并放入速度模板

#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"))

假设$header.getSiblings()是要过滤的列表.

这篇关于在Velocity模板中对对象列表进行排序-Liferay的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆