Newer
Older
Angie Byron
committed
<?php
/**
* @file
* Simpletest mock module for Ajax forms testing.
Angie Byron
committed
*/
/**
* Implements hook_menu().
*/
function ajax_forms_test_menu() {
$items = array();
$items['ajax_forms_test_get_form'] = array(
'title' => 'AJAX forms simple form test',
'page callback' => 'drupal_get_form',
'page arguments' => array('ajax_forms_test_simple_form'),
'access callback' => TRUE,
);
$items['ajax_forms_test_ajax_commands_form'] = array(
'title' => 'AJAX forms AJAX commands test',
'page callback' => 'drupal_get_form',
'page arguments' => array('ajax_forms_test_ajax_commands_form'),
'access callback' => TRUE,
);
$items['ajax_validation_test'] = array(
'title' => 'AJAX Validation Test',
'page callback' => 'drupal_get_form',
'page arguments' => array('ajax_forms_test_validation_form'),
'access callback' => TRUE,
);
$items['ajax_forms_test_lazy_load_form'] = array(
'title' => 'AJAX forms lazy load test',
'page callback' => 'drupal_get_form',
'page arguments' => array('ajax_forms_test_lazy_load_form'),
'access callback' => TRUE,
);
Angie Byron
committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
return $items;
}
/**
* A basic form used to test form_state['values'] during callback.
*/
function ajax_forms_test_simple_form($form, &$form_state) {
$form = array();
$form['select'] = array(
'#type' => 'select',
'#options' => array(
'red' => 'red',
'green' => 'green',
'blue' => 'blue'),
'#ajax' => array(
'callback' => 'ajax_forms_test_simple_form_select_callback',
),
'#suffix' => '<div id="ajax_selected_color">No color yet selected</div>',
);
$form['checkbox'] = array(
'#type' => 'checkbox',
'#title' => t('Test checkbox'),
'#ajax' => array(
'callback' => 'ajax_forms_test_simple_form_checkbox_callback',
),
'#suffix' => '<div id="ajax_checkbox_value">No action yet</div>',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('submit'),
);
return $form;
}
/**
* Ajax callback triggered by select.
Angie Byron
committed
*/
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']);
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback triggered by checkbox.
Angie Byron
committed
*/
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']);
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Form to display the Ajax Commands.
Angie Byron
committed
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
*/
function ajax_forms_test_ajax_commands_form($form, &$form_state) {
$form = array();
// Shows the 'after' command with a callback generating commands.
$form['after_command_example'] = array(
'#value' => t("AJAX 'After': Click to put something after the div"),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_after_callback',
),
'#suffix' => '<div id="after_div">Something can be inserted after this</div>',
);
// Shows the 'alert' command.
$form['alert_command_example'] = array(
'#value' => t("AJAX 'Alert': Click to alert"),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_alert_callback',
),
);
// Shows the 'append' command.
$form['append_command_example'] = array(
'#value' => t("AJAX 'Append': Click to append something"),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_append_callback',
),
'#suffix' => '<div id="append_div">Append inside this div</div>',
);
// Shows the 'before' command.
$form['before_command_example'] = array(
'#value' => t("AJAX 'before': Click to put something before the div"),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_before_callback',
),
'#suffix' => '<div id="before_div">Insert something before this.</div>',
);
// Shows the 'changed' command without asterisk.
Angie Byron
committed
$form['changed_command_example'] = array(
'#value' => t("AJAX changed: Click to mark div changed."),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_changed_callback',
),
'#suffix' => '<div id="changed_div"> <div id="changed_div_mark_this">This div can be marked as changed or not.</div></div>',
);
// Shows the 'changed' command adding the asterisk.
$form['changed_command_asterisk_example'] = array(
'#value' => t("AJAX changed: Click to mark div changed with asterisk."),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_changed_asterisk_callback',
),
);
Angie Byron
committed
// Shows the Ajax 'css' command.
Angie Byron
committed
$form['css_command_example'] = array(
'#value' => t("Set the the '#box' div to be blue."),
'#type' => 'submit',
Angie Byron
committed
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_css_callback',
),
'#suffix' => '<div id="css_div" style="height: 50px; width: 50px; border: 1px solid black"> box</div>',
);
// Shows the Ajax 'data' command. But there is no use of this information,
Angie Byron
committed
// as this would require a javascript client to use the data.
$form['data_command_example'] = array(
'#value' => t("AJAX data command: Issue command."),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_data_callback',
),
'#suffix' => '<div id="data_div">Data attached to this div.</div>',
);
// Shows the Ajax 'invoke' command.
Angie Byron
committed
$form['invoke_command_example'] = array(
'#value' => t("AJAX invoke command: Invoke addClass() method."),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_invoke_callback',
),
'#suffix' => '<div id="invoke_div">Original contents</div>',
);
// Shows the Ajax 'html' command.
Angie Byron
committed
$form['html_command_example'] = array(
'#value' => t("AJAX html: Replace the HTML in a selector."),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_html_callback',
),
'#suffix' => '<div id="html_div">Original contents</div>',
);
// Shows the Ajax 'insert' command.
Dries Buytaert
committed
$form['insert_command_example'] = array(
'#value' => t("AJAX insert: Let client insert based on #ajax['method']."),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_insert_callback',
'method' => 'prepend',
),
'#suffix' => '<div id="insert_div">Original contents</div>',
);
// Shows the Ajax 'prepend' command.
Angie Byron
committed
$form['prepend_command_example'] = array(
'#value' => t("AJAX 'prepend': Click to prepend something"),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_prepend_callback',
),
'#suffix' => '<div id="prepend_div">Something will be prepended to this div. </div>',
);
// Shows the Ajax 'remove' command.
Angie Byron
committed
$form['remove_command_example'] = array(
'#value' => t("AJAX 'remove': Click to remove text"),
'#type' => 'submit',
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_remove_callback',
),
'#suffix' => '<div id="remove_div"><div id="remove_text">text to be removed</div></div>',
);
// Shows the Ajax 'restripe' command.
Angie Byron
committed
$form['restripe_command_example'] = array(
'#type' => 'submit',
'#value' => t("AJAX 'restripe' command"),
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_restripe_callback',
),
'#suffix' => '<div id="restripe_div">
<table id="restripe_table" style="border: 1px solid black" >
<tr id="table-first"><td>first row</td></tr>
<tr ><td>second row</td></tr>
</table>
</div>',
Dries Buytaert
committed
);
Angie Byron
committed
// Demonstrates the Ajax 'settings' command. The 'settings' command has
Dries Buytaert
committed
// nothing visual to "show", but it can be tested via SimpleTest and via
// Firebug.
$form['settings_command_example'] = array(
'#type' => 'submit',
'#value' => t("AJAX 'settings' command"),
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_settings_callback',
),
Angie Byron
committed
);
// Shows the Ajax 'add_css' command.
$form['add_css_command_example'] = array(
'#type' => 'submit',
'#value' => t("AJAX 'add_css' command"),
'#ajax' => array(
'callback' => 'ajax_forms_test_advanced_commands_add_css_callback',
),
);
Angie Byron
committed
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
/**
* Ajax callback for 'after'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_after_callback($form, $form_state) {
$selector = '#after_div';
$commands = array();
$commands[] = ajax_command_after($selector, "This will be placed after");
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'alert'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_alert_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_alert("Alert");
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'append'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_append_callback($form, $form_state) {
$selector = '#append_div';
$commands = array();
$commands[] = ajax_command_append($selector, "Appended text");
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'before'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_before_callback($form, $form_state) {
$selector = '#before_div';
$commands = array();
$commands[] = ajax_command_before($selector, "Before text");
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'changed'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_changed_callback($form, $form_state) {
$commands[] = ajax_command_changed('#changed_div');
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
}
/**
* Ajax callback for 'changed' with asterisk marking inner div.
*/
function ajax_forms_test_advanced_commands_changed_asterisk_callback($form, $form_state) {
Angie Byron
committed
$commands = array();
$commands[] = ajax_command_changed('#changed_div', '#changed_div_mark_this');
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'css'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_css_callback($form, $form_state) {
$selector = '#css_div';
$color = 'blue';
Angie Byron
committed
$commands = array();
$commands[] = ajax_command_css($selector, array('background-color' => $color));
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'data'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_data_callback($form, $form_state) {
$selector = '#data_div';
$commands = array();
$commands[] = ajax_command_data($selector, 'testkey', 'testvalue');
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
Angie Byron
committed
/**
* Ajax callback for 'invoke'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_invoke_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_invoke('#invoke_div', 'addClass', array('error'));
return array('#type' => 'ajax', '#commands' => $commands);
}
Angie Byron
committed
/**
* Ajax callback for 'html'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_html_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_html('#html_div', 'replacement text');
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
Dries Buytaert
committed
/**
* Ajax callback for 'insert'.
Dries Buytaert
committed
*/
function ajax_forms_test_advanced_commands_insert_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_insert('#insert_div', 'insert replacement text');
return array('#type' => 'ajax', '#commands' => $commands);
}
Angie Byron
committed
/**
* Ajax callback for 'prepend'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_prepend_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_prepend('#prepend_div', "prepended text");
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'remove'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_remove_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_remove('#remove_text');
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
/**
* Ajax callback for 'restripe'.
Angie Byron
committed
*/
function ajax_forms_test_advanced_commands_restripe_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_restripe('#restripe_table');
Dries Buytaert
committed
return array('#type' => 'ajax', '#commands' => $commands);
Angie Byron
committed
}
Dries Buytaert
committed
/**
* Ajax callback for 'settings'.
Dries Buytaert
committed
*/
function ajax_forms_test_advanced_commands_settings_callback($form, $form_state) {
$commands = array();
$setting['ajax_forms_test']['foo'] = 42;
$commands[] = ajax_command_settings($setting);
return array('#type' => 'ajax', '#commands' => $commands);
}
/**
* Ajax callback for 'add_css'.
*/
function ajax_forms_test_advanced_commands_add_css_callback($form, $form_state) {
$commands = array();
$commands[] = ajax_command_add_css('my/file.css');
return array('#type' => 'ajax', '#commands' => $commands);
}
/**
* This form and its related submit and callback functions demonstrate
* not validating another form element when a single Ajax element is triggered.
*
* The "drivertext" element is an Ajax-enabled textfield, free-form.
* The "required_field" element is a textfield marked required.
*
* The correct behavior is that the Ajax-enabled drivertext element should
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
* be able to trigger without causing validation of the "required_field".
*/
function ajax_forms_test_validation_form($form, &$form_state) {
$form['drivertext'] = array(
'#title' => t('AJAX-enabled textfield.'),
'#description' => t("When this one AJAX-triggers and the spare required field is empty, you should not get an error."),
'#type' => 'textfield',
'#default_value' => !empty($form_state['values']['drivertext']) ? $form_state['values']['drivertext'] : "",
'#ajax' => array(
'callback' => 'ajax_forms_test_validation_form_callback',
'wrapper' => 'message_area',
'method' => 'replace',
),
'#suffix' => '<div id="message_area"></div>',
);
$form['spare_required_field'] = array(
'#title' => t("Spare Required Field"),
'#type' => 'textfield',
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
);
return $form;
}
/**
* Submit handler for the validation form.
*/
function ajax_forms_test_validation_form_submit($form, $form_state) {
drupal_set_message(t("Validation form submitted"));
}
/**
* Ajax callback for the 'drivertext' element of the validation form.
*/
function ajax_forms_test_validation_form_callback($form, $form_state) {
drupal_set_message("ajax_forms_test_validation_form_callback invoked");
drupal_set_message(t("Callback: drivertext=%drivertext, spare_required_field=%spare_required_field", array('%drivertext' => $form_state['values']['drivertext'], '%spare_required_field' => $form_state['values']['spare_required_field'])));
return '<div id="message_area">ajax_forms_test_validation_form_callback at ' . date('c') . '</div>';
}
/**
* Form builder: Builds a form that triggers a simple AJAX callback.
*/
function ajax_forms_test_lazy_load_form($form, &$form_state) {
$form['add_files'] = array(
'#type' => 'checkbox',
'#default_value' => FALSE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Submit'),
'#ajax' => array(
'callback' => 'ajax_forms_test_lazy_load_form_ajax',
),
);
return $form;
}
/**
* Form submit handler: Adds JavaScript and CSS that wasn't on the original form.
*/
function ajax_forms_test_lazy_load_form_submit($form, &$form_state) {
if ($form_state['values']['add_files']) {
drupal_add_js(array('ajax_forms_test_lazy_load_form_submit' => 'executed'), 'setting');
drupal_add_css(drupal_get_path('module', 'system') . '/system.admin.css');
drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
}
$form_state['rebuild'] = TRUE;
}
/**
* AJAX callback for the ajax_forms_test_lazy_load_form() form.
*
* This function returns nothing, because all we're interested in testing is
* ajax_render() adding commands for JavaScript and CSS added during the page
* request, such as the ones added in ajax_forms_test_lazy_load_form_submit().
*/
function ajax_forms_test_lazy_load_form_ajax($form, &$form_state) {
return NULL;
}