You are here

protected function Webform::w4_formStateToSubmission in Little helpers 7

Webform4 version of

See also

Webform::formStateToSubmission().

1 call to Webform::w4_formStateToSubmission()
Webform::formStateToSubmission in src/Webform/Webform.php
Create a submission-object from a webform_client_form $form_state.

File

src/Webform/Webform.php, line 185

Class

Webform

Namespace

Drupal\little_helpers\Webform

Code

protected function w4_formStateToSubmission(&$form_state) {
  $node = $this->node;
  $form_state += [
    'values' => [
      'submitted' => [],
      'details' => [
        'sid' => NULL,
        'uid' => $GLOBALS['user']->uid,
      ],
    ],
  ];
  $sid = $form_state['values']['details']['sid'] ? (int) $form_state['values']['details']['sid'] : NULL;

  // Check if user is submitting as a draft.
  $is_draft = (int) (!empty($form_state['save_draft']));

  // To maintain time and user information, load the existing submission.
  // If a draft is deleted while a user is working on completing it, $sid will
  // exist, but webform_get_submission() will not find the draft. So, make a new
  // submission.
  if ($sid && ($submission = webform_get_submission($node->webform['nid'], $sid))) {

    // Store original data on object for use in update hook.
    $submission->original = clone $submission;

    // Merge with new submission data. The + operator maintains numeric keys.
    // This maintains existing data with just-submitted data when a user resumes
    // a submission previously saved as a draft.
    // Remove any existing data on this and previous pages. If components are hidden, they may
    // be in the $submission->data but absent entirely from $new_data.
    $page_map = webform_get_conditional_sorter($node)
      ->getPageMap();
    for ($page_nr = 1; $page_nr <= $form_state['webform']['page_num']; $page_nr++) {
      $submission->data = array_diff_key($submission->data, $page_map[$page_nr]);
    }
    $submission->data = webform_submission_data($node, $form_state['values']['submitted']) + $submission->data;
  }
  else {

    // Create a new submission object.
    $submission = webform_submission_create($node, $GLOBALS['user'], $form_state);

    // Since this is a new submission, a new sid is needed.
    $sid = NULL;
  }

  // Save draft state, and for drafts, save the current page (if clicking next)
  // or the previous page (if not) as the last valid page.
  $submission->is_draft = $is_draft;
  $submission->highest_valid_page = 0;
  if ($is_draft) {
    $submission->highest_valid_page = end($form_state['clicked_button']['#parents']) == 'next' && $form_state['values']['op'] != '__AUTOSAVE__' ? $form_state['webform']['page_num'] : $form_state['webform']['page_num'] - 1;
  }
  return new Submission($this, $submission);
}