Personalizza i giorni in cui è possibile fare clic su un popup del calendario


10

Sto creando un modulo in Drupal 7 con l'API del modulo. In questo momento, posso creare un normale campo di input del calendario con il seguente codice:

   $form['services_tab']['schedule_datepicker'] = array(
    '#title' => t('Pick the desired date'),
    '#type' => 'date_popup',
    '#date_year_range' => '0:0',
    '#date_format' => 'Y-m-d',
    '#prefix' => '<div id="datepicker-schedule">',
    '#suffix' => '</div>',
  );

In questo momento posso visualizzare il bellissimo popup del calendario. Quello che sto cercando di ottenere è abilitare o disabilitare determinate date in base a una regola come: disabilitare tutti i sabati e le domeniche; o addirittura rimuovere lo stato dei clic da date specifiche in base a un elenco di festività nazionali ...

È qualcosa che può essere ottenuto con la codifica PHP o deve essere fatto con jQuery? Nel caso in cui jQuery sia la soluzione, apprezzerei qualsiasi suggerimento su come farlo ... Il calendario è una tabella, ma le celle della tabella non hanno un ID o qualcosa che potrebbe aiutarmi a trovarle e disabilitarle in base a una regola. ..

Grazie.


1
Questa risposta "[Come disabilitare i fine settimana] [1]" ti aiuterà a disabilitare i fine settimana e alcuni giorni. [1]: stackoverflow.com/questions/501943/...
Nikit

Risposte:


8

Puoi passare alcune opzioni di Datepicker da php all'elemento date_popup tramite la chiave '#datepicker_options':

<?php
$form['date'] = array(
  '#title' => t('Pick the desired date'),
  '#type' => 'date_popup',
  '#datepicker_options' => array(
    'minDate' => 0,
  ),
);

Con questo metodo è possibile passare quasi tutte le opzioni tranne quelle che accettano una funzione come valore, in quanto beforeShowDayquella necessaria per limitare i fine settimana o le vacanze in base alla risposta a cui fa riferimento Nikit: /programming/501943/can- la-jquery-ui-datepicker-essere-fatta-a-disable-sabato-e-domenica-e-holid

Quindi, è richiesto JavaScript. Per prima cosa devi includere un file js personalizzato dal codice del tuo modulo:

<?php
drupal_add_js(drupal_get_path('module', 'FOO') . '/FOO.js');

e fornire un codice FOO.jsper estendere le impostazioni impostate dal modulo date_popup con le nostre opzioni.

Ecco un esempio che aggiunge l'opzione di base per disabilitare i fine settimana per tutti i widget di datepicker nella pagina:

(function ($) {
Drupal.behaviors.FOO = {
  attach: function (context) {
    for (var id in Drupal.settings.datePopup) {
      Drupal.settings.datePopup[id].settings.beforeShowDay = $.datepicker.noWeekends;
    }
  }
};
})(jQuery);

L'estensione alle ferie è lasciata come esercizio al lettore :)

Nota: le tre occorrenze di FOOnei miei esempi non devono necessariamente essere le stesse letterali, ovvero: è possibile fornire un BAZcomportamento BAR.jsda FOO.module.

Aggiornamento: per estendere quanto sopra per la disponibilità di giorni personalizzati, basta aggiungere una funzione che restituisce vero / falso per il giorno ricevuto dai parametri.

(function ($) {
Drupal.behaviors.FOO = {
  attach: function (context) {
    for (var id in Drupal.settings.datePopup) {
      Drupal.settings.datePopup[id].settings.beforeShowDay = checkDate;
    }
  }
};

function checkDate(date) {
  if ((date.getDate() % 2) == 0) {
    return [false, 'Even days not available'];
  }
  else {
    return [true, 'Odd days are fine'];
  }
}
})(jQuery);

Puoi trovare un esempio più completo nel modulo Restrizioni di data .


Grazie Jonhattan! Ho impostato con successo il minDate e disabilita tutti i giorni passati. Questo è un grande inizio per me. Mi chiedo se posso impostare qualcosa come un maxDate, poiché voglio mantenere abilitato solo un intervallo di circa 15 giorni. Vedo che esiste un attributo 'fromTo', ma non ho idea di cosa farà. La mia idea è quella di disabilitare tutte le date nel passato (fatto) e tutte le date nel futuro (tra circa 15 giorni da adesso ()). Nel mezzo, controllerò la documentazione javascript di pickeer della data per vedere come disabilitare individualmente alcuni dei giorni aperti.
Marcos Buarque,


Grazie, per qualche motivo, quando stavo esaminando la documentazione del campo date_popup non sono riuscito a trovare informazioni sull'opzione maxDate. Questo ha funzionato per me e ha limitato il calendario a un maxDate: '#datepicker_options' => array ('minDate' => 0, 'maxDate' => 30,),
Marcos Buarque

Manhattan, mi dispiace chiedere di nuovo. Mi sto tirando i capelli cercando di eseguire una funzione personalizzata. Ho implementato il tuo modello e funziona benissimo per me. Ma ora voglio eseguire una funzione personalizzata per consentire solo date specifiche. Vedo che hai suggerito le vacanze come un esercizio per il lettore ;-) Questo lettore è quasi pazzo nel cercare di risolvere questo problema. Se non è un'enorme opera aggiuntiva per te, ti dispiace pubblicare come risolveresti? Non preoccuparti dei dettagli, ho solo bisogno di un aiuto generale per effettuare la chiamata a customFunction (data). Grazie!
Marcos Buarque,

Marcos, ho aggiornato la mia risposta con un semplice esempio dell'uso di una funzione personalizzata.
jonhattan,

0

Ho usato il modulo Restrizioni di data. Questo fornisce e opzione per limitare la data sul numero di parametri come la data fissa, la data relativa, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.