You are here

protected function CiviEntityStorage::initFieldValues in CiviCRM Entity 8.3

Provide any additional processing of values from CiviCRM API.

Overrides ContentEntityStorageBase::initFieldValues

1 call to CiviEntityStorage::initFieldValues()
CiviEntityStorage::prepareLoadedEntity in src/CiviEntityStorage.php
Prepares a loaded entity.

File

src/CiviEntityStorage.php, line 377

Class

CiviEntityStorage
Defines entity class for external CiviCRM entities.

Namespace

Drupal\civicrm_entity

Code

protected function initFieldValues(ContentEntityInterface $entity, array $values = [], array $field_names = []) {
  parent::initFieldValues($entity, $values, $field_names);
  $civicrm_entity_settings = $this
    ->getConfigFactory()
    ->get('civicrm_entity.settings');
  $field_definitions = $entity
    ->getFieldDefinitions();
  foreach ($field_definitions as $definition) {
    $items = $entity
      ->get($definition
      ->getName());
    if ($items
      ->isEmpty()) {
      continue;
    }
    $main_property_name = $definition
      ->getFieldStorageDefinition()
      ->getMainPropertyName();

    // Set a default format for text fields.
    if ($definition
      ->getType() === 'text_long') {
      $filter_format = $civicrm_entity_settings
        ->get('filter_format') ?: filter_fallback_format();
      $item_values = $items
        ->getValue();
      foreach ($item_values as $delta => $item) {
        $item_values[$delta]['format'] = $filter_format;
      }
      $items
        ->setValue($item_values);
    }
    elseif ($definition
      ->getType() === 'datetime') {
      $item_values = $items
        ->getValue();
      foreach ($item_values as $delta => $item) {

        // On Contribution entities, there are dates sometimes set to the
        // string value of 'null'.
        if ($item[$main_property_name] === 'null') {
          $item_values[$delta][$main_property_name] = NULL;
        }
        elseif (is_numeric($item[$main_property_name])) {
          $item_values[$delta][$main_property_name] = (new \DateTime())
            ->setTimestamp($item[$main_property_name])
            ->format(DateTimeItemInterface::DATETIME_STORAGE_FORMAT);
        }
        else {
          $datetime_format = $definition
            ->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE ? DateTimeItemInterface::DATE_STORAGE_FORMAT : DateTimeItemInterface::DATETIME_STORAGE_FORMAT;

          // CiviCRM gives us the datetime in the users timezone (or no
          // timezone at all) but Drupal expects it in UTC. So, we need to
          // convert from the users timezone into UTC.
          $datetime_value = (new \DateTime($item[$main_property_name], new \DateTimeZone(date_default_timezone_get())))
            ->setTimezone(new \DateTimeZone('UTC'))
            ->format($datetime_format);
          $item_values[$delta][$main_property_name] = $datetime_value;
        }
      }
      $items
        ->setValue($item_values);
    }
  }

  // Handle special cases for field definitions.
  foreach ($field_definitions as $definition) {
    if (($field_metadata = $definition
      ->getSetting('civicrm_entity_field_metadata')) && isset($field_metadata['custom_group_id']) && $field_metadata['data_type'] === 'File') {
      $items = $entity
        ->get($definition
        ->getName());
      $item_values = $items
        ->getValue();
      if (!empty($item_values)) {
        $ret = [];
        foreach ($item_values as $value) {
          if (!isset($value['fid'])) {
            continue;
          }
          $ret[] = [
            'value' => $value['fid'],
          ];
        }
        if (!empty($ret)) {
          $items
            ->setValue($ret);
        }
      }
    }
  }
}