Hy all,
我是Liferay的新手,我从jsp移植到Liferay门户网站。
如果我有一个portlet jsp,其中有两个日期,如: 从日期 至今 并为每个日期字段使用两个不同的liferay-ui:input-date,如:
...
<%-- From DATE --%>
<tr>
<td>
From date :
</td>
<td>
<liferay-ui:input-date
dayParam='<%= "strDataRegDa" + "Day" %>'
dayValue="<%=Integer.parseInt(strDataRegDa.substring(0,2))%>"
dayNullable="<%= false %>"
monthParam='<%= "strDataRegDa" + "Month" %>'
monthValue="<%=(Integer.parseInt(strDataRegDa.substring(3,5))) -1 %>"
monthNullable="<%= false %>"
yearParam='<%= "strDataRegDa" + "Year" %>'
yearValue="<%=Integer.parseInt(strDataRegDa.substring(6))%>"
yearNullable="<%= false %>"
yearRangeStart="<%= 1980 %>"
yearRangeEnd="<%= 2050 %>"
firstDayOfWeek="<%= Calendar.MONDAY - 1 %>"
imageInputId='<%= "ceremonyDate"%>'
disabled="false" >
</liferay-ui:input-date>
</td>
</tr>
<%-- To DATE --%>
<tr>
<td>
To date :
</td>
<td>
<liferay-ui:input-date
dayParam='<%= "strDataRegA" + "Day" %>'
dayValue="<%=Integer.parseInt(strDataRegA.substring(0,2))%>"
dayNullable="<%= false %>"
monthParam='<%= "strDataRegDa" + "Month" %>'
monthValue="<%=(Integer.parseInt(strDataRegA.substring(3,5))) -1 %>"
monthNullable="<%= false %>"
yearParam='<%= "strDataRegDa" + "Year" %>'
yearValue="<%=Integer.parseInt(strDataRegA.substring(6))%>"
yearNullable="<%= false %>"
yearRangeStart="<%= 1980 %>"
yearRangeEnd="<%= 2050 %>"
firstDayOfWeek="<%= Calendar.MONDAY - 1 %>"
imageInputId='<%= "ceremonyDate"%>'
disabled="false" >
</liferay-ui:input-date>
</td>
</tr>
....
有没有办法控制ToDare是&gt; = FromDate?
使用纯jsp,我可以通过javascript实现。
但是有了Liferay怎么能实现呢?
答案 0 :(得分:2)
在我们的项目中,我使用手动验证我的Portlet类中的两个日期作为日期。我也搜索过但无法获得liferay提供的任何内容。通过javascript不知道Alloy UI是否提供了什么。
所以在我看来,liferay没有提供任何验证两个日期的功能(至少从现在开始),从一些没有这种验证的开箱即用的liferay portlet可以看出,例如公告-portlet with display-date和expiry-date。
答案 1 :(得分:1)
也许你需要像自定义验证器这样的东西。 在jsp中试试这个:
<liferay-ui:input-date name="fromDate"></liferay-ui:input-date>
<liferay-ui:input-date name="toDate">
<aui:validator name="custom" errorMessage="your custom validation msg">
function(val, fieldNode, ruleValue)
{
// No error when toDate is blank
if(val == ""){
return true;
}
var fromDate;
var toDate;
var result=false;
var fromDateObj = document.getElementById("<portlet:namespace />fromDate");
if(fromDateObj) {
fromDate = new Date(fromDateObj.value);
}else{
result = false;
}
toDate = new Date(val);
if(fromDate && toDate){
result = (toDate.getTime() > fromDate.getTime());
}else{
result = false;
}
return result;
}
</aui:validator>
</liferay-ui:input-date>
希望这会对你有所帮助。
感谢。
答案 2 :(得分:1)
我的回答是基于AGi的回答。如果您使用例如在德语设置中,liferay-ui:input-date
将其值格式化为DD/MM/YYYY
而不是MM/DD/YYYY
(我仍然不知道如何更改input-date
的格式..) 。这意味着fromDate = new Date(fromDateObj.value)
不起作用。所以我做了一个解决方法,直接访问日,月和年,并手动比较值。此解决方案的一个优点可能是您独立于input-date
使用的格式:
<liferay-ui:input-date
name="startDate"
yearParam="startDateYear"
monthParam="startDateMonth"
dayParam="startDateDay"
/>
<liferay-ui:input-date
name="endDate"
yearParam="endDateYear"
monthParam="endDateMonth"
dayParam="endDateDay"
>
<aui:validator name="endDateAfterStartDate" errorMessage="some-error-message">
function(value, fieldNode, ruleValue) {
var result = false;
var startDateYear = parseInt(document.getElementById("<portlet:namespace />startDateYear").value);
var startDateMonth = parseInt(document.getElementById("<portlet:namespace />startDateMonth").value);
var startDateDay = parseInt(document.getElementById("<portlet:namespace />startDateDay").value);
var endDateYear = parseInt(document.getElementById("<portlet:namespace />endDateYear").value);
var endDateMonth = parseInt(document.getElementById("<portlet:namespace />endDateMonth").value);
var endDateDay = parseInt(document.getElementById("<portlet:namespace />endDateDay").value);
if (endDateYear > startDateYear) {
result = true;
} else if (endDateYear == startDateYear) {
if (endDateMonth > startDateMonth) {
result = true;
} else if (endDateMonth == startDateMonth) {
if (endDateDay > startDateDay) {
result = true;
}
}
}
return result;
}
</aui:validator>
</liferay-ui:input-date>
也许这有助于某人。