diff --git a/core/includes/ajax.inc b/core/includes/ajax.inc index 6d21c985ffe..45bb706e17e 100644 --- a/core/includes/ajax.inc +++ b/core/includes/ajax.inc @@ -376,8 +376,8 @@ function ajax_form_callback() { if (!empty($form_state['triggering_element'])) { $callback = $form_state['triggering_element']['#ajax']['callback']; } - if (!empty($callback) && function_exists($callback)) { - return $callback($form, $form_state); + if (!empty($callback) && is_callable($callback)) { + return call_user_func_array($callback, array(&$form, &$form_state)); } } diff --git a/core/modules/system/tests/modules/ajax_forms_test/ajax_forms_test.module b/core/modules/system/tests/modules/ajax_forms_test/ajax_forms_test.module index dfbd7f05096..96288f9132f 100644 --- a/core/modules/system/tests/modules/ajax_forms_test/ajax_forms_test.module +++ b/core/modules/system/tests/modules/ajax_forms_test/ajax_forms_test.module @@ -5,6 +5,8 @@ * Simpletest mock module for Ajax forms testing. */ +use Drupal\ajax_forms_test\Callbacks; + /** * Implements hook_menu(). */ @@ -41,6 +43,8 @@ function ajax_forms_test_menu() { * Tests form_state['values'] during callback. */ function ajax_forms_test_simple_form($form, &$form_state) { + $object = new Callbacks(); + $form = array(); $form['select'] = array( '#type' => 'select', @@ -49,7 +53,7 @@ function ajax_forms_test_simple_form($form, &$form_state) { 'green' => 'green', 'blue' => 'blue'), '#ajax' => array( - 'callback' => 'ajax_forms_test_simple_form_select_callback', + 'callback' => array($object, 'selectCallback'), ), '#suffix' => '
No color yet selected
', ); @@ -58,7 +62,7 @@ function ajax_forms_test_simple_form($form, &$form_state) { '#type' => 'checkbox', '#title' => t('Test checkbox'), '#ajax' => array( - 'callback' => 'ajax_forms_test_simple_form_checkbox_callback', + 'callback' => array($object, 'checkboxCallback'), ), '#suffix' => '
No action yet
', ); @@ -69,26 +73,6 @@ function ajax_forms_test_simple_form($form, &$form_state) { return $form; } -/** - * Ajax form callback: Selects color. - */ -function ajax_forms_test_simple_form_select_callback($form, $form_state) { - $commands = array(); - $commands[] = ajax_command_html('#ajax_selected_color', $form_state['values']['select']); - $commands[] = ajax_command_data('#ajax_selected_color', 'form_state_value_select', $form_state['values']['select']); - return array('#type' => 'ajax', '#commands' => $commands); -} - -/** - * Ajax form callback: Selects checkbox value. - */ -function ajax_forms_test_simple_form_checkbox_callback($form, $form_state) { - $commands = array(); - $commands[] = ajax_command_html('#ajax_checkbox_value', (int) $form_state['values']['checkbox']); - $commands[] = ajax_command_data('#ajax_checkbox_value', 'form_state_value_select', (int) $form_state['values']['checkbox']); - return array('#type' => 'ajax', '#commands' => $commands); -} - /** * Form constructor for the Ajax Command display form. */ diff --git a/core/modules/system/tests/modules/ajax_forms_test/lib/Drupal/ajax_forms_test/Callbacks.php b/core/modules/system/tests/modules/ajax_forms_test/lib/Drupal/ajax_forms_test/Callbacks.php new file mode 100644 index 00000000000..92b50b854c2 --- /dev/null +++ b/core/modules/system/tests/modules/ajax_forms_test/lib/Drupal/ajax_forms_test/Callbacks.php @@ -0,0 +1,34 @@ + 'ajax', '#commands' => $commands); + } + + /** + * Ajax callback triggered by checkbox. + */ + function checkboxCallback($form, $form_state) { + $commands = array(); + $commands[] = ajax_command_html('#ajax_checkbox_value', (int) $form_state['values']['checkbox']); + $commands[] = ajax_command_data('#ajax_checkbox_value', 'form_state_value_select', (int) $form_state['values']['checkbox']); + return array('#type' => 'ajax', '#commands' => $commands); + } +}