2011-10-06 3 views
2

내가정렬 목록 -을 Liferay

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

지금 반복 블록 헤더 아래로하는 Liferay의 구조를 만들었습니다, 나는 동일 4-5 요소 블록을 가지고있다. 각각은 서로 다른 "날짜"값을 가지고 있습니다. "날짜"는 간단한 텍스트 유형입니다. 날짜 형식은 (dd/mm/yyyy)

이제 모든 요소를 ​​입력 한 날짜를 기준으로 정렬 순서로 표시하려고합니다.

내 템플릿은 다음과 같습니다.

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

우리는 어떻게 객체 내부의 속도를 분류 할 수 있는지에 대해 알지 못합니다.

이 문제에 대한 도움을 주시면 감사하겠습니다.

답변

3

유틸리티 jar를 만들고 서버 lib 폴더에 넣으면 모든 응용 프로그램에서 사용할 수 있습니다.

자바 프로젝트를 만들려면 아래에서 코드를 입력해야합니다 (필요에 따라 수정).
jar 파일로 내 보낸 다음 서버로 복사하십시오. 서버가 실행 중이면 다시 시작하십시오.

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

그 위에 당신이 템플릿에서 원본 콘텐츠를가는 것보다

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

"날짜"날짜가 들어있는 필드의 이름이 "ASC는"매개 변수 일종이며, 마지막 매개 변수 (는 "내림차순"할 수 있습니다) 날짜입니다 체재.

UPDATE : 위에서
두 번째 두의 속도 선이 렌더링 된 HTML에 표시, 그래서 내가

UPDATE : 표시되지 업데이트했습니다 주석의 추가 질문에 대한

추가 추가

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()은 필터링 할 목록입니다.

+0

답장을 보내 주셔서 감사합니다. 그리고 그것은 효과가있었습니다. 슈퍼! 나는 당신이 아래의 요구 사항에 대해서도 나를 안내 할 수 있다면 이러한 새로운 것들입니다. 이것을 얻는 방법은 무엇이되어야합니다. 사실 입력 한 날짜를 기준으로 이미 지나친 개체를 제거하고 싶습니다. 2011 년 5 월 10 일 (dd/MM/yyyy)으로 날짜를 입력하고 현재 날짜가 2011 년 7 월 7 일인 경우 디스플레이에 해당 객체를 제거해야합니다 (표시해서는 안 됨). 미리 감사드립니다. Martin :). –

+0

불행히도 그 목적을 위해 후크를 사용할 수 없습니다. –

+0

"사용자 정의 속도 변수 추가?" 다른 질문이므로이 질문을 새로 작성하십시오. 다른 사람들이 질문과 답변을 쉽게 찾을 수 있습니다. ... 그리고 당신이 답변을 지역 사회에 의해 삭제 된 질문을 볼 수 있듯이, 그래서 항상 질문 당 하나의 질문을해야합니다. –

3

나는 Velocity $sortTool으로 좋은 결과를 얻었습니다. 예제는 페이지 하단에 있습니다. http://www.liferay.com/community/forums/-/message_boards/message/11146823 helparray는 피할 수 없습니다.

날짜가 yyyyMMdd 형식이 아니기 때문에 날짜를 배열에 넣으려면 $ dateTool.toDate가 필요합니다.

+0

사이트에 연결하는 것을 피해야합니다. 답변에 모든 관련 정보가 포함되는 것이 이상적입니다. – thecoshman