web-dev-qa-db-ja.com

Drupal AJAXフォームとコマンド

AJAXで要素を変更すると、フォームが更新されます。これまでのところ簡単です。問題は、フォームとajaxコマンドを同時に返す必要があることです。

フォームが必要な場合は、_$form_配列を返すだけで、ajaxコマンドを返す必要がある場合は、return array('#type' => 'ajax', '#commands' => $commands);を使用します。どちらも問題なく動作します。

問題は、同じ戻りオブジェクトで両方を組み合わせる方法が得られないことです。

どのようにすればそれを行うことができますか?

5
Marius Ilie

バックアップソリューションとして、次のようにします。

$form['#suffix'] = '<script type="text/javascript">some_function_to_do_what_i_need();</script>';
return $form;

これはうまくいくはずです。

2
Marius Ilie

私はhook_ajax_render_alter(&$commands)を使用します。

function myModule_ajax_render_alter(&$commands) {
  $commands[] = myModule_custom_command('hi');
}

詳細は documentation を参照してください。

1
jessebeach

フォーム配列を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);
}
1
Beebee