这是我如何实现一个简单的月份范围选择器,如下所示:
VoirCalendrier.xhtml 网页:
<h:form id="calendrierRegenererFormulaire">
<h2><h:outputText value="#{msgs.CalendrierPlageAafficher} "/></h2>
<h:panelGrid columns="6">
<h:outputLabel value="#{msgs.CalendrierDateDebut} : " for="calendrierDateDebut" />
<p:calendar id="calendrierDateDebut" value="#{locationsControleur.dateDebut}"
pattern="yyyy-MM-dd" effect="slideDown" navigator="true" mode="inline"
lang="#{sessionControleur.localeInterface}" locale="#{sessionControleur.langue}" style="moisAnSeul" />
<h:outputLabel value="#{msgs.CalendrierDateFin} : " for="calendrierDateFin" />
<p:calendar id="calendrierDateFin" value="#{locationsControleur.dateFin}"
pattern="yyyy-MM-dd" effect="slideDown" navigator="true" mode="inline"
lang="#{sessionControleur.localeInterface}" locale="#{sessionControleur.langue}" style="moisAnSeul" />
<p:commandButton value="#{msgs.CalendrierRegenerer}" update=":calendrierFormulaire"
onclick="regenererCal()"/>
</h:panelGrid>
</h:form>
为防止显示日历日,您只需在活动的 css 文件中使用以下代码将其显示属性设置为无:
.ui-datepicker-calendar {
display: none;
}
正如上面 Daniel Slazlay 所述,使用月/年下拉菜单或箭头图标导航不会更改 p:calendar 控件的内部日期值。为此,当触发«regenerate calendar» 按钮时,会为两个 p:calendar 读取所选月份和年份下拉列表的值。使用此信息,您可以构建格式为“yyyy-MM-dd”的日期字符串,并设置 p:calendar 控件的内部隐藏值 对于月份范围的起始月份,该月的第一天返回,而对于结束月份,则返回该月的最后一天。这是通过以下 javascript 完成的:
function regenererCal() {
year = $("#calendrierRegenererFormulaire\\:calendrierDateDebut .ui-datepicker-year").val();
month = $("#calendrierRegenererFormulaire\\:calendrierDateDebut .ui-datepicker-month").val();
$('#calendrierRegenererFormulaire\\:calendrierDateDebut_input').val(year + '-' + ('0' + (++month)).slice(-2) + '-01');
year = $("#calendrierRegenererFormulaire\\:calendrierDateFin .ui-datepicker-year").val();
month = $("#calendrierRegenererFormulaire\\:calendrierDateFin .ui-datepicker-month").val();
lastDay = new Date(year, month + 1, 0); // To get last day of month, see http://stackoverflow.com/a/13572682/1431979
$('#calendrierRegenererFormulaire\\:calendrierDateFin_input').val(lastDay.getFullYear() + '-' + ('0' + (lastDay.getMonth()+1)).slice(-2) + '-' + lastDay.getDate());
// Check what is posted to your server
console.log("[voirCalendrier.js]regenererCal calendrierDateDebut_input = " + $('#calendrierRegenererFormulaire\\:calendrierDateDebut_input').val());
console.log("[voirCalendrier.js]regenererCal calendrierDateFin_input = " + $('#calendrierRegenererFormulaire\\:calendrierDateFin_input').val());
}
在服务器端,您可以检查 setter 方法是否接收到正确的信息:
...
formatAAAA_MM_JJ = new SimpleDateFormat("yyyy-MM-dd HH:mm", langue);
...
public void setDateDebut(Date dateDebut) {
this.dateDebut = dateDebut;
logger.info("{locationsContrôleur}setDateDebut dateDebut = " + formatAAAA_MM_JJ.format(dateDebut));
}
public void setDateFin(Date dateFin) {
this.dateFin = dateFin;
logger.info("{locationsContrôleur}setDateFin dateFin = " + formatAAAA_MM_JJ.format(dateFin));
}
我希望这可以帮助其他人。