Passen Sie Tage an, auf die in einem Kalender-Popup geklickt werden kann

10

Ich erstelle ein Formular in Drupal 7 mit der Formular-API. Im Moment kann ich ein gewöhnliches Kalender-Eingabefeld mit dem folgenden Code erstellen:

   $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>',
  );

Im Moment kann ich das schöne Kalender-Popup anzeigen lassen. Ich versuche, bestimmte Daten zu aktivieren oder zu deaktivieren, basierend auf einer Regel wie: Alle Samstage und Sonntage deaktivieren; oder entfernen Sie sogar den Klickstatus von bestimmten Daten basierend auf einer Liste von Nationalfeiertagen ...

Ist dies etwas, das mit PHP-Codierung erreicht werden kann, oder muss es mit jQuery durchgeführt werden? Für den Fall, dass jQuery die Lösung ist, würde ich mich über Hinweise dazu freuen ... Der Kalender ist eine Tabelle, aber Tabellenzellen haben keine ID oder etwas, das mir helfen könnte, sie basierend auf einer Regel zu finden und zu deaktivieren. ..

Vielen Dank.

Marcos Buarque
quelle
1
Diese Antwort "[So deaktivieren Sie Wochenenden] [1]" hilft Ihnen beim Deaktivieren von Wochenenden und einigen Tagen. [1]: stackoverflow.com/questions/501943/…
Nikit

Antworten:

8

Sie können einige Datepicker-Optionen von PHP an das date_popup-Element über den Schlüssel '#datepicker_options' übergeben:

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

Mit dieser Methode können Sie fast jede Option übergeben, außer denjenigen, die eine Funktion als Wert akzeptieren, wie die beforeShowDay, die erforderlich ist, um Wochenenden oder Feiertage gemäß der von Nikit angegebenen Antwort einzuschränken: /programming/501943/can- the-jquery-ui-datepicker-be-made-to-disable-samstags-and-sonntags-and-holid

Daher ist Javascript erforderlich. Zuerst müssen Sie eine benutzerdefinierte js-Datei aus Ihrem Modulcode einfügen:

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

und geben Sie Code ein FOO.js, um die vom date_popup-Modul festgelegten Einstellungen um unsere eigenen Optionen zu erweitern.

Hier ist ein Beispiel, das die grundlegende Option zum Deaktivieren von Wochenenden für alle Datepicker-Widgets auf der Seite hinzufügt:

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

Die Verlängerung auf Feiertage bleibt dem Leser als Übung überlassen :)

Hinweis: Die drei Vorkommen FOOin meinen Beispielen müssen nicht dasselbe Literal sein, dh Sie können ein BAZVerhalten in BAR.jsfrom angeben FOO.module.

Update: Um das oben Gesagte für die Verfügbarkeit benutzerdefinierter Tage zu erweitern, fügen Sie einfach eine Funktion hinzu, die true / false für den von den Parametern empfangenen Tag zurückgibt.

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

Ein vollständigeres Beispiel finden Sie im Modul Datumsbeschränkungen .

jonhattan
quelle
Vielen Dank, Jonhattan! Ich habe das minDate erfolgreich festgelegt und es deaktiviert alle letzten Tage. Dies ist ein großartiger Anfang für mich. Ich frage mich, ob ich so etwas wie ein maxDate einstellen kann, da ich nur einen Bereich von etwa 15 Tagen aktivieren möchte. Ich kann sehen, dass es ein 'fromTo'-Attribut gibt, habe aber keine Ahnung, was es tun wird. Meine Idee ist es, alle Daten in der Vergangenheit (erledigt) und alle Daten in der Zukunft (in ungefähr 15 Tagen ()) zu deaktivieren. In der Mitte werde ich die Javascript-Dokumentation zum Datums-Pickeer überprüfen, um zu sehen, wie einige der Tage der offenen Tür einzeln deaktiviert werden können.
Marcos Buarque
1
Ja, es gibt auch ein maxDate: api.jqueryui.com/datepicker/#option-maxDate
jonhattan
Aus irgendeinem Grund konnte ich beim Durchsuchen der Dokumentation des Felds date_popup keine Informationen zur Option maxDate finden. Dies funktionierte für mich und beschränkte den Kalender auf ein maxDate: '#datepicker_options' => Array ('minDate' => 0, 'maxDate' => 30,),
Marcos Buarque
jonhattan, es tut mir leid, noch einmal zu fragen. Ich ziehe an meinen Haaren und versuche, eine benutzerdefinierte Funktion auszuführen. Ich habe Ihr Modell implementiert und es funktioniert hervorragend für mich. Aber jetzt möchte ich eine benutzerdefinierte Funktion ausführen, um nur bestimmte Daten zuzulassen. Ich sehe, Sie haben die Feiertage als Übung für den Leser vorgeschlagen ;-) Dieser Leser ist fast verrückt, wenn er versucht, dieses Problem zu lösen. Wenn es für Sie keine große zusätzliche Arbeit ist, haben Sie etwas dagegen, zu veröffentlichen, wie Sie dies lösen würden? Kümmere dich nicht um Details, ich brauche nur eine allgemeine Hilfe, um den Aufruf von customFunction (Datum) durchzuführen. Vielen Dank!
Marcos Buarque
Marcos, ich habe meine Antwort mit einem einfachen Beispiel für die Verwendung einer benutzerdefinierten Funktion aktualisiert.
Jonathan
0

Ich habe das Modul "Datumsbeschränkungen" verwendet. Dies bietet und Option, um das Datum auf die Anzahl der Parameter wie festes Datum, relatives Datum usw. zu beschränken.

Cchanana
quelle