5

I have a form updating with AJAX on select element change. Easy so far. The problem is that I need to return the form & also an ajax command at the same time.

If I need the form, I just return the $form array and if I need to return an ajax command I use return array('#type' => 'ajax', '#commands' => $commands);. Both works just fine.

The problem is that I don't get it how to combine both of them in the same return object.

Any ideas how can I do that?

2
  • Check "Ajax Comments" contributed module you will get all the information there. Commented Jun 8, 2012 at 10:32
  • it's not what I need. in ajax comments they return the whole rendered form. I need to return just part of an existing form... Commented Jun 8, 2012 at 10:44

3 Answers 3

2

As a backup solution, I'll do it this way:

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

this should work.

2
  • 1
    did you find a better solution eventually?
    – Bulat
    Commented Apr 9, 2013 at 20:48
  • Why wouldn't you just use $form['#attached']['js'][] = drupal_get_path('module', 'my_module') . '/js/functionality.js'; return $form;?
    – mbomb007
    Commented Apr 26, 2019 at 15:55
1

You have to pass to drupal_render() the form array, then add it to your $commands as an AJAX command. You should use code similar to the following one.

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);
}
2
  • I need to return just part of the form, not the whole rebuild, rendered form. Commented Jun 8, 2012 at 11:05
  • Then render the form element and pass it as an ajax command. Same principle I guess.
    – Beebee
    Commented Jun 8, 2012 at 11:11
1

I would use hook_ajax_render_alter(&$commands) e.g.

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

See the documentation for details.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.