2012-05-03 22 views
2

我是否錯過了某些明顯的內容,或者是否沒有合理的或半途可行的方法將過期日期添加到Liferay留言板中的郵件中?Liferay:郵件過期日期(留言板)

第一個問題是如何在消息編輯器中輸入到期日期。最明顯的解決方案可能是expando屬性,但日期似乎沒有expando數據類型(僅日期爲&),我無法在expando屬性(例如今天+ 6個月)中設置計算的默認值。即使沒有默認值,日期+時間屬性默認爲1970年1月1日,0:00GMT,並使用日期選擇器輸入實際到期日期,這相當繁瑣。輸入到期日期後,沒有明顯的方法來驗證它(例如限制它在今天和今天+ 6個月之間的日期),並且當日期顯示在消息視圖中時,當前語言環境不用於格式化日期和時間。

即使我會以某種方式設法將截止日期壓入expando屬性,但還沒有明顯的方法來評估截止日期。

可以接受的是,消息仍然存在,但不會被計數並顯示在MB portlet中。 MBThreadServiceUtil中用於訪問消息的方法並不提供任何額外的過濾標準,所以我要麼必須加載所有消息,並在Java代碼中執行計數/過濾操作(幾乎不是一個非常聰明的解決方案),要麼我不得不重寫整個服務堆棧「自下而上」並添加get或search方法,這些方法能夠將過濾轉發到數據庫。

首選的解決方案是有一個計劃任務,它定期完全刪除過期的消息。由於MB portlet支持作用域(消息與portlet的作用域相關),並且計劃任務不在portlet上下文中運行,所以我必須以某種方式訪問​​作用域id。如果我瞭解有關此主題的文檔和可用討論,則默認範圍應該是該網頁所屬的社區。另一方面,我們的「留言板頁面」是在組織層面添加的,並且消息的範圍ID與組織ID無關,也不符合組織中任何社區的ID。在這種情況下,有關如何確定作用域ID的想法的任何人?

+0

您正在使用哪個版本的Liferay 6.0或6.1?另外我猜你已經通過配置彈出窗口 - >範圍 - >將選擇下拉菜單更改爲當前頁面,將範圍限定爲該頁面,這種情況是什麼情況? –

+0

我們使用6.0.5 CE。該portlet的作用域爲「默認作用域」,而不是頁面。 – jarnbjo

回答

1

我將它與計劃任務 - liferay使用herefor石英; 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實體,它們不是來自留言板Portlet,所以即使我將根據最後一個發佈日期進行刪除,我也需要一個具有正確範圍的附加條件(請參閱我的問題中的最後一段在確定正確範圍的問題上)。 – jarnbjo

+0

ok,那麼,噹噹前頁面處於所需的範圍內時,您可以創建expando屬性並將此程序添加到MBThread。你可以用「value.object.listener.com.liferay.portlet.messageboards.model.MBThread = com.my.MyChanger」屬性來做到這一點。實現方法「onAfterCreate(MBThread mbThread)... – Mark