You are here

public function SalesforceMappingFieldPluginBase::pushValue in Salesforce Suite 8.4

Same name and namespace in other branches
  1. 8.3 modules/salesforce_mapping/src/SalesforceMappingFieldPluginBase.php \Drupal\salesforce_mapping\SalesforceMappingFieldPluginBase::pushValue()
  2. 5.0.x modules/salesforce_mapping/src/SalesforceMappingFieldPluginBase.php \Drupal\salesforce_mapping\SalesforceMappingFieldPluginBase::pushValue()

Munge the value that's being prepared to push to Salesforce.

An extension of ::value, ::pushValue does some basic type-checking and validation against Salesforce field types to protect against basic data errors.

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity being pushed.

\Drupal\salesforce_mapping\Entity\SalesforceMappingInterface $mapping: The mapping.

Return value

mixed The value to be pushed to Salesforce.

Overrides SalesforceMappingFieldPluginInterface::pushValue

File

modules/salesforce_mapping/src/SalesforceMappingFieldPluginBase.php, line 172

Class

SalesforceMappingFieldPluginBase
Defines a base Salesforce Mapping Field Plugin implementation.

Namespace

Drupal\salesforce_mapping

Code

public function pushValue(EntityInterface $entity, SalesforceMappingInterface $mapping) {

  // @TODO to provide for better extensibility, this would be better implemented as some kind of constraint or plugin system. That would also open new possibilities for injecting business logic into the mapping layer.
  // If this field plugin doesn't support salesforce_field config type, or
  // doesn't do push, then return the raw value from the mapped entity.
  $value = $this
    ->value($entity, $mapping);
  if (!$this
    ->push() || empty($this
    ->config('salesforce_field'))) {
    return $value;
  }

  // objectDescribe can throw an exception, but that's outside the scope of
  // being handled here. Allow it to percolate.
  $describe = $this->salesforceClient
    ->objectDescribe($mapping
    ->getSalesforceObjectType());
  try {
    $field_definition = $describe
      ->getField($this
      ->config('salesforce_field'));
  } catch (\Exception $e) {
    $this->eventDispatcher
      ->dispatch(SalesforceEvents::WARNING, new SalesforceWarningEvent($e, 'Field definition not found for %describe.%field', [
      '%describe' => $describe
        ->getName(),
      '%field' => $this
        ->config('salesforce_field'),
    ]));

    // If getField throws, however, just return the raw value.
    return $value;
  }
  switch (strtolower($field_definition['type'])) {
    case 'boolean':
      if ($value == 'false') {
        $value = FALSE;
      }
      $value = (bool) $value;
      break;
    case 'date':
    case 'datetime':
      if (!empty($value)) {
        $date = new DrupalDateTime($value, 'UTC');
        $value = $date
          ->format(DateTime::ISO8601);
      }
      break;
    case 'double':
      $value = (double) $value;
      break;
    case 'integer':
      $value = (int) $value;
      break;
    case 'multipicklist':
      if (is_array($value)) {
        $value = implode(';', $value);
      }
      break;
    case 'id':
    case 'reference':
      if (empty($value)) {
        break;
      }

      // If value is an SFID, cast to string.
      if ($value instanceof SFID) {
        $value = (string) $value;
      }
      else {
        $value = (string) new SFID($value);
      }
      break;
  }
  if ($field_definition['length'] > 0 && strlen($value) > $field_definition['length']) {
    $value = substr($value, 0, $field_definition['length']);
  }
  return $value;
}