ajax_forms_test.module 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. <?php
  2. /**
  3. * @file
  4. * Simpletest mock module for Ajax forms testing.
  5. */
  6. /**
  7. * Implements hook_menu().
  8. * @return unknown_type
  9. */
  10. function ajax_forms_test_menu() {
  11. $items = array();
  12. $items['ajax_forms_test_get_form'] = array(
  13. 'title' => 'AJAX forms simple form test',
  14. 'page callback' => 'drupal_get_form',
  15. 'page arguments' => array('ajax_forms_test_simple_form'),
  16. 'access callback' => TRUE,
  17. );
  18. $items['ajax_forms_test_ajax_commands_form'] = array(
  19. 'title' => 'AJAX forms AJAX commands test',
  20. 'page callback' => 'drupal_get_form',
  21. 'page arguments' => array('ajax_forms_test_ajax_commands_form'),
  22. 'access callback' => TRUE,
  23. );
  24. $items['ajax_validation_test'] = array(
  25. 'title' => 'AJAX Validation Test',
  26. 'page callback' => 'drupal_get_form',
  27. 'page arguments' => array('ajax_forms_test_validation_form'),
  28. 'access callback' => TRUE,
  29. );
  30. $items['ajax_forms_test_lazy_load_form'] = array(
  31. 'title' => 'AJAX forms lazy load test',
  32. 'page callback' => 'drupal_get_form',
  33. 'page arguments' => array('ajax_forms_test_lazy_load_form'),
  34. 'access callback' => TRUE,
  35. );
  36. return $items;
  37. }
  38. /**
  39. * A basic form used to test form_state['values'] during callback.
  40. */
  41. function ajax_forms_test_simple_form($form, &$form_state) {
  42. $form = array();
  43. $form['select'] = array(
  44. '#type' => 'select',
  45. '#options' => array(
  46. 'red' => 'red',
  47. 'green' => 'green',
  48. 'blue' => 'blue'),
  49. '#ajax' => array(
  50. 'callback' => 'ajax_forms_test_simple_form_select_callback',
  51. ),
  52. '#suffix' => '<div id="ajax_selected_color">No color yet selected</div>',
  53. );
  54. $form['checkbox'] = array(
  55. '#type' => 'checkbox',
  56. '#title' => t('Test checkbox'),
  57. '#ajax' => array(
  58. 'callback' => 'ajax_forms_test_simple_form_checkbox_callback',
  59. ),
  60. '#suffix' => '<div id="ajax_checkbox_value">No action yet</div>',
  61. );
  62. $form['submit'] = array(
  63. '#type' => 'submit',
  64. '#value' => t('submit'),
  65. );
  66. return $form;
  67. }
  68. /**
  69. * Ajax callback triggered by select.
  70. */
  71. function ajax_forms_test_simple_form_select_callback($form, $form_state) {
  72. $commands = array();
  73. $commands[] = ajax_command_html('#ajax_selected_color', $form_state['values']['select']);
  74. $commands[] = ajax_command_data('#ajax_selected_color', 'form_state_value_select', $form_state['values']['select']);
  75. return array('#type' => 'ajax', '#commands' => $commands);
  76. }
  77. /**
  78. * Ajax callback triggered by checkbox.
  79. */
  80. function ajax_forms_test_simple_form_checkbox_callback($form, $form_state) {
  81. $commands = array();
  82. $commands[] = ajax_command_html('#ajax_checkbox_value', (int) $form_state['values']['checkbox']);
  83. $commands[] = ajax_command_data('#ajax_checkbox_value', 'form_state_value_select', (int) $form_state['values']['checkbox']);
  84. return array('#type' => 'ajax', '#commands' => $commands);
  85. }
  86. /**
  87. * Form to display the Ajax Commands.
  88. * @param $form
  89. * @param $form_state
  90. * @return unknown_type
  91. */
  92. function ajax_forms_test_ajax_commands_form($form, &$form_state) {
  93. $form = array();
  94. // Shows the 'after' command with a callback generating commands.
  95. $form['after_command_example'] = array(
  96. '#value' => t("AJAX 'After': Click to put something after the div"),
  97. '#type' => 'submit',
  98. '#ajax' => array(
  99. 'callback' => 'ajax_forms_test_advanced_commands_after_callback',
  100. ),
  101. '#suffix' => '<div id="after_div">Something can be inserted after this</div>',
  102. );
  103. // Shows the 'alert' command.
  104. $form['alert_command_example'] = array(
  105. '#value' => t("AJAX 'Alert': Click to alert"),
  106. '#type' => 'submit',
  107. '#ajax' => array(
  108. 'callback' => 'ajax_forms_test_advanced_commands_alert_callback',
  109. ),
  110. );
  111. // Shows the 'append' command.
  112. $form['append_command_example'] = array(
  113. '#value' => t("AJAX 'Append': Click to append something"),
  114. '#type' => 'submit',
  115. '#ajax' => array(
  116. 'callback' => 'ajax_forms_test_advanced_commands_append_callback',
  117. ),
  118. '#suffix' => '<div id="append_div">Append inside this div</div>',
  119. );
  120. // Shows the 'before' command.
  121. $form['before_command_example'] = array(
  122. '#value' => t("AJAX 'before': Click to put something before the div"),
  123. '#type' => 'submit',
  124. '#ajax' => array(
  125. 'callback' => 'ajax_forms_test_advanced_commands_before_callback',
  126. ),
  127. '#suffix' => '<div id="before_div">Insert something before this.</div>',
  128. );
  129. // Shows the 'changed' command without asterisk.
  130. $form['changed_command_example'] = array(
  131. '#value' => t("AJAX changed: Click to mark div changed."),
  132. '#type' => 'submit',
  133. '#ajax' => array(
  134. 'callback' => 'ajax_forms_test_advanced_commands_changed_callback',
  135. ),
  136. '#suffix' => '<div id="changed_div"> <div id="changed_div_mark_this">This div can be marked as changed or not.</div></div>',
  137. );
  138. // Shows the 'changed' command adding the asterisk.
  139. $form['changed_command_asterisk_example'] = array(
  140. '#value' => t("AJAX changed: Click to mark div changed with asterisk."),
  141. '#type' => 'submit',
  142. '#ajax' => array(
  143. 'callback' => 'ajax_forms_test_advanced_commands_changed_asterisk_callback',
  144. ),
  145. );
  146. // Shows the Ajax 'css' command.
  147. $form['css_command_example'] = array(
  148. '#value' => t("Set the the '#box' div to be blue."),
  149. '#type' => 'submit',
  150. '#ajax' => array(
  151. 'callback' => 'ajax_forms_test_advanced_commands_css_callback',
  152. ),
  153. '#suffix' => '<div id="css_div" style="height: 50px; width: 50px; border: 1px solid black"> box</div>',
  154. );
  155. // Shows the Ajax 'data' command. But there is no use of this information,
  156. // as this would require a javascript client to use the data.
  157. $form['data_command_example'] = array(
  158. '#value' => t("AJAX data command: Issue command."),
  159. '#type' => 'submit',
  160. '#ajax' => array(
  161. 'callback' => 'ajax_forms_test_advanced_commands_data_callback',
  162. ),
  163. '#suffix' => '<div id="data_div">Data attached to this div.</div>',
  164. );
  165. // Shows the Ajax 'invoke' command.
  166. $form['invoke_command_example'] = array(
  167. '#value' => t("AJAX invoke command: Invoke addClass() method."),
  168. '#type' => 'submit',
  169. '#ajax' => array(
  170. 'callback' => 'ajax_forms_test_advanced_commands_invoke_callback',
  171. ),
  172. '#suffix' => '<div id="invoke_div">Original contents</div>',
  173. );
  174. // Shows the Ajax 'html' command.
  175. $form['html_command_example'] = array(
  176. '#value' => t("AJAX html: Replace the HTML in a selector."),
  177. '#type' => 'submit',
  178. '#ajax' => array(
  179. 'callback' => 'ajax_forms_test_advanced_commands_html_callback',
  180. ),
  181. '#suffix' => '<div id="html_div">Original contents</div>',
  182. );
  183. // Shows the Ajax 'insert' command.
  184. $form['insert_command_example'] = array(
  185. '#value' => t("AJAX insert: Let client insert based on #ajax['method']."),
  186. '#type' => 'submit',
  187. '#ajax' => array(
  188. 'callback' => 'ajax_forms_test_advanced_commands_insert_callback',
  189. 'method' => 'prepend',
  190. ),
  191. '#suffix' => '<div id="insert_div">Original contents</div>',
  192. );
  193. // Shows the Ajax 'prepend' command.
  194. $form['prepend_command_example'] = array(
  195. '#value' => t("AJAX 'prepend': Click to prepend something"),
  196. '#type' => 'submit',
  197. '#ajax' => array(
  198. 'callback' => 'ajax_forms_test_advanced_commands_prepend_callback',
  199. ),
  200. '#suffix' => '<div id="prepend_div">Something will be prepended to this div. </div>',
  201. );
  202. // Shows the Ajax 'remove' command.
  203. $form['remove_command_example'] = array(
  204. '#value' => t("AJAX 'remove': Click to remove text"),
  205. '#type' => 'submit',
  206. '#ajax' => array(
  207. 'callback' => 'ajax_forms_test_advanced_commands_remove_callback',
  208. ),
  209. '#suffix' => '<div id="remove_div"><div id="remove_text">text to be removed</div></div>',
  210. );
  211. // Shows the Ajax 'restripe' command.
  212. $form['restripe_command_example'] = array(
  213. '#type' => 'submit',
  214. '#value' => t("AJAX 'restripe' command"),
  215. '#ajax' => array(
  216. 'callback' => 'ajax_forms_test_advanced_commands_restripe_callback',
  217. ),
  218. '#suffix' => '<div id="restripe_div">
  219. <table id="restripe_table" style="border: 1px solid black" >
  220. <tr id="table-first"><td>first row</td></tr>
  221. <tr ><td>second row</td></tr>
  222. </table>
  223. </div>',
  224. );
  225. // Demonstrates the Ajax 'settings' command. The 'settings' command has
  226. // nothing visual to "show", but it can be tested via SimpleTest and via
  227. // Firebug.
  228. $form['settings_command_example'] = array(
  229. '#type' => 'submit',
  230. '#value' => t("AJAX 'settings' command"),
  231. '#ajax' => array(
  232. 'callback' => 'ajax_forms_test_advanced_commands_settings_callback',
  233. ),
  234. );
  235. $form['submit'] = array(
  236. '#type' => 'submit',
  237. '#value' => t('Submit'),
  238. );
  239. return $form;
  240. }
  241. /**
  242. * Ajax callback for 'after'.
  243. */
  244. function ajax_forms_test_advanced_commands_after_callback($form, $form_state) {
  245. $selector = '#after_div';
  246. $commands = array();
  247. $commands[] = ajax_command_after($selector, "This will be placed after");
  248. return array('#type' => 'ajax', '#commands' => $commands);
  249. }
  250. /**
  251. * Ajax callback for 'alert'.
  252. */
  253. function ajax_forms_test_advanced_commands_alert_callback($form, $form_state) {
  254. $commands = array();
  255. $commands[] = ajax_command_alert("Alert");
  256. return array('#type' => 'ajax', '#commands' => $commands);
  257. }
  258. /**
  259. * Ajax callback for 'append'.
  260. */
  261. function ajax_forms_test_advanced_commands_append_callback($form, $form_state) {
  262. $selector = '#append_div';
  263. $commands = array();
  264. $commands[] = ajax_command_append($selector, "Appended text");
  265. return array('#type' => 'ajax', '#commands' => $commands);
  266. }
  267. /**
  268. * Ajax callback for 'before'.
  269. */
  270. function ajax_forms_test_advanced_commands_before_callback($form, $form_state) {
  271. $selector = '#before_div';
  272. $commands = array();
  273. $commands[] = ajax_command_before($selector, "Before text");
  274. return array('#type' => 'ajax', '#commands' => $commands);
  275. }
  276. /**
  277. * Ajax callback for 'changed'.
  278. */
  279. function ajax_forms_test_advanced_commands_changed_callback($form, $form_state) {
  280. $commands[] = ajax_command_changed('#changed_div');
  281. return array('#type' => 'ajax', '#commands' => $commands);
  282. }
  283. /**
  284. * Ajax callback for 'changed' with asterisk marking inner div.
  285. */
  286. function ajax_forms_test_advanced_commands_changed_asterisk_callback($form, $form_state) {
  287. $commands = array();
  288. $commands[] = ajax_command_changed('#changed_div', '#changed_div_mark_this');
  289. return array('#type' => 'ajax', '#commands' => $commands);
  290. }
  291. /**
  292. * Ajax callback for 'css'.
  293. */
  294. function ajax_forms_test_advanced_commands_css_callback($form, $form_state) {
  295. $selector = '#css_div';
  296. $color = 'blue';
  297. $commands = array();
  298. $commands[] = ajax_command_css($selector, array('background-color' => $color));
  299. return array('#type' => 'ajax', '#commands' => $commands);
  300. }
  301. /**
  302. * Ajax callback for 'data'.
  303. */
  304. function ajax_forms_test_advanced_commands_data_callback($form, $form_state) {
  305. $selector = '#data_div';
  306. $commands = array();
  307. $commands[] = ajax_command_data($selector, 'testkey', 'testvalue');
  308. return array('#type' => 'ajax', '#commands' => $commands);
  309. }
  310. /**
  311. * Ajax callback for 'invoke'.
  312. */
  313. function ajax_forms_test_advanced_commands_invoke_callback($form, $form_state) {
  314. $commands = array();
  315. $commands[] = ajax_command_invoke('#invoke_div', 'addClass', array('error'));
  316. return array('#type' => 'ajax', '#commands' => $commands);
  317. }
  318. /**
  319. * Ajax callback for 'html'.
  320. */
  321. function ajax_forms_test_advanced_commands_html_callback($form, $form_state) {
  322. $commands = array();
  323. $commands[] = ajax_command_html('#html_div', 'replacement text');
  324. return array('#type' => 'ajax', '#commands' => $commands);
  325. }
  326. /**
  327. * Ajax callback for 'insert'.
  328. */
  329. function ajax_forms_test_advanced_commands_insert_callback($form, $form_state) {
  330. $commands = array();
  331. $commands[] = ajax_command_insert('#insert_div', 'insert replacement text');
  332. return array('#type' => 'ajax', '#commands' => $commands);
  333. }
  334. /**
  335. * Ajax callback for 'prepend'.
  336. */
  337. function ajax_forms_test_advanced_commands_prepend_callback($form, $form_state) {
  338. $commands = array();
  339. $commands[] = ajax_command_prepend('#prepend_div', "prepended text");
  340. return array('#type' => 'ajax', '#commands' => $commands);
  341. }
  342. /**
  343. * Ajax callback for 'remove'.
  344. */
  345. function ajax_forms_test_advanced_commands_remove_callback($form, $form_state) {
  346. $commands = array();
  347. $commands[] = ajax_command_remove('#remove_text');
  348. return array('#type' => 'ajax', '#commands' => $commands);
  349. }
  350. /**
  351. * Ajax callback for 'restripe'.
  352. */
  353. function ajax_forms_test_advanced_commands_restripe_callback($form, $form_state) {
  354. $commands = array();
  355. $commands[] = ajax_command_restripe('#restripe_table');
  356. return array('#type' => 'ajax', '#commands' => $commands);
  357. }
  358. /**
  359. * Ajax callback for 'settings'.
  360. */
  361. function ajax_forms_test_advanced_commands_settings_callback($form, $form_state) {
  362. $commands = array();
  363. $setting['ajax_forms_test']['foo'] = 42;
  364. $commands[] = ajax_command_settings($setting);
  365. return array('#type' => 'ajax', '#commands' => $commands);
  366. }
  367. /**
  368. * This form and its related submit and callback functions demonstrate
  369. * not validating another form element when a single Ajax element is triggered.
  370. *
  371. * The "drivertext" element is an Ajax-enabled textfield, free-form.
  372. * The "required_field" element is a textfield marked required.
  373. *
  374. * The correct behavior is that the Ajax-enabled drivertext element should
  375. * be able to trigger without causing validation of the "required_field".
  376. */
  377. function ajax_forms_test_validation_form($form, &$form_state) {
  378. $form['drivertext'] = array(
  379. '#title' => t('AJAX-enabled textfield.'),
  380. '#description' => t("When this one AJAX-triggers and the spare required field is empty, you should not get an error."),
  381. '#type' => 'textfield',
  382. '#default_value' => !empty($form_state['values']['drivertext']) ? $form_state['values']['drivertext'] : "",
  383. '#ajax' => array(
  384. 'callback' => 'ajax_forms_test_validation_form_callback',
  385. 'wrapper' => 'message_area',
  386. 'method' => 'replace',
  387. ),
  388. '#suffix' => '<div id="message_area"></div>',
  389. );
  390. $form['spare_required_field'] = array(
  391. '#title' => t("Spare Required Field"),
  392. '#type' => 'textfield',
  393. '#required' => TRUE,
  394. );
  395. $form['submit'] = array(
  396. '#type' => 'submit',
  397. '#value' => t('Submit'),
  398. );
  399. return $form;
  400. }
  401. /**
  402. * Submit handler for the validation form.
  403. */
  404. function ajax_forms_test_validation_form_submit($form, $form_state) {
  405. drupal_set_message(t("Validation form submitted"));
  406. }
  407. /**
  408. * Ajax callback for the 'drivertext' element of the validation form.
  409. */
  410. function ajax_forms_test_validation_form_callback($form, $form_state) {
  411. drupal_set_message("ajax_forms_test_validation_form_callback invoked");
  412. 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'])));
  413. return '<div id="message_area">ajax_forms_test_validation_form_callback at ' . date('c') . '</div>';
  414. }
  415. /**
  416. * Form builder: Builds a form that triggers a simple AJAX callback.
  417. */
  418. function ajax_forms_test_lazy_load_form($form, &$form_state) {
  419. $form['add_files'] = array(
  420. '#type' => 'checkbox',
  421. '#default_value' => FALSE,
  422. );
  423. $form['submit'] = array(
  424. '#type' => 'submit',
  425. '#value' => t('Submit'),
  426. '#ajax' => array(
  427. 'callback' => 'ajax_forms_test_lazy_load_form_ajax',
  428. ),
  429. );
  430. return $form;
  431. }
  432. /**
  433. * Form submit handler: Adds JavaScript and CSS that wasn't on the original form.
  434. */
  435. function ajax_forms_test_lazy_load_form_submit($form, &$form_state) {
  436. if ($form_state['values']['add_files']) {
  437. drupal_add_js(array('ajax_forms_test_lazy_load_form_submit' => 'executed'), 'setting');
  438. drupal_add_css(drupal_get_path('module', 'system') . '/system.admin.css');
  439. drupal_add_js(drupal_get_path('module', 'system') . '/system.js');
  440. }
  441. $form_state['rebuild'] = TRUE;
  442. }
  443. /**
  444. * AJAX callback for the ajax_forms_test_lazy_load_form() form.
  445. *
  446. * This function returns nothing, because all we're interested in testing is
  447. * ajax_render() adding commands for JavaScript and CSS added during the page
  448. * request, such as the ones added in ajax_forms_test_lazy_load_form_submit().
  449. */
  450. function ajax_forms_test_lazy_load_form_ajax($form, &$form_state) {
  451. return NULL;
  452. }