Ajaxを使用して、1つのフォーム入力ブラーからdrupalフォームの2つの異なる部分を更新しようとしています。
私の入力には標準のajax要素があります。
$my_form['my_input']['#ajax'] = array(
'callback' => 'my_callback',
'wrapper' => 'my_target_div',
'event' => 'blur',
);
これはうまく機能していて、入力が更新されたときにdivをスワップアウトします... howeverまた、元の入力のぼかしの結果として、別のフォーム入力をフォーム内の別のコードで更新したい。
これは可能ですか?
編集:わかりやすくするために、ここに私の実際の例を示します。
コールバックからのhtmlは空のdivに挿入されます。
その部分はうまくいきます!
標準ノードの「title」入力も変更しようとしています。文字列を整理するための正規表現をいくつか実行した後、「primary_title」の値を入力します(最初から「The」または「A」を削除します)結果2つのタイトルフィールドがあり、1つは完全なタイトル 'primary_title'で、もう1つはレコードの並べ替えと表示に役立つ1つのトリミングされた 'title'です。
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回目に作成されたときにフィールドにデータが入力されています。
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;
}
_
私はDrupalに非常に慣れていますが、これまでのところ、Ajaxフレームワークは柔軟性に欠けていることに気づきました。意図したとおりに使用する限り、Ajaxフレームワークはうまく機能します。間違いなく、そのスクリプトを自分自身にすることは非常に軽いはずです。
幸運を!