You are here

function webform_client_form_pages in Webform 7.4

Same name and namespace in other branches
  1. 6.3 webform.module \webform_client_form_pages()
  2. 7.3 webform.module \webform_client_form_pages()

Handle the processing of pages and conditional logic.

1 string reference to 'webform_client_form_pages'
webform_client_form in ./webform.module
Client form generation function.

File

./webform.module, line 3251
This module provides a simple way to create forms and questionnaires.

Code

function webform_client_form_pages($form, &$form_state) {
  $node = node_load($form_state['values']['details']['nid']);

  // Multistep forms may not have any components on the first page.
  if (!isset($form_state['values']['submitted'])) {
    $form_state['values']['submitted'] = array();
  }

  // Move special settings to storage.
  if (isset($form_state['webform']['component_tree'])) {
    $form_state['storage']['component_tree'] = $form_state['webform']['component_tree'];
    $form_state['storage']['page_count'] = $form_state['webform']['page_count'];
    $form_state['storage']['page_num'] = $form_state['webform']['page_num'];
    $form_state['storage']['preview'] = $form_state['webform']['preview'];
  }

  // Flatten trees within the submission.
  $form_state['values']['submitted'] = _webform_client_form_submit_flatten($node, $form_state['values']['submitted']);

  // Perform post processing by components.
  _webform_client_form_submit_process($node, $form_state['values']['submitted']);

  // Assume the form is completed unless the page logic says otherwise.
  $form_state['webform_completed'] = TRUE;

  // Merge any stored submission data for multistep forms.
  $original_values = is_array($form_state['values']['submitted']) ? $form_state['values']['submitted'] : array();
  if (isset($form_state['storage']['submitted'])) {

    // Array + operator keeps all elements of left operand and discards any
    // duplicate elements in right operand.
    $original_values += $form_state['storage']['submitted'];
  }

  // Execute conditionals on submission values.
  $form_state['values']['submitted'] = webform_get_conditional_sorter($node)
    ->executeConditionals($original_values);

  // Check for a multi-page form that is not yet complete.
  $submit_op = !empty($form['actions']['submit']['#value']) ? $form['actions']['submit']['#value'] : t('Submit');
  $draft_op = !empty($form['actions']['draft']['#value']) ? $form['actions']['draft']['#value'] : t('Save Draft');
  if (!in_array($form_state['values']['op'], array(
    $submit_op,
    $draft_op,
    '__AUTOSAVE__',
  ))) {

    // Store values from the current page in the form state storage.
    $form_state['storage']['submitted'] = $form_state['values']['submitted'];

    // Set the page number.
    if (!isset($form_state['storage']['page_num'])) {
      $form_state['storage']['page_num'] = 1;
    }
    if (end($form_state['clicked_button']['#parents']) == 'next') {
      $forward = 1;
    }
    elseif (end($form_state['clicked_button']['#parents']) == 'previous') {
      $forward = -1;
    }
    $current_page = $form_state['storage']['page_num'];
    if (isset($forward)) {

      // Find the:
      // 1. previous/next non-empty page, or
      // 2. the preview page, or
      // 3. the preview page, forcing its display if the form would unexpectedly
      //    submit, or
      // 4. page 1 even if empty, if no other previous page would be shown.
      $preview_page_num = $form_state['storage']['page_count'] + (int) (!$form_state['webform']['preview']);
      $page_num = $current_page;
      do {
        $page_num += $forward;
      } while (!webform_get_conditional_sorter($node)
        ->pageVisibility($page_num));
      if (!$form_state['webform']['preview'] && $page_num == $preview_page_num) {

        // Force a preview to avert an unintended submission via Next.
        $form_state['webform']['preview'] = TRUE;
        $form_state['storage']['preview'] = TRUE;
        $form_state['storage']['page_count']++;
      }
      $form_state['storage']['page_num'] = $page_num;
    }

    // The form is done if the page number is greater than the page count.
    $form_state['webform_completed'] = $form_state['storage']['page_num'] > $form_state['storage']['page_count'];
  }

  // Inform the submit handlers that a draft will be saved.
  $form_state['save_draft'] = in_array($form_state['values']['op'], array(
    $draft_op,
    '__AUTOSAVE__',
  )) || $node->webform['auto_save'] && !$form_state['values']['details']['finished'] && !$form_state['webform_completed'] && user_is_logged_in();

  // Determine what we need to do on the next page.
  if (!empty($form_state['save_draft']) || !$form_state['webform_completed']) {

    // Rebuild the form and display the current (on drafts) or next page.
    $form_state['rebuild'] = TRUE;
  }
  else {

    // Remove the form state storage now that we're done with the pages.
    $form_state['rebuild'] = FALSE;
    unset($form_state['storage']);
  }
}