Настройте дни, которые можно нажимать во всплывающем календаре

10

Я создаю форму в Drupal 7 с помощью API формы. Прямо сейчас я могу создать обычное поле ввода календаря со следующим кодом:

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

Прямо сейчас я могу заставить красивое всплывающее окно календаря появляться. То, чего я пытаюсь добиться, это включить или отключить определенные даты на основе правила, такого как: отключить все субботы и воскресенья; или даже удалить состояние клика из определенных дат на основе списка национальных праздников ...

Это то, что может быть достигнуто с помощью PHP-кодирования, или это нужно делать с помощью jQuery? В случае, если jQuery является решением, я был бы признателен за любые советы о том, как это сделать ... Календарь - это таблица, но ячейки таблицы не имеют идентификатора или чего-то такого, что могло бы помочь мне найти и отключить их на основе правила. ..

Спасибо.

Маркос Буарк
источник
1
Этот ответ «[Как отключить выходные дни] [1]» поможет вам отключить выходные и некоторые дни. [1]: stackoverflow.com/questions/501943/…
Никит

Ответы:

8

Вы можете передать некоторые параметры Datepicker из php в элемент date_popup с помощью ключа #datepicker_options:

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

С помощью этого метода вы можете передать почти любую опцию, кроме тех, которые принимают функцию в качестве значения, например beforeShowDay, ту, которая необходима для ограничения выходных или праздничных дней в соответствии с ответом, на который ссылается Никит: /programming/501943/can- заместитель JQuery-щ-DatePicker-быть сделан на Disable-субботы, воскресенье-и-holid

Следовательно, JavaScript необходим. Для начала вам нужно включить пользовательский файл js из кода вашего модуля:

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

и предоставить некоторый код FOO.jsдля расширения настроек, установленных модулем date_popup, с помощью наших собственных опций.

Вот пример, который добавляет базовую опцию отключения выходных для всех виджетов DatePicker на странице:

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

Продление до отпуска оставлено читателю в качестве упражнения :)

Примечание: три случая FOOв моих примерах не обязательно должны быть одинаковыми литералами, то есть: вы можете обеспечить BAZповедение в BAR.jsfrom FOO.module.

Обновление: чтобы расширить вышеуказанное для доступности пользовательских дней, просто добавьте функцию, возвращающую true / false для дня, полученного параметрами.

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

Вы можете найти более полный пример в модуле « Ограничения по дате ».

jonhattan
источник
Спасибо, Джонатан! Я успешно установил minDate, и он отключает все последние дни. Это прекрасное начало для меня. Интересно, могу ли я установить что-то вроде maxDate, так как я хочу оставить включенным диапазон только около 15 дней. Я вижу, что есть атрибут fromTo, но не знаю, что он собирается делать. Моя идея состоит в том, чтобы отключить все даты в прошлом (сделано) и все даты в будущем (примерно через 15 дней ()). В середине я проверю документацию javascript сборщика дат, чтобы увидеть, как по отдельности отключить некоторые дни открытых дверей.
Маркос Бурке
1
да, есть также maxDate: api.jqueryui.com/datepicker/#option-maxDate
понедельник,
Спасибо, почему-то, когда я изучал документацию поля date_popup, я не смог найти информацию о параметре maxDate. Это сработало для меня и ограничило календарь maxDate: '#datepicker_options' => array ('minDate' => 0, 'maxDate' => 30,),
Marcos Buarque
Джонатан, мне жаль снова спрашивать. Я дергаю себя за волосы, пытаясь выполнить пользовательскую функцию. Я реализовал вашу модель, и она прекрасно работает для меня. Но теперь я хочу выполнить пользовательскую функцию, чтобы разрешить только определенные даты. Я вижу, вы предложили каникулы в качестве упражнения для читателя ;-) Этот читатель почти с ума сошел, пытаясь решить эту проблему. Если это не большая дополнительная работа для вас, вы не против опубликовать, как бы вы решили это? Не беспокойтесь о деталях, мне просто нужна общая помощь для вызова функции customFunction (date). Спасибо!
Маркос Бурке
Маркос, я обновил свой ответ простым примером использования пользовательской функции.
Джонатан
0

Я использовал модуль Ограничения по дате. Это обеспечивает возможность выбора даты для ряда параметров, таких как фиксированная дата, относительная дата и т. Д.

cchanana
источник