View source
<?php
namespace Drupal\little_helpers\Webform;
class Webform {
public $node;
protected $webform;
public $nid;
public static function is_webform4() {
return function_exists('webform_replace_tokens');
}
public function __construct($node) {
$this->node = $node;
$this->webform =& $node->webform;
if (!isset($this->webform['cids'])) {
foreach ($this->webform['components'] as $component) {
$this->webform['cids'][$component['form_key']] = (int) $component['cid'];
}
}
}
public static function fromNode(\stdClass $node) {
return new static($node);
}
public function &componentByKey($form_key) {
if (isset($this->webform['cids'][$form_key])) {
return $this->webform['components'][$this->webform['cids'][$form_key]];
}
$return = array();
return $return;
}
public function &component($cid) {
return $this->webform['components'][$cid];
}
public function componentsByType($type) {
$components = array();
foreach ($this->webform['components'] as $cid => &$c) {
if ($c['type'] == $type) {
$components[$cid] =& $c;
}
}
return $components;
}
public function getRedirect($submission = NULL) {
$node = $this->node;
$redirect_url = $node->webform['redirect_url'];
$redirect_url = trim($node->webform['redirect_url']);
if ($submission) {
$redirect_url = _webform_filter_values($redirect_url, $node, $submission, NULL, FALSE, TRUE);
}
$redirect_url = preg_replace('/^' . preg_quote($GLOBALS['base_url'], '/') . '\\//', '', $redirect_url);
if ($redirect_url == '<none>') {
return NULL;
}
elseif ($redirect_url == '<confirmation>') {
$options = array();
if ($submission) {
$options['query']['sid'] = $submission->sid;
if (function_exists('webform_get_submission_access_token')) {
if ((int) $GLOBALS['user']->uid === 0) {
$options['query']['token'] = webform_get_submission_access_token($submission);
}
}
}
return array(
'node/' . $node->nid . '/done',
$options,
);
}
elseif (valid_url($redirect_url, TRUE)) {
return $redirect_url;
}
elseif ($redirect_url && strpos($redirect_url, 'http') !== 0) {
$parts = drupal_parse_url($redirect_url);
if ($submission) {
$parts['query']['sid'] = $submission->sid;
}
$query = $parts['query'];
return array(
$parts['path'],
array(
'query' => $query,
'fragment' => $parts['fragment'],
),
);
}
return $redirect_url;
}
public function getRedirectUrl($submission = NULL, $absolute = TRUE) {
$redirect = $this
->getRedirect($submission);
if (is_array($redirect)) {
$redirect[1]['absolute'] = $absolute;
return url($redirect[0], $redirect[1]);
}
else {
return $redirect;
}
}
public function formStateToSubmission(&$form_state) {
if (self::is_webform4()) {
return $this
->w4_formStateToSubmission($form_state);
}
else {
return $this
->w3_formStateToSubmission($form_state);
}
}
protected function w3_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;
$is_draft = (int) (!empty($form_state['save_draft']));
$form_state += [
'values' => [
'submitted' => [],
],
];
if (!$sid) {
$submission = (object) array(
'nid' => $node->nid,
'sid' => NULL,
'uid' => $form_state['values']['details']['uid'],
'submitted' => REQUEST_TIME,
'remote_addr' => ip_address(),
'is_draft' => $is_draft,
'data' => webform_submission_data($node, $form_state['values']['submitted']),
);
}
else {
$submission = webform_get_submission($node->webform['nid'], $sid);
$submission->is_draft = $is_draft;
$new_data = webform_submission_data($node, $form_state['values']['submitted']);
$submission->data = $new_data + $submission->data;
}
return new Submission($this, $submission);
}
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;
$is_draft = (int) (!empty($form_state['save_draft']));
if ($sid && ($submission = webform_get_submission($node->webform['nid'], $sid))) {
$submission->original = clone $submission;
$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 {
$submission = webform_submission_create($node, $GLOBALS['user'], $form_state);
$sid = NULL;
}
$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);
}
public function needsConfirmation() {
if (!module_exists('webform_confirm_email')) {
return FALSE;
}
$q = db_select('webform_confirm_email', 'e');
$q
->join('webform_emails', 'we', 'we.nid=e.nid AND we.eid=e.eid');
$q
->fields('e', [
'eid',
])
->condition('e.email_type', 1)
->condition('we.nid', $this->node->nid);
if (self::is_webform4()) {
$q
->condition('we.status', 1);
}
return (bool) $q
->execute()
->fetch();
}
public function __sleep() {
$this->nid = $this->node->nid;
return array(
'nid',
);
}
public function __wakeup() {
if (!($node = node_load($this->nid))) {
throw new \UnexpectedValueException('Tried to __wakeup with non-existing node.');
}
$this
->__construct(\node_load($this->nid));
}
}