ajaxを使用して、1つの入力から複数のフォーム要素をターゲットにできますか?


8

私はajaxを使用して、1つのフォーム入力ブラーからdrupalフォームの2つの異なる部分を更新しようとしています。

私の入力には標準のajax要素があります。

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

これはうまく機能していて、入力が更新されたときにdivをスワップアウトします... しかし、元の入力がぼやけた結果として、別のフォーム入力をフォーム内の別のコードで更新したいと思います。

これは可能ですか?

編集:わかりやすくするために、ここに私の実際の例を示します。

  • コンテンツタイプ「映画」
  • 「primary_title」フィールドを追加しました
  • 'primary_title'が更新されると、私のajaxコールバックは同様の文字列をチェックし、htmlを返します。
  • コールバックからのhtmlは空のdivに挿入されます。

    その部分はうまくいきます!

標準ノードの「title」入力も変更しようとしています。文字列を整理するための正規表現をいくつか実行した後、「primary_title」の値を指定します(最初から「The」または「A」を削除します)結果2つのタイトルフィールドがあり、1つは完全なタイトル 'primary_title'で、もう1つはレコードの並べ替えと表示に役立つ1つのトリミングされた 'title'です。


回答:


13

ajaxコマンドを使用してフォームのさまざまな部分をターゲットにできるようですが、次のいずれか1つだけを返すように選択する必要があります。

  • HTMLまたは

  • レンダリング可能な配列または

  • AJAXコマンドの配列

私が最初に書いた状況では、AJAXコマンドの配列レンダリング可能な配列の両方を返そうとしていましたが、これは可能ではないようです。

サンプルモジュールのコードは、AJAXコマンドの配列を使用してフォームのさまざまな部分をターゲットにする方法を示しています。

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

このコードサンプルでは、​​#html_divが$ textを取得し、個別に#html_statusが "Updated html_command_example with text = $ text;"を取得しています。date( 'r')。「」

1つのajaxコールバックからの2つの異なる情報を持つフォーム上の2つの異なる場所!

自分が取り組んでいることをもう一度見ると、ノードのタイトルフィールドを返す必要がないことに気付きました。リスト内のデータの並べ替えに使用されるユーティリティフィールドのみになります。

ノードフォームのフィールドを非表示にして、元のajaxコールバックがトリガーされたときにフォームが2回目に作成されたときにフィールドにデータが入力されています。


0

私はDrupalにかなり慣れていませんが、これまでのところ、Ajaxフレームワークは柔軟性に欠けています。意図したとおりに使用する限り、うまく機能します。したがって、あなたのインスタンスでは、JSを知っている場合、そのスクリプトを自分自身にすることは間違いなく非常に軽いはずです。

幸運を!


提案をありがとう:)ノードのタイトルフィールドは、リストを整理するためのユーティリティフィールドとして単に使用されているだけなので、ノードのタイトルフィールドを返す必要がないことに気付きました。既存のajaxコールバックの結果としてフォームが再構築されると、データが入力されます。
リック

0

drupal.orgからの別のオプション:

それが最も簡単であれば、フォーム全体を簡単に置き換えることができます。#prefixと#suffixをフォーム配列全体に追加し、それを#ajax ['wrapper']として設定するだけです。(これにより、1つのajax呼び出しで複数のフォーム要素を変更できます。)これを行わない唯一の理由は、転送される情報が少ないほどプロセスが高速になることです。

コールバック関数は次のように簡単な場合があります。

function _callback($form, $form_state) {
  return $form;
}

これは、以下のように、配列のテストと変更を行う(または何らかのフォーム変更フック)で定義さ#ajaxれたフォーム要素(field_whatever以下の例の場合)の配列から呼び出す必要がhook_form_FORM_ID_alter()あります。$form_state$form

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.