web-dev-qa-db-ja.com

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

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

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

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

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

これは可能ですか?

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

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

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

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

8
Rick

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

  • HTMLまたは

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

  • AJAXコマンドの配列

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

examples module のコードは、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回目に作成されたときにフィールドにデータが入力されています。

13
Rick

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

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

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

_function _callback($form, $form_state) {
  return $form;
}
_

これは、テストするhook_form_FORM_ID_alter()(またはある種のフォーム変更フック)で定義されているフォーム要素の_#ajax_配列(以下の例では_field_whatever_)から呼び出す必要があります。 _$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;
 }
_
0
cdmo

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

幸運を!

0
silkAdmin