form_test.module 10 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
<?php
// $Id$

/**
 * @file
 * Helper module for the form API tests.
 */

/**
 * Implementation of hook_menu().
 */
function form_test_menu() {
  $items = array();

  $items['form_test/tableselect/multiple-true'] = array(
    'title' => 'Tableselect checkboxes test',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('_form_test_tableselect_multiple_true_form'),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  $items['form_test/tableselect/multiple-false'] = array(
    'title' => 'Tableselect radio button test',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('_form_test_tableselect_multiple_false_form'),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  $items['form_test/tableselect/empty-text'] = array(
    'title' => 'Tableselect empty text test',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('_form_test_tableselect_empty_form'),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  $items['form_test/tableselect/advanced-select'] = array(
    'title' => 'Tableselect js_select tests',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('_form_test_tableselect_js_select_form'),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

47 48 49 50 51 52 53
  $items['form_test/form_clean_id'] = array(
    'title' => 'form_clean_id test',
    'page callback' => 'form_test_form_clean_id_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

54 55 56
  $items['form_test/drupal_form_submit_batch_api'] = array(
    'title' => 'BatchAPI Drupal_form_submit tests',
    'page callback' => 'form_test_drupal_form_submit_batch_api',
57 58 59 60
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

61 62 63 64 65 66 67 68
  $items['form_test/form-storage'] = array(
    'title' => 'Form storage test',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('form_storage_test_form'),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

69 70 71
  return $items;
}

72
/**
73
 * Generate a page with three forms, to test the clean_id generation.
74 75
 */
function form_test_form_clean_id_page() {
76 77 78 79
  $build['form_test_test_form1'] = drupal_get_form('form_test_test_form');
  $build['form_test_test_form2'] = drupal_get_form('form_test_test_form');
  $build['form_test_test_form3'] = drupal_get_form('form_test_test_form');
  return $build;
80 81 82 83 84 85 86 87 88 89 90 91 92 93
}

/**
 * A simple form to test clean_id generation.
 */
function form_test_test_form(&$form_state) {
  $form['input'] = array(
    '#type' => 'item',
    '#title' => 'Test Textfield',
    '#markup' => form_clean_id('form_test_form_clean_id_presence'),
  );
  return $form;
}

94 95 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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
/**
 * Create a header and options array. Helper function for callbacks.
 */
function _form_test_tableselect_get_data() {
  $header = array(
    'one' => t('One'),
    'two' => t('Two'),
    'three' => t('Three'),
    'four' => t('Four'),
  );

  $options['row1'] = array(
    'one' => 'row1col1',
    'two' => t('row1col2'),
    'three' => t('row1col3'),
    'four' => t('row1col4'),
  );

  $options['row2'] = array(
    'one' => 'row2col1',
    'two' => t('row2col2'),
    'three' => t('row2col3'),
    'four' => t('row2col4'),
  );

  $options['row3'] = array(
    'one' => 'row3col1',
    'two' => t('row3col2'),
    'three' => t('row3col3'),
    'four' => t('row3col4'),
  );

  return array($header, $options);
}

/**
 * Build a form to test the tableselect element.
 *
 * @param $form_state
 *   The form_state
 * @param $element_properties
 *   An array of element properties for the tableselect element.
 *
 * @return
 *   A form with a tableselect element and a submit button.
 */
function _form_test_tableselect_form_builder($form_state, $element_properties) {
  $form = array();

  list($header, $options) = _form_test_tableselect_get_data();

  $form['tableselect'] = $element_properties;

  $form['tableselect'] += array(
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $options,
    '#multiple' => FALSE,
    '#empty' => t('Empty text.'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );

  return $form;
}

/**
 * Test the tableselect #multiple = TRUE functionality.
 */
function _form_test_tableselect_multiple_true_form($form_state) {
  return _form_test_tableselect_form_builder($form_state, array('#multiple' => TRUE));
}

/**
 * Process the tableselect #multiple = TRUE submitted values.
 */
function _form_test_tableselect_multiple_true_form_submit($form, &$form_state) {
  $selected = $form_state['values']['tableselect'];
  foreach ($selected as $key => $value) {
    drupal_set_message(t('Submitted: @key = @value', array('@key' => $key, '@value' => $value)));
  }
}

/**
 * Test the tableselect #multiple = FALSE functionality.
 */
function _form_test_tableselect_multiple_false_form($form_state) {
  return _form_test_tableselect_form_builder($form_state, array('#multiple' => FALSE));
}

/**
 * Process the tableselect #multiple = FALSE submitted values.
 */
function _form_test_tableselect_multiple_false_form_submit($form, &$form_state) {
  drupal_set_message(t('Submitted: @value', array('@value' => $form_state['values']['tableselect'])));
}

/**
 * Test functionality of the tableselect #empty property.
 */
function _form_test_tableselect_empty_form($form_state) {
  return _form_test_tableselect_form_builder($form_state, array('#options' => array()));
}

/**
 * Test functionality of the tableselect #js_select property.
 */
function _form_test_tableselect_js_select_form($form_state, $action) {

  switch ($action) {

    case 'multiple-true-default':
      $options = array('#multiple' => TRUE);
      break;

    case 'multiple-false-default':
      $options = array('#multiple' => FALSE);
      break;

    case 'multiple-true-no-advanced-select':
      $options = array('#multiple' => TRUE, '#js_select' => FALSE);
      break;

    case 'multiple-false-advanced-select':
      $options = array('#multiple' => FALSE, '#js_select' => TRUE);
      break;
  }

  return _form_test_tableselect_form_builder($form_state, $options);
}
227 228

/**
229
 * Page callback for the batch/drupal_form_submit interaction test.
230 231 232
 *
 * When called without any arguments we set up a batch that calls
 * form_test_batch_callback. That function will submit a form using
233
 * drupal_form_submit using the values specified in this function.
234 235 236 237 238
 *
 * The form's field test_value begins at 'initial_value', and is changed
 * to 'form_submitted' when the form is submitted successfully. On 
 * completion this function is passed 'done' to complete the process.
 */
239
function form_test_drupal_form_submit_batch_api($arg = '') {
240 241 242 243 244 245 246 247 248 249 250 251
  // If we're at the end of the batch process, return.
  if ($arg == 'done') {
    return t('Done');
  }

  // Otherwise set up the batch.
  $batch['operations'] = array(
    array('form_test_batch_callback', array('form_submitted')),
  );

  // Set the batch and process it.
  batch_set($batch);
252
  batch_process('form_test/drupal_form_submit_batch_api/done');
253 254 255
}

/**
256
 * Submits form_test_mock_form using drupal_form_submit using the given $value.
257 258 259
 */
function form_test_batch_callback($value) {
  $state['values']['test_value'] = $value;
260
  drupal_form_submit('form_test_mock_form', $state);
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289
}

/**
 * A simple form with a textfield and submit button.
 */
function form_test_mock_form($form_state) {
  $form = array();

  $form['test_value'] = array(
    '#type' => 'textfield',
    '#default_value' => 'initial_state',
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );

  return $form;
}

/**
 * Form submission callback.
 *
 * Updates the variable 'form_test_mock_submit' to the submitted form value.
 */
function form_test_mock_form_submit($form, &$form_state) {
  variable_set('form_test_mock_submit', $form_state['values']['test_value']);
}
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337

/**
 * A multistep form for testing the form storage.
 *
 * It uses two steps for editing a virtual "thing". Any changes to it are saved
 * in the form storage and have to be present during any step. By setting the
 * request parameter "cache" the form can be tested with caching enabled, as
 * it would be the case, if the form would contain some #ahah callbacks.
 *
 * @see form_storage_test_form_submit().
 */
function form_storage_test_form(&$form_state) {
  // Initialize
  if (!isset($form_state['storage'])) {
    if (empty($form_state['input'])) {
      $_SESSION['constructions'] = 0;
    }
    // Put the initial thing into the storage
    $form_state['storage'] = array(
      'thing' => array(
        'title' => 'none',
        'value' => '',
      ),
    );
    $form_state['storage'] += array('step' => 1);
  }

  // Count how often the form is constructed
  $_SESSION['constructions']++;

  if ($form_state['storage']['step'] == 1) {
    $form['title'] = array(
      '#type' => 'textfield',
      '#title' => 'title',
      '#default_value' => $form_state['storage']['thing']['title'],
      '#required' => TRUE,
    );
    $form['value'] = array(
      '#type' => 'textfield',
      '#title' => 'value',
      '#default_value' => $form_state['storage']['thing']['value'],
    );
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => 'Continue',
    );
  }
  else {
338
    $form['body'] = array('#value' => 'This is the second step.');
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => 'Save',
    );
  }

  if (isset($_REQUEST['cache'])) {
    // Manually activate caching, so we can test that the storage keeps working
    // when it's enabled.
    $form['#cache'] = TRUE;
  }

  return $form;
}

/**
 * Multistep form submit callback.
 */
function form_storage_test_form_submit($form, &$form_state) {
  if ($form_state['storage']['step'] == 1) {
    $form_state['storage']['thing']['title'] = $form_state['values']['title'];
    $form_state['storage']['thing']['value'] = $form_state['values']['value'];
  }
  else {
    drupal_set_message("Title: ". check_plain($form_state['storage']['thing']['title']));
  }
  $form_state['storage']['step']++;
  drupal_set_message("Form constructions: ". $_SESSION['constructions']);
}