2013-03-25 19 views
14

il componente del calendario delle primefaces sta ricevendo Data per impostazione predefinita. Posso ottenere solo un mese e un anno senza date.Componente del calendario Primefaces mostra solo il mese e l'anno

Come ottenere solo mese e anno

+1

Stai parlando di un componente che può recuperare solo mese e anno? – Jitesh

+1

sì esattamente Jitesh – Sagar

+0

Vuoi avere anni in cima e una lista dei mesi invece dei giorni dentro? o quale comportamento stai osservando? –

risposta

5

primefaces non hanno componente mese anno selettore in quanto tale. Quindi, se si desidera utilizzare il componente esterno basato su jQuery, quindi checkout

+0

Il link è rotto. Si prega di confermare se quello corretto è giusto. – gersonZaragocin

0

È possibile impostare questo nel modello, nel tuo caso sarebbe:

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

Ma mostra solo il numero, come mostrare nell'etichetta l'anno e il mese? –

+1

@CristianChaparroA. Non l'ho ancora provato con il calendario, ma viscerale puoi provare 'pattern =" MMMMMMMM yyyy "' – leostiw

+0

grazie !, ma quando provo a cambiare data non funziona, non posso scegliere un'altra data perché non mostrare il calendario. –

8

Ho appena nascosto la tabella del selettore giorno con CSS. Ho anche dovuto creare le mie frecce per navigare, perché le frecce standard non attivano l'evento dateSelect.

Markup:

<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; 
} 

metodi 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 
} 

Risultato (PrimeFaces 3.4.2):

PrimeFaces calendar modified to show only month and year

4

Ecco come ho raggiunto selettore semplice del mese, che simile a questa:

month range

La pagina Web 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> 

Per impedire la visualizzazione dei giorni di calendario, è sufficiente impostare la proprietà dislay a nessuno con il seguente codice nel file css attiva:

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

Come notato da Daniel Slazlay sopra, la navigazione con il mese/anno elenchi a discesa o con le icone delle frecce non modificare il valore di data interno della p: controlli del calendario. Per ottenere ciò, il valore dei menu a discesa del mese e dell'anno selezionati viene letto per il due p: calendario quando viene attivato il pulsante «calendario rigenerato».Con queste informazioni, è possibile costruire una stringa di data con il formato "aaaa-MM-gg" e impostare il valore nascosto interno di p: controlli del calendario Per il mese iniziale dell'intervallo del mese, il primo giorno del mese viene restituito mentre per il mese finale, è l'ultimo giorno del mese che viene restituito. Questo viene fatto con il javascript followin:

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()); 
} 

Sul lato server, è possibile verificare che l'informazione giusta viene ricevuto dai metodi 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)); 
} 

Spero che questo possa aiutare gli altri.

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

Potresti aggiungere qualche contesto? Forse spiegare il codice? –

0

si deve aggiungere che questo blocco per completare la navigazione con la freccia:

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

è possibile utilizzare l'evento viewChange sul p: calendario per catturare il clic sul mese prossimo/precedente. Quindi è possibile attivare l'evento dateSelect facendo clic sul primo giorno del mese.

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> 

Per nascondere il riquadro con i giorni, aggiungere il seguente al css

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

utilizzata questa funzione dalla documentazione primefaces:

altro evento pratico è il viewChange che viene sparato quando mese eCambiamenti daanni. Un'istanza di org.primefaces.event.DateViewChangeEvent viene passata al listener di eventi che fornisce il mese corrente e l'anno informazioni.

fatto la seguente codice: 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; 
} 

Bean

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); 
    } 

Fondamentalmente il trigger ajax quando month o year viene modificato è la funzione principale qui. Sfortunatamente, questo è un po 'un problema in quanto non riesco a recuperare il org.primefaces.event.DateViewChangeEvent. Questo sembra essere un bug e ho appena pubblicato un rapporto sul forum Primefaces. Aggiornerà questo post quando avrò dei feedback lì.

Spero che aiuti.

Problemi correlati