function webform_client_form_pages in Webform 7.4
Same name and namespace in other branches
- 6.3 webform.module \webform_client_form_pages()
- 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']);
}
}