Как использовать обратный вызов onHourShow в элементе управления date_popup с API-интерфейсом Drupal Form - PullRequest
0 голосов
/ 16 июня 2019

У меня есть друпальная форма с одним полем date_popup.Я хотел бы просто предоставить варианты 12, 15 и 17 для часов.

$form['order-group']['delivery'] = array(
    '#title'                => t('I Need The Equipment Ready By'),
    '#type'                 => 'date_popup',
    '#date_format'          => 'd-M-Y H:i',
    '#timepicker'           => 'timepicker',
    '#timepicker_options'   => array(
        'rows'            => 3,
        'hours'         => array(
            'starts'    => 12,
            'ends'      => 17,
        ),
        'onHourShow'   => 'onHourShowCallback',
        'minutes'         => array(
            'starts'    => 0,
            'ends'      => 0,
        ),
        'showCloseButton' => TRUE,
        'closeButtonText' => t('Close'),
    ),
    '#default_value'  => date('Y-m-d 12:00',time()),
    '#date_label_position'  => '',
);

Затем я добавил следующее в свой файл javascript (включенный в drupal_add_js, ранее в сценарии)

function onHourShowCallback(hour) {
    return hour == 12 || hour == 15 || hour == 17;
};

Однако я получаю следующую ошибку:

Uncaught TypeError: onHourShow.apply is not a function
    at Timepicker._generateHTMLHourCell (jquery.ui.timepicker.js?psw6eo:797)
    at Timepicker._generateHTML (jquery.ui.timepicker.js?psw6eo:622)
    at Timepicker._updateTimepicker (jquery.ui.timepicker.js?psw6eo:467)
    at Timepicker._setTimeFromField (jquery.ui.timepicker.js?psw6eo:1112)
    at Timepicker._attachTimepicker (jquery.ui.timepicker.js?psw6eo:190)
    at HTMLInputElement.<anonymous> (jquery.ui.timepicker.js?psw6eo:1474)
    at Function.each (jquery.min.js?v=1.7.2:2)
    at $.fn.init.each (jquery.min.js?v=1.7.2:2)
    at $.fn.init.$.fn.timepicker (jquery.ui.timepicker.js?psw6eo:1470)
    at Object.attach (date_popup_timepicker.timepicker.js?psw6eo:8)

Я пытался задать это при обмене стеками в Drupal, но был переведен в режим ожидания и сказал, что это вопрос программирования, поэтому я задаю его здесь.

1 Ответ

2 голосов
/ 21 июня 2019

jQuery UI Timepicker вызывает функции обратного вызова, такие как beforeShow, onSelect и т. Д., Используя метод apply(), например:

var beforeShow = $.timepicker._get(inst, 'beforeShow');
extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));

Таким образом, тип обратного вызова должен быть функцией- не строка.

Проблема в том, что модуль date_popup_timepicker не отображает строковые обратные вызовы (переданные с сервера) фактическим обратным вызовам функции js до инициализации таймера, поэтому один раз jquery.ui.timepicker.js код запускается, он выдает Uncaught TypeError: <callback>.apply is not a function.

На стороне клиента объект настроек datePopup (из Drupal.settings) потенциально содержит строковые обратные вызовы, поэтому любой из нихСтроки должны быть преобразованы в соответствующую функцию перед тем, как вызовет метод timepicker ().Чего не хватало, чтобы попасть туда:

var timepicker_callbacks = {
  beforeShow: null,
  onSelect: null,
  onClose: null,
  onHourShow: null,
  onMinuteShow: null
};

function timepicker_callbacks_assign (settings) {
  for (var setting in settings) {
    if (setting in timepicker_callbacks && typeof settings[setting] === 'string') {
      var namespace = window,
          ns_callback = settings[setting].split('.'),
          func = ns_callback.pop();
      for (var i = 0; i < ns_callback.length; i++) {
        namespace = namespace[ns_callback[i]];
      }
      settings[setting] = namespace[func];
    }
  }
}

Инициализация timepicker () происходит в Drupal.behaviors.DatePopupTimepicker, нам просто нужно сначала выполнить timepicker_callbacks_assign(), чтобы timepicker получил правильные настройки.

Я создал проблему и отправил патч на drupal.org, он все еще "нуждается в проверке", поэтому не стесняйтесь обращаться оттуда и просматривать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...