2013-03-25 142 views
14

primefaces日曆組件默認情況下爲日期。我可以只有月和年沒有日期。Primefaces日曆組件僅顯示月份和年份

如何獲得只月份和年份

+1

您是否在談論只能獲取月份和年份的組件? – Jitesh 2013-03-25 07:24:04

+1

是的確切Jitesh – Sagar 2013-03-25 07:28:11

+0

你想擁有幾年,而不是幾天的月份列表?或者你在說什麼行爲? – 2013-03-25 07:33:48

回答

5

PrimeFaces沒有月份選取器組件。所以,如果你想使用基於jQuery的外部組件,然後結賬jQuery.mtz.monthpicker

+0

鏈接已損壞。請確認更正的一個是否正確。 – gersonZaragocin 2016-11-10 21:56:01

0

您可以設置此的模式,在你的情況將是:

<p:calendar id="test" value="#{bean.date}" pattern="MM.yyyy" /> 
+0

但是隻顯示數字,如何在標籤中顯示年份和月份? – 2013-08-29 20:07:45

+1

@CristianChaparroA。我沒有嘗試過,但日曆,但內臟,你可以嘗試'pattern =「MMMMMMMM yyyy」' – leostiw 2013-08-30 08:23:53

+0

謝謝!,但是當我嘗試更改de date不起作用時,我不能選擇其他日期,因爲不顯示日曆。 – 2013-09-22 22:04:37

8

我只是用CSS隱藏了日期選擇器的表格。我還必須創建自己的箭頭進行導航,因爲標準箭頭不會觸發dateSelect事件。

標記

<p:commandButton actionListener="#{bean.decrementMonth}" 
    id="navLeft" update="[your components]" icon="ui-icon-triangle-1-w" /> 

<h:panelGroup class="tableView"> 
    <p:calendar value="#{bean.selectedDate}" mode="inline" /> 
</h:panelGroup> 

<p:commandButton actionListener="#{bean.incrementMonth}" 
    id="navRight" update="[your components]" icon="ui-icon-triangle-1-e" /> 

CSS

.tableView table, 
.tableView a.ui-datepicker-prev, 
.tableView a.ui-datepicker-next { 
    display: none; 
} 

bean的方法

public void decrementMonth() throws Exception { 
    Calendar c = Calendar.getInstance(); 
    c.setTime(this.selectedDate); 
    c.add(Calendar.MONTH, -1); 

      //... business logic to update date dependent data 
} 

public void incrementMonth() throws Exception { 
    Calendar c = Calendar.getInstance(); 
    c.setTime(this.selectedDate); 
    c.add(Calendar.MONTH, 1); 

      //... business logic to update date dependent data 
} 

結果PrimeFaces 3.4.2):

PrimeFaces calendar modified to show only month and year

4

這是我如何實現一個簡單的一個月的範圍選擇看起來是這樣的:

month range

的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" /> 
     &nbsp; 
     <p:commandButton value="#{msgs.CalendrierRegenerer}" update=":calendrierFormulaire" 
       onclick="regenererCal()"/> 
    </h:panelGrid> 
</h:form> 

要防止顯示日曆日,您只需要設置其dislay屬性沒有用下面的代碼在您的活動css文件:

.ui-datepicker-calendar { 
    display: none; 
} 

正如丹尼爾Slazlay上面提到的,與月/年的下拉菜單或箭頭圖標導航不改變內部日期值的p:日曆控件。爲了達到這個目的,當「重新生成日曆」按鈕被觸發時,爲兩個p:日曆讀取所選月份和年份的下拉值。通過這些信息,您可以構建格式爲「yyyy-MM-dd」的日期字符串並設置p:日曆控件的內部隱藏值。對於月份範圍的開始月份,本月的第一天返回,而在結束的月份,它是返回的月份的最後一天。這與跟隨着的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)); 
} 

我希望這可以幫助別人。

1
//<![CDATA[ 

    function showMonthYear(calendar){ 

     $('.ui-datepicker-calendar').css('display','none'); 
     $('.ui-datepicker').css('top', $('.ui-datepicker').offset().top+250); 

     var month = ''; 
     var year = ''; 

     if($(calendar).val()){ 
      month = $(calendar).val().split('/')[0]; 
      year = $(calendar).val().split('/')[1]; 
     } else { 
      month = $.datepicker.formatDate("mm", new Date()); 
      year = $.datepicker.formatDate("yy", new Date()); 
     } 

     var exists = 0 != $('.ui-datepicker-year option[value='+year+']').length; 
     if(!exists){ 

      $(".ui-datepicker-year").empty(); 
      var initYear = parseInt(year)-10; 
      var endYear = parseInt(year)+10; 
      while(initYear < endYear){ 

       $(".ui-datepicker-year").append($('<option>', {value:initYear, text: initYear})); 
       initYear++; 
      } 

     } 

     $('.ui-datepicker-month').val(parseInt(month)-1); 
     $('.ui-datepicker-year').val(year); 
     $(".ui-datepicker-month").change(function(){changeMonthYear(calendar);}); 
     $(".ui-datepicker-year").change(function(){changeMonthYear(calendar);}); 

    } 

    function changeMonthYear(calendar){ 

     console.log('changeMonthYear'); 
     $('.ui-datepicker-calendar').css('display','none'); 
     $(".ui-datepicker-month").change(function(){changeMonthYear(calendar);}); 
     $(".ui-datepicker-year").change(function(){changeMonthYear(calendar);}); 

     var month = parseInt($('.ui-datepicker-month').val())+1; 
     if(month < 10){ month = '0'+month; } 
     $(calendar).val(month+"/"+parseInt($('.ui-datepicker-year').val())); 

    } 


//  ]]> 
</script> 

<p:calendar size="5" 
    onclick="showMonthYear(this)" 
    maxlength="10" pattern="MM/yyyy" navigator="true" /> 
+0

你可以添加一些上下文嗎?也許解釋代碼? – 2015-12-01 14:33:09

0

你必須添加此塊來完成導航箭頭:

$(".ui-datepicker-next").click(function(){changeMonthYear(calendar);}); 
$(".ui-datepicker-prev").click(function(){changeMonthYear(calendar);}); 
0

你可以在p使用viewChange事件:日曆捕捉下一個/上月的點擊。然後,您可以通過單擊該月的第一天來觸發dateSelect事件。

JSF

<p:calendar value="#{sampleBean.month}" styleClass="monthcal" mode="inline"> 
    <p:ajax event="viewChange" onsuccess="$('.ui-calendar[id=\''+this.source+'\'] a.ui-state-default').filter(function(){return $(this).text()*1===1;}).click();" /> 
</p:calendar> 

爲了隱藏與天窗玻璃,添加以下的CSS

.monthcal .ui-datepicker-calendar {display: none;} 
0

從Primefaces文檔使用了該功能:

另一個方便的事件是viewChange在月份被觸發並且 年的變化。將org.primefaces.event.DateViewChangeEvent 的實例傳遞給提供當前月份和年份 信息的事件偵聽器。

作了如下代碼: XHTML

<p:panelGrid styleClass="monthYearOnly"> 
         <p:row> 
          <p:column>FROM:</p:column> 
          <p:column> 
           <p:calendar id="from" mode="inline" value="#{callEntryBean.from}" navigator="true"> 
            <p:ajax event="viewChange" listener="#{callEntryBean.updateFrom()}"/> 
           </p:calendar> 
          </p:column> 
          <p:column>TO:</p:column> 
          <p:column> 
           <p:calendar id="to" mode="inline" value="#{callEntryBean.to}" navigator="true"> 
            <p:ajax event="viewChange" listener="#{callEntryBean.updateTo()}"/> 
           </p:calendar> 
          </p:column> 
          <p:column> 
           <p:commandButton value="Filter" 
            action="#{callEntryBean.filterDisplay}" update=""/> 
          </p:column> 
         </p:row> 
</p:panelGrid> 

CSS

.monthYearOnly .ui-datepicker-calendar{ 
    display: none; 
} 

public void updateFrom(){ 

     Map<String,String> requestParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 
     LOGGER.info("before: " + from); 
     Calendar c = Calendar.getInstance(); 
     c.setTime(from); 
     c.set(Calendar.MONTH, Integer.parseInt(requestParams.get("form:from_month")) - 1); 
     c.set(Calendar.YEAR, Integer.parseInt(requestParams.get("form:from_year"))); 
     from = c.getTime(); 


     LOGGER.info("after: " + from); 
    } 
    public void updateTo(){ 

     Map<String,String> requestParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 
     LOGGER.info("before: " + to); 
     Calendar c = Calendar.getInstance(); 
     c.setTime(to); 
     c.set(Calendar.MONTH, Integer.parseInt(requestParams.get("form:to_month")) - 1); 
     c.set(Calendar.YEAR, Integer.parseInt(requestParams.get("form:to_year"))); 
      c.set(Calendar.DATE,c.getActualMaximum(Calendar.DAY_OF_MONTH)); 
      to = c.getTime(); 

     Calendar now = Calendar.getInstance(); 
     if(c.after(now)){ 
      to = now.getTime(); 
     } 
     LOGGER.info("after: " + to); 
    } 

基本上,當monthyear被更改時,ajax觸發器是此處的主要功能。不幸的是,這是一個工作,因爲我無法檢索org.primefaces.event.DateViewChangeEvent。這似乎是一個錯誤,我剛剛在Primefaces論壇上發佈了一個報告。當我在那裏得到一些反饋時,會更新這篇文章。

希望它有幫助。

相關問題