我在自定义模块中有一个简单的Drupal表单,其中退出textfield
应通过ahah
检索有关输入文本的一些信息,以填充div
。
这样可以正常工作,除非用户在处理文本字段的ahah事件时快速提交表单。
看起来正在处理ahah事件时,文本字段被禁用,这当然意味着它的值不会被提交。这意味着验证失败,因为textfield是必填字段,因此用户将返回到具有适当错误的表单。发生这种情况时,文本字段始终为空。
如果用户等待事件结束,则文本字段返回启用并按预期提交工作,就像在文本字段中使用回车键提交一样(事件不会触发,因此文本字段不是在检索数据时禁用。
有没有办法在正在处理ahah事件或某些其他解决方法时禁用文本字段的禁用?
文本字段示例:
$form['id'] = array(
'#type' => 'textfield',
'#title' => t('Crop No.'),
'#default_value' => $crop['id'] ? $crop['id'] : '',
'#size' => 6,
'#disabled' => $disabled,
'#ahah' => array(
'path' => 'spcs-myspuds/yields/js/crop/description/' . $crop_idx,
'wrapper' => 'spcs-myspuds-yields-edit-crop-description-row-' . $crop_idx,
'effect' => 'fade',
'progress' => array(
'type' => 'none',
),
),
);
提前感谢您的帮助。
答案 0 :(得分:0)
我找到了解决方法。
我必须覆盖Drupal.ahah.prototype.beforeSubmit
,这是在提交之前禁用输入的函数(好吧,呃!)。
我在我的模块中包含了以下JavaScript(使用drupal_add_js
):
$(document).ready(function() {
if (typeof beforeSubmitOverride == 'undefined' || beforeSubmitOverride == false) {
Drupal.ahah.prototype.beforeSubmit = function (form_values, element, options) {
// Disable the element that received the change.
// IMiJ: Unless it's a text input, otherwise we could submit while element is diabled and loose data.
if ($(this.element).attr('type') != 'text') {
$(this.element).addClass('progress-disabled').attr('disabled', true);
}
// Insert progressbar or throbber.
if (this.progress.type == 'bar') {
var progressBar = new Drupal.progressBar('ahah-progress-' + this.element.id, eval(this.progress.update_callback), this.progress.method, eval(this.progress.error_callback));
if (this.progress.message) {
progressBar.setProgress(-1, this.progress.message);
}
if (this.progress.url) {
progressBar.startMonitoring(this.progress.url, this.progress.interval || 1500);
}
this.progress.element = $(progressBar.element).addClass('ahah-progress ahah-progress-bar');
this.progress.object = progressBar;
$(this.element).after(this.progress.element);
}
else if (this.progress.type == 'throbber') {
this.progress.element = $('<div class="ahah-progress ahah-progress-throbber"><div class="throbber"> </div></div>');
if (this.progress.message) {
$('.throbber', this.progress.element).after('<div class="message">' + this.progress.message + '</div>');
}
$(this.element).after(this.progress.element);
}
};
};
beforeSubmitOverride = true;
});
这是misc / ahah.js中定义的Drupal.ahah.prototype.beforeSubmit
的副本,只有一个小的更改,用if语句包含输入的禁用,以确保我们不禁用文本字段。
这包含在几行中,以确保在DOM准备好后只重新定义一次原型。
如果通过设置,例如“禁用”=&gt;,则仅停止禁用输入可能更好。是的,但上面的一个自定义模块的一个页面中的一个案例我需要这个修复。
答案 1 :(得分:-1)
您可以将文本字段的#required属性设置为TRUE以使其成为必填字段。请将#disabled属性设置为FALSE以检查是否由于此而发生。请记住#ahah事件将调用验证函数当它被处理。