You are here

form_test.module in SimpleTest 7

Helper module for the form API tests.

File

tests/form_test.module
View source
<?php

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

/**
 * Implement hook_menu().
 */
function form_test_menu() {
  $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,
  );
  $items['form_test/drupal_form_submit_batch_api'] = array(
    'title' => 'BatchAPI Drupal_form_submit tests',
    'page callback' => 'form_test_drupal_form_submit_batch_api',
    'access arguments' => array(
      'access content',
    ),
    'type' => MENU_CALLBACK,
  );
  $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,
  );
  $items['form_test/wrapper-callback'] = array(
    'title' => 'Form wrapper callback test',
    'page callback' => 'form_test_wrapper_callback',
    'page arguments' => array(
      'form_test_wrapper_callback_form',
    ),
    'access arguments' => array(
      'access content',
    ),
    'type' => MENU_CALLBACK,
  );
  $items['form_test/form-state-values-clean'] = array(
    'title' => 'Form state values clearance test',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'form_test_form_state_values_clean_form',
    ),
    'access arguments' => array(
      'access content',
    ),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * 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, $form_state, $element_properties) {
  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, $form_state) {
  return _form_test_tableselect_form_builder($form, $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, $form_state) {
  return _form_test_tableselect_form_builder($form, $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, $form_state) {
  return _form_test_tableselect_form_builder($form, $form_state, array(
    '#options' => array(),
  ));
}

/**
 * Test functionality of the tableselect #js_select property.
 */
function _form_test_tableselect_js_select_form($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, $form_state, $options);
}

/**
 * Page callback for the batch/drupal_form_submit interaction test.
 *
 * When called without any arguments we set up a batch that calls
 * form_test_batch_callback. That function will submit a form using
 * drupal_form_submit using the values specified in this function.
 *
 * 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.
 */
function form_test_drupal_form_submit_batch_api($arg = '') {

  // 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);
  batch_process('form_test/drupal_form_submit_batch_api/done');
}

/**
 * Submits form_test_mock_form using drupal_form_submit using the given $value.
 */
function form_test_batch_callback($value) {
  $state['values']['test_value'] = $value;
  drupal_form_submit('form_test_mock_form', $state);
}

/**
 * A simple form with a textfield and submit button.
 */
function form_test_mock_form($form, $form_state) {
  $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']);
}

/**
 * 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 #ajax callbacks.
 *
 * @see form_storage_test_form_submit().
 */
function form_storage_test_form($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 {
    $form['body'] = array(
      '#value' => 'This is the second step.',
    );
    $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']);
}

/**
 * Menu callback; Invokes a form builder function with a wrapper callback.
 */
function form_test_wrapper_callback($form_id) {
  $form_state = array(
    'args' => array(),
    'wrapper_callback' => 'form_test_wrapper_callback_wrapper',
  );
  return drupal_build_form($form_id, $form_state);
}

/**
 * Form wrapper for form_test_wrapper_callback_form().
 */
function form_test_wrapper_callback_wrapper($form, &$form_state) {
  $form['wrapper'] = array(
    '#markup' => 'Form wrapper callback element output.',
  );
  return $form;
}

/**
 * Form builder for form wrapper callback test.
 */
function form_test_wrapper_callback_form($form, &$form_state) {
  $form['builder'] = array(
    '#markup' => 'Form builder element output.',
  );
  return $form;
}

/**
 * Form builder for form_state_values_clean() test.
 */
function form_test_form_state_values_clean_form($form, &$form_state) {

  // Build an example form containing multiple submit and button elements; not
  // only on the top-level.
  $form = array(
    '#tree' => TRUE,
  );
  $form['foo'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  $form['bar'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  $form['beer'] = array(
    '#type' => 'value',
    '#value' => 1000,
  );
  $form['baz']['foo'] = array(
    '#type' => 'button',
    '#value' => t('Submit'),
  );
  $form['baz']['baz'] = array(
    '#type' => 'submit',
    '#value' => t('Submit'),
  );
  $form['baz']['beer'] = array(
    '#type' => 'value',
    '#value' => 2000,
  );
  return $form;
}

/**
 * Form submit handler for form_state_values_clean() test form.
 */
function form_test_form_state_values_clean_form_submit($form, &$form_state) {
  form_state_values_clean($form_state);
  drupal_json_output($form_state['values']);
  exit;
}

Functions

Namesort descending Description
form_storage_test_form A multistep form for testing the form storage.
form_storage_test_form_submit Multistep form submit callback.
form_test_batch_callback Submits form_test_mock_form using drupal_form_submit using the given $value.
form_test_drupal_form_submit_batch_api Page callback for the batch/drupal_form_submit interaction test.
form_test_form_state_values_clean_form Form builder for form_state_values_clean() test.
form_test_form_state_values_clean_form_submit Form submit handler for form_state_values_clean() test form.
form_test_menu Implement hook_menu().
form_test_mock_form A simple form with a textfield and submit button.
form_test_mock_form_submit Form submission callback.
form_test_wrapper_callback Menu callback; Invokes a form builder function with a wrapper callback.
form_test_wrapper_callback_form Form builder for form wrapper callback test.
form_test_wrapper_callback_wrapper Form wrapper for form_test_wrapper_callback_form().
_form_test_tableselect_empty_form Test functionality of the tableselect #empty property.
_form_test_tableselect_form_builder Build a form to test the tableselect element.
_form_test_tableselect_get_data Create a header and options array. Helper function for callbacks.
_form_test_tableselect_js_select_form Test functionality of the tableselect #js_select property.
_form_test_tableselect_multiple_false_form Test the tableselect #multiple = FALSE functionality.
_form_test_tableselect_multiple_false_form_submit Process the tableselect #multiple = FALSE submitted values.
_form_test_tableselect_multiple_true_form Test the tableselect #multiple = TRUE functionality.
_form_test_tableselect_multiple_true_form_submit Process the tableselect #multiple = TRUE submitted values.