我如何在 date_popup 控件中使用 Drupal Form API 的 onHourShow 回调
How do i use onHourShow callback in a date_popup control with the Drupal Form API
我有一个只有一个 date_popup 字段的 drupal 表单。我希望它只提供小时数 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 堆栈交换中询问这个问题,但被告知 "On Hold" 并被告知这是一个编程问题,所以我在这里提问。
jQuery UI Timepicker使用方法apply()
调用'beforeShow'、'onSelect'等回调函数,例如:
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 上创建了一个 issue and submitted a patch,它仍然 "Needs Review" 所以不要犹豫,从那里申请并审查它。
我有一个只有一个 date_popup 字段的 drupal 表单。我希望它只提供小时数 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 堆栈交换中询问这个问题,但被告知 "On Hold" 并被告知这是一个编程问题,所以我在这里提问。
jQuery UI Timepicker使用方法apply()
调用'beforeShow'、'onSelect'等回调函数,例如:
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 上创建了一个 issue and submitted a patch,它仍然 "Needs Review" 所以不要犹豫,从那里申请并审查它。