Liferay中日曆組件的使用

Liferay中日曆組件的使用


10.1 Journal Portlet的例子用法
在Liferay自帶的portlet中,journal是一個很好的例子。
10.1.1 JSP中的用法
在文件portal-web/docroot/html/portlet/journal/edit_article.jsp中,用法如下:
<%
Calendar displayDate = new GregorianCalendar(timeZone, locale);
if (article.getDisplayDate() != null) {
 displayDate.setTime(article.getDisplayDate());
}
%>
<liferay-ui:input-field model="<%= JournalArticle.class %>" bean="<%= article %>" field="displayDate" defaultValue="<%= displayDate %>" />
這樣,將會顯示日期控件,具體樣式可以看實際運行的例子。年月日分別顯示,並且有一個日曆按鈕,可以彈出一個典型的日曆界面。
10.1.2 生成的HTMl代碼
生成的代碼還挺長,主要分成以下幾個部分:
1、 相應的JavaScript語句
這部分代碼,一是創建一個Calendar對象,就是會彈出來的日曆頁面。另有兩個JS函數jsOnClose和jsOnSelect。
從這段代碼可以看到,如果在一個頁面中有多個Date輸入框,將會生成多個Calendar對象。
2、 生成年月日的HTML代碼
年月日代碼,在Liferay裏面,是三個單獨的Select框。
3、 一個彈出日曆頁面的圖片
用了一個圖片calendar.gif,單擊就會顯示日曆頁面。
4、 生成時分的HTML代碼
在Liferay裏面,有兩個Select框,和一個AM、PM的選項框。
10.1.3 Action中獲取時間的方法
因爲HTML代碼是將時間分成了多個Input,因此在Action裏面獲取時間,並不是簡單的getParameter,而是要根據多個input值,生成相應的Date。
核心代碼爲
  int displayDateMonth = ParamUtil.getInteger(req, "displayDateMonth");
  int displayDateDay = ParamUtil.getInteger(req, "displayDateDay");
  int displayDateYear = ParamUtil.getInteger(req, "displayDateYear");
  int displayDateHour = ParamUtil.getInteger(req, "displayDateHour");
  int displayDateMinute = ParamUtil.getInteger(req, "displayDateMinute");
  int displayDateAmPm = ParamUtil.getInteger(req, "displayDateAmPm");
  if (displayDateAmPm == Calendar.PM) {
   displayDateHour += 12;
  }
  Date displayDate = PortalUtil.getDate(
   displayDateMonth, displayDateDay, displayDateYear,
   displayDateHour, displayDateMinute, user.getTimeZone(),
   new ArticleDisplayDateException());
具體可以看看PortalUtil.getDate的實現代碼,就是利用GregorianCalendar生成Date對象。
10.2 源代碼閱讀
看到這裏,可能會有一個疑問,幾乎所有的input輸入框,都是使用<liferay-ui:input-field>這個Taglib實現的,而且從JSP中,看不出在哪兒定義了這個input-field應該顯示爲日期,而不是普通的input窗口。
而這,可以通過閱讀源代碼來解釋。具體代碼爲:
portal/portal-web/docroot/html/taglib/ui/input_field/page.jsp
通過閱讀這段代碼,可以知道,不同類型的field,將會生成不同的HTML代碼,而依據就是配置文件portal-model-hints.xml和ext-model-hints.xml。這裏面有Field的類型的定義。
比如,Journal裏面的displayDate的定義則爲:
<field name="displayDate" type="Date" />。
另外,通過源代碼還可以看到,如果只是顯示年月日,而不顯示時分,可以設置爲
  <field name=" displayDate" type="Date">
   <hint name="show-time">false</hint>
  </field>
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章