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, он все еще "нуждается в проверке", поэтому не стесняйтесь обращаться оттуда и просматривать его.