2012-05-03 3 views
2

Liferay의 게시판에있는 메시지에 만료일을 추가하는 것이 합리적이고 중간에 가능한 방법이 있습니까?Liferay : 메시지 (게시판)의 만료일

첫 번째 문제는 메시지 편집기에 만료일을 입력하는 방법입니다. 가장 확실한 해결책은 아마도 expando 속성이지만 날짜에 대한 expando 데이터 유형이없는 것 같습니다 (날짜는 & 시간 임) expando 속성에 계산 된 기본값을 설정할 방법이 없습니다 (예 : 오늘 + 6 개월). 기본값이 없어도 date + time 속성의 기본값은 Jan 1 1970, 0 : 00GMT이며 날짜 선택 도구를 사용하여 실제 유효 기한을 입력하면 다소 지루합니다. 만료일을 입력 한 후에는 유효성을 검사 할 수있는 확실한 방법이 없습니다 (예 : 오늘과 오늘 + 6 개월 사이의 날짜로 제한). 메시지보기에 날짜가 표시되면 현재 로캘은 날짜를 형식화하는 데 사용되지 않으며 시각.

만료일을 expando 속성으로 집어 넣을지라도 만료 날짜를 평가할 명확한 방법은 없습니다.

메시지는 계속 유지되지만 계산되지 않고 MB 포틀릿에 표시 될 수도 있습니다. 그러나 메시지에 액세스하는 MBThreadServiceUtil의 메소드는 추가 필터링 기준을 제공하지 않으므로 모든 메시지를로드하고 Java 코드에서 카운트/필터 연산을 수행해야합니다 (거의 영리한 솔루션이 아닙니다). 그렇지 않으면 전체를 다시 작성해야합니다. 서비스 스택을 "상향식 (bottom-up)"으로 설정하고 필터링을 데이터베이스로 전달할 수있는 get 또는 검색 메소드를 추가하십시오.

권장되는 솔루션은 정기적으로 만료 된 메시지를 완전히 삭제하는 예약 된 작업을 갖는 것입니다. MB 포틀릿은 범위를 지원하고 (메시지는 포틀릿의 범위와 관련되어 있음) 포틀릿 컨텍스트 내에서 예약 된 작업이 실행되지 않으므로 범위 ID에 어떻게 든 액세스해야합니다. 이 항목에 대한 설명서 및 사용 가능한 토론을 이해하는 경우 기본 범위는 페이지가 속한 커뮤니티 여야합니다. 반면에 우리의 "게시판 페이지"는 조직 수준에서 추가되었으며 메시지의 범위 ID는 조직 ID 또는 조직의 커뮤니티 ID와 일치하지 않습니다. 이 경우 범위 ID를 결정하는 방법에 대한 아이디어가있는 사람은 누구입니까?

+0

6.0 또는 6.1을 사용하는 Liferay의 버전? 또한 구성 팝업 -> 범위 -> 선택 페이지 드롭 다운을 현재 페이지로 변경하여이 페이지의 포틀릿 범위를 지정했을 것입니다. –

+0

우리는 6.0.5 CE를 사용하고 있습니다. 포틀릿의 범위는 페이지가 아닌 "기본 범위"입니다. – jarnbjo

답변

1

Quartz와 같이 예정된 작업으로 평생 사용할 수 있습니다. http://liferaysnippets.com/how-to-create-cron-job-in-liferay/

당신이 DynamicQueries로 저장할 수 만료 된 메시지 :

Calendar c = Calendar.getInstance(); 
    c.add(Calendar.MONTH, -6); 
    Date halfYearAgo = c.getTime(); 
    ClassLoader portalClassLoader = PortalClassLoaderUtil.getClassLoader(); 
    DynamicQuery query = DynamicQueryFactoryUtil.forClass(MBThread.class, portalClassLoader) 
      .add(PropertyFactoryUtil.forName("lastPostDate").le(halfYearAgo)).addOrder(OrderFactoryUtil.asc("lastPostDate")); 

    try { 
     List dynamicQuery = MBThreadLocalServiceUtil.dynamicQuery(query); 
     for (Object object : dynamicQuery) { 
      MBThread thread = (MBThread) object; 
      MBThreadLocalServiceUtil.deleteMBThread(thread); 
     } 
    } catch (SystemException e) { 
     e.printStackTrace(); 
    } 
+0

이것은 내 질문에 실제로 대답하지 않습니다. 구성 가능한 만료 날짜가 아닌 마지막 게시 날짜를 기반으로 스레드를 삭제합니다. 어떤 이유로, 게시판 포틀릿에서 오지 않는 MBThread 엔티티가 있습니다. 따라서 마지막 게시일을 기준으로 삭제할지라도 올바른 범위의 추가 기준이 필요합니다 (내 질문의 마지막 단락 참조). 올바른 범위를 결정하는 문제). – jarnbjo

+0

그러면 현재 페이지가 필수 범위에있을 때 expando 속성을 만들어 MBThread에 프로그래밍 방식으로 추가 할 수 있습니다. "value.object.listener.com.liferay.portlet.messageboards.model.MBThread = com.my.MyChanger"속성을 사용하여이 작업을 수행 할 수 있습니다. 메서드 구현 "onAfterCreate (MBThread mbThread) ... – Mark