【问题标题】:What is the best way to stop Drupal textfield ahah event from disabling field while processing?在处理时阻止 Drupal 文本字段 ahah 事件禁用字段的最佳方法是什么?
【发布时间】:2012-04-30 11:12:42
【问题描述】:

我在自定义模块中有一个简单的 Drupal 表单,其中退出 textfield 应该通过 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',
        ),
    ),
);

提前感谢您的帮助。

【问题讨论】:

    标签: php drupal drupal-6 drupal-forms


    【解决方案1】:

    我找到了解决方法。

    我必须重写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 准备好后重新定义原型。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢 Naveen 的回答,但在这种情况下,对 #required 和 #disabled 参数的引用是无关紧要的(无论如何,#disabled 在测试场景中都是错误的,否则无法输入触发的数据啊哈事件)。问题是 ahah 在处理时禁用输入的问题,并且 ahah 事件不进行任何验证或触发任何验证钩子。
      猜你喜欢
      • 2016-06-27
      • 2011-12-14
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多