You are here

function _fillCiviCRMData in Webform CiviCRM Integration 8.5

Fill civicrm data to the submission object.

Parameters

array $data:

object $webformSubmission:

2 calls to _fillCiviCRMData()
webform_civicrm_tokens in ./webform_civicrm.module
Implements hook_tokens().
webform_civicrm_webform_submission_load in ./webform_civicrm.module
Implements hook_entity_load() Display labels for civicrm option element.

File

./webform_civicrm.module, line 168
Webform CiviCRM Integration Module: Links webform submissions to contacts in a CiviCRM database. @author Coleman Watts

Code

function _fillCiviCRMData($data, $webformSubmission) {
  if (!empty($data['civicrm'])) {
    return $data;
  }
  $utils = \Drupal::service('webform_civicrm.utils');
  $webform = $webformSubmission
    ->getWebform();
  foreach ($data as $key => $val) {
    $element = $webform
      ->getElement($key);
    if (!empty($val) && $element['#type'] == 'civicrm_options') {
      if (!empty($element['#webform_multiple'])) {
        foreach ($val as $k => $v) {
          if (isset($element['#options'][$v])) {
            $data[$key][$k] = $element['#options'][$v];
          }
        }
      }
      elseif (isset($element['#options'][$val])) {
        $data[$key] = $element['#options'][$val];
      }
    }
  }
  $contacts = [];
  $query = \Drupal::database()
    ->select('webform_civicrm_submissions', 'wcs')
    ->fields('wcs', [
    'contact_id',
    'civicrm_data',
  ])
    ->condition('sid', $webformSubmission
    ->id(), '=');
  $results = $query
    ->execute();
  while ($content = $results
    ->fetchAssoc()) {
    $civicrm_data = unserialize($content['civicrm_data']) + [
      'contact' => [],
    ];
    if ($content['contact_id']) {
      foreach (explode('-', trim($content['contact_id'], '-')) as $c => $cid) {
        $civicrm_data['contact'][$c + 1]['id'] = $cid;
        $civicrm_data['contact'][$c + 1]['display_name'] = '';
        if ($c == 0 && $cid) {
          $contacts[$cid] = '';
        }
      }
    }
    $data['civicrm'] = $civicrm_data;
  }
  if ($contacts) {

    // Retrieve contact names and add to submission objects
    $contacts = $utils
      ->wf_crm_apivalues('contact', 'get', [
      'id' => [
        'IN' => array_keys($contacts),
      ],
    ], 'display_name') + $contacts;
    if (!empty($data['civicrm']['contact'][1]['id'])) {
      $data['civicrm']['contact'][1]['display_name'] = $contacts[$data['civicrm']['contact'][1]['id']];
    }
  }
  return $data;
}