Personnalisez les jours sur lesquels vous pouvez cliquer sur une fenêtre de calendrier

10

Je crée un formulaire dans Drupal 7 avec l'API de formulaire. À l'heure actuelle, je peux créer un champ de saisie de calendrier ordinaire avec le code suivant:

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

En ce moment, je peux faire apparaître la belle fenêtre de calendrier. Ce que j'essaie d'atteindre, c'est d'activer ou de désactiver certaines dates en fonction d'une règle comme: désactiver tous les samedis et dimanches; ou même supprimer l'état du clic à des dates spécifiques sur la base d'une liste de fêtes nationales ...

Est-ce quelque chose qui peut être réalisé avec le codage PHP, ou doit-il être fait avec jQuery? Dans le cas où jQuery est la solution, j'apprécierais des conseils sur la façon de le faire ... Le calendrier est un tableau, mais les cellules du tableau n'ont pas d'ID ou quelque chose qui pourrait m'aider à les trouver et à les désactiver en fonction d'une règle. ..

Je vous remercie.

Marcos Buarque
la source
1
Cette réponse «[Comment désactiver les week-ends] [1]» vous aidera à désactiver les week-ends et certains jours. [1]: stackoverflow.com/questions/501943/…
Nikit

Réponses:

8

Vous pouvez passer certaines options Datepicker de php à l'élément date_popup via la clé '#datepicker_options':

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

Avec cette méthode, vous pouvez passer presque toutes les options, sauf celles qui acceptent une fonction comme valeur, comme beforeShowDaycelle requise pour restreindre les week-ends ou les jours fériés selon la réponse référencée par Nikit: /programming/501943/can- le-jquery-ui-datepicker-be-made-to-disable-samedi-et-dimanche-et-holid

Par conséquent, javascript est requis. Vous devez d'abord inclure un fichier js personnalisé à partir du code de votre module:

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

et fournir du code FOO.jspour étendre les paramètres définis par le module date_popup avec nos propres options.

Voici un exemple qui ajoute l'option de base pour désactiver les week-ends pour tous les widgets de sélecteur de dates de la page:

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

Étendre aux vacances est laissé au lecteur comme exercice :)

Remarque: les trois occurrences de FOOdans mes exemples n'ont pas besoin d'être le même littéral, c'est-à-dire: vous pouvez fournir un BAZcomportement dans BAR.jsfrom FOO.module.

Mise à jour: pour étendre ce qui précède pour la disponibilité des jours personnalisés, ajoutez simplement une fonction renvoyant vrai / faux pour le jour reçu par les paramètres.

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

Vous pouvez trouver un exemple plus complet dans le module Restrictions de date .

jonhattan
la source
Merci, Jonhattan! J'ai réussi à définir la minDate et elle désactive tous les derniers jours. C'est un excellent début pour moi. Je me demande si je peux définir quelque chose comme une maxDate, car je veux garder seulement une plage de 15 jours activée. Je peux voir qu'il y a un attribut «fromTo», mais je n'ai aucune idée de ce qu'il va faire. Mon idée est de désactiver toutes les dates du passé (fait) et toutes les dates du futur (dans 15 jours environ ()). Au milieu, je vais vérifier la documentation javascript du sélecteur de dates pour voir comment désactiver individuellement certains des jours ouverts.
Marcos Buarque
1
oui, il y a aussi une maxDate: api.jqueryui.com/datepicker/#option-maxDate
jonhattan
Merci, pour une raison quelconque, lorsque je cherchais dans la documentation du champ date_popup, je n'ai pas pu trouver d'informations sur l'option maxDate. Cela a fonctionné pour moi et a limité le calendrier à une maxDate: '#datepicker_options' => array ('minDate' => 0, 'maxDate' => 30,),
Marcos Buarque
jonhattan, je suis désolé de demander à nouveau. Je tire mes cheveux en essayant d'exécuter une fonction personnalisée. J'ai implémenté votre modèle et cela fonctionne très bien pour moi. Mais maintenant, je veux exécuter une fonction personnalisée pour n'autoriser que des dates spécifiques. Je vois que vous avez suggéré les vacances comme un exercice pour le lecteur ;-) Ce lecteur est presque fou d'essayer de résoudre ce problème. Si ce n'est pas un travail supplémentaire énorme pour vous, cela vous dérange-t-il de publier comment vous pourriez résoudre ce problème? Ne vous souciez pas des détails, j'ai juste besoin d'une aide globale pour faire l'appel à customFunction (date). Je vous remercie!
Marcos Buarque
Marcos, j'ai mis à jour ma réponse avec un exemple simple d'utilisation d'une fonction personnalisée.
jonhattan
0

J'ai utilisé le module Restrictions de date. Cela permet de limiter la date sur le nombre de paramètres comme la date fixe, la date relative, etc.

cchanana
la source