什么是在处理时停止Drupal textfield ahah事件从禁用字段的最佳方法?

时间:2012-04-30 11:12:43

标签: php drupal drupal-6 drupal-forms

我在自定义模块中有一个简单的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',
        ),
    ),
);

提前感谢您的帮助。

2 个答案:

答案 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">&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;
});

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

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

如果通过设置,例如“禁用”=&gt;,则仅停止禁用输入可能更好。是的,但上面的一个自定义模块的一个页面中的一个案例我需要这个修复。

答案 1 :(得分:-1)

您可以将文本字段的#required属性设置为TRUE以使其成为必填字段。请将#disabled属性设置为FALSE以检查是否由于此而发生。请记住#ahah事件将调用验证函数当它被处理。