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_entityCode
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);
}
}
}
}
}