0

カスタム モジュールに単純な Drupal フォームがあり、 を終了するtextfieldと、入力されたテキストに関する情報を取得しahahdiv.

テキストフィールドのahahイベントが処理されている間にユーザーがフォームをすばやく送信した場合を除いて、これは正常に機能します。

ahah イベントが処理されている間、テキストフィールドが無効になっているように見えます。これはもちろん、値が送信されていないことを意味します。これは、テキストフィールドが必須フィールドであるため検証が失敗することを意味し、ユーザーは適切なエラーでフォームに戻されます。この場合、テキストフィールドは常に空です。

ユーザーがイベントが終了するのを待つと、テキストフィールドは有効に戻り、送信は期待どおりに機能します。テキストフィールドで Enter キーを使用して送信する場合と同様です (イベントは発生しないため、テキストフィールドは無効になりません)。データを取得している間)。

あははイベントが処理されている間にテキストフィールドの無効化を無効にする方法、またはその他の回避策はありますか?

テキストフィールドの例:

$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 の準備ができた後にプロトタイプの再定義が 1 回だけ行われるように、数行にまとめられています。

"disable" => false などの設定が渡された場合にのみ、入力の無効化を停止する方が良いかもしれませんが、上記は、この修正が必要な 1 つのカスタム モジュールの 1 つのページの 1 つのケースで機能しました。

于 2012-05-03T14:36:32.173 に答える
-1

テキストフィールドの #required プロパティを TRUE に設定すると、必須フィールドにすることができます。これにより発生していないかどうかを確認するには、#disabled プロパティを FALSE に設定してください。処理中です。

于 2012-05-01T04:31:39.607 に答える