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>