You are here

function webform_tokens_tokens in Webform Tokens 7

Implements hook_tokens().

The first "_tokens" is part of the module name.

File

./webform_tokens.module, line 98
The Webform Tokens module.

Code

function webform_tokens_tokens($type, array $tokens, array $data = array(), array $options = array()) {

  // Support [webform:] tokens if Webform Rules is not enabled.
  if ($type === 'webform' && isset($data['webform']) && module_exists('webform_rules') === FALSE) {
    $type = 'webform-tokens';
    $data['webform-submission'] = $data['webform'];
  }
  if ($type === 'webform-tokens' && isset($data['webform-submission']) && is_object($data['webform-submission'])) {
    $submission = $data['webform-submission'];
    $nid = $submission->nid;
    $sid = $submission->sid;
    $replacements = array();
    $special_tokens = array(
      'meta-nid',
      'webform-meta-nid',
      'meta-submitted',
      'webform-meta-submitted',
    );
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'meta-nid':
        case 'webform-meta-nid':
          $replacements[$original] = $submission->nid;
          break;
        case 'meta-sid':
        case 'webform-meta-sid':
          $replacements[$original] = $submission->sid;
          break;
        case 'meta-uid':
        case 'webform-meta-uid':
          $replacements[$original] = $submission->uid;
          break;
        case 'meta-remote_addr':
        case 'webform-meta-remote_addr':
          $replacements[$original] = $submission->remote_addr;
          break;
        case 'meta-submitted':
        case 'webform-meta-submitted':
          $replacements[$original] = $submission->submitted;
          break;
        default:

          // Don't replace if the name will be generated later.
          foreach ($special_tokens as $special_name) {
            if (strpos($name, $special_name) !== FALSE && $name != $special_name) {
              break 2;
            }
          }
          static $components;

          // Initialize components for this webform submission if necessary.
          if (!isset($components[$nid][$sid])) {
            $components = array(
              $nid => array(
                $sid => array(),
              ),
            );
            $q = db_select('webform_component')
              ->fields('webform_component')
              ->condition('type', array(
              'markup',
              'pagebreak',
              'fieldset',
            ), 'NOT IN')
              ->condition('nid', $submission->nid)
              ->execute()
              ->fetchAllAssoc('cid', PDO::FETCH_ASSOC);
            foreach ($q as $this_component) {
              $cid = $this_component['cid'];
              if (isset($submission->data[$cid])) {
                $submission->data[$cid] += $this_component;
              }
              else {
                $submission->data[$cid] = array();
              }

              // Modify the submission.
              $components[$nid][$sid] += array(
                $cid => $submission->data[$cid],
              );
            }
          }
          $cid_found = FALSE;
          foreach ($components as $this_nid => $this_submission) {
            foreach ($this_submission as $this_sid => $this_component) {
              foreach ($this_component as $this_cid => $component_data) {
                if (!empty($component_data)) {

                  // We have to account for chained tokens as well.
                  $prefix_check = token_find_with_prefix($tokens, 'val-' . $component_data['form_key']);
                  if (in_array($name, array(
                    'val-' . $component_data['form_key'],
                    'meta-label-' . $component_data['form_key'],
                  )) || !empty($prefix_check)) {
                    $cid = $this_cid;
                    $cid_found = TRUE;
                    break;
                  }
                  $prefix_check = token_find_with_prefix($tokens, 'webform-val-' . $component_data['form_key']);
                  if (in_array($name, array(
                    'webform-val-' . $component_data['form_key'],
                    'webform-key-' . $component_data['form_key'],
                    'meta-label-' . $component_data['form_key'],
                  )) || !empty($prefix_check)) {
                    $cid = $this_cid;
                    $cid_found = TRUE;
                    break;
                  }
                }
              }
              if ($cid_found) {
                break;
              }
            }
            if ($cid_found) {
              break;
            }
          }
          if ($cid_found && !empty($components[$nid][$sid][$cid])) {
            $replacements += _webform_tokens_add_component_replacement($components[$nid][$sid][$cid], $submission, array(
              'original' => $original,
              'name' => $name,
              'tokens' => $tokens,
              'options' => $options,
            ));
          }
          break;
      }
    }
    if ($webform_meta_node_tokens = token_find_with_prefix($tokens, 'meta-nid')) {
      $webform_meta_node = node_load($submission->nid);
      $replacements += token_generate('node', $webform_meta_node_tokens, array(
        'node' => $webform_meta_node,
      ), $options);
    }
    if ($webform_meta_node_tokens = token_find_with_prefix($tokens, 'webform-meta-nid')) {
      $webform_meta_node = node_load($submission->nid);
      $replacements += token_generate('node', $webform_meta_node_tokens, array(
        'node' => $webform_meta_node,
      ), $options);
    }
    if ($webform_meta_node_tokens = token_find_with_prefix($tokens, 'meta-uid')) {
      $webform_meta_user = user_load($submission->uid);
      $replacements += token_generate('user', $webform_meta_node_tokens, array(
        'user' => $webform_meta_user,
      ), $options);
    }
    if ($webform_meta_node_tokens = token_find_with_prefix($tokens, 'webform-meta-uid')) {
      $webform_meta_user = user_load($submission->uid);
      $replacements += token_generate('user', $webform_meta_node_tokens, array(
        'user' => $webform_meta_user,
      ), $options);
    }
    if ($webform_meta_submitted_tokens = token_find_with_prefix($tokens, 'meta-submitted')) {
      $webform_meta_submitted = $submission->submitted;
      $replacements += token_generate('date', $webform_meta_submitted_tokens, array(
        'date' => $webform_meta_submitted,
      ), $options);
    }
    if ($webform_meta_submitted_tokens = token_find_with_prefix($tokens, 'webform-meta-submitted')) {
      $webform_meta_submitted = $submission->submitted;
      $replacements += token_generate('date', $webform_meta_submitted_tokens, array(
        'date' => $webform_meta_submitted,
      ), $options);
    }
    return $replacements;
  }
}