0

我在自定义模块中有一个简单的 Drupal 表单,其中退出 atextfield应该检索有关输入文本的一些信息,ahah以填充div.

这很好用,除非用户在处理文本字段的 ahah 事件时快速提交表单。

看起来在处理 ahah 事件时,文本字段被禁用,这当然意味着它的值未提交。这意味着验证失败,因为文本字段是必填字段,因此用户将返回到表单并显示适当的错误。发生这种情况时,文本字段始终为空。

如果用户等待事件完成,则文本字段返回启用状态并按预期提交,在文本字段中使用回车键提交也是如此(事件不会触发,因此文本字段不会被禁用当它检索数据时)。

有没有办法在处理 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',
        ),
    ),
);

提前感谢您的帮助。

4

2 回答 2

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">&nbsp;</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;
});

这是Drupal.ahah.prototype.beforeSubmitmisc/ahah.js 中定义的副本,有一个小的更改,使用 if 语句包装禁用输入以确保我们不会禁用文本字段。

这包含在几行代码中,以确保在 DOM 准备好后重新定义原型。

如果传递了诸如“禁用”=> false之类的设置,最好只停止禁用输入,但上述方法适用于我需要此修复的一个自定义模块的一页中的一种情况。

于 2012-05-03T14:36:32.173 回答
-1

您可以将文本字段的#required 属性设置为TRUE,使其成为必填字段。请将#disabled 属性设置为FALSE,以检查是否因此而未发生。请记住,#ahah 事件在发生时会调用验证函数正在处理。

于 2012-05-01T04:31:39.607 回答