AJAXで要素を変更すると、フォームが更新されます。これまでのところ簡単です。問題は、フォームとajaxコマンドを同時に返す必要があることです。
フォームが必要な場合は、_$form
_配列を返すだけで、ajaxコマンドを返す必要がある場合は、return array('#type' => 'ajax', '#commands' => $commands);
を使用します。どちらも問題なく動作します。
問題は、同じ戻りオブジェクトで両方を組み合わせる方法が得られないことです。
どのようにすればそれを行うことができますか?
バックアップソリューションとして、次のようにします。
$form['#suffix'] = '<script type="text/javascript">some_function_to_do_what_i_need();</script>';
return $form;
これはうまくいくはずです。
私はhook_ajax_render_alter(&$commands)
を使用します。
function myModule_ajax_render_alter(&$commands) {
$commands[] = myModule_custom_command('hi');
}
詳細は documentation を参照してください。
フォーム配列をdrupal_render()
に渡してから、$commands
にAJAXコマンドとして追加する必要があります。次のようなコードを使用する必要があります。
function my_ajax_form_callback($form, &$form_state) {
$new_state = array();
$new_state['build_info'] = $form_state['build_info'];
$new_state['rebuild'] = TRUE;
$new_state['values'] = array();
$new_state += form_state_defaults();
$new_form_array = drupal_rebuild_form('my_ajax_form_id', $new_state);
$new_form = drupal_render($new_form_array);
$commands = array();
$commands[] = ajax_command_html('#form-container-element-id', $new_form);
return array('#type' => 'ajax', '#commands' => $commands);
}