You are here

public static function Flow::getDefaultFieldConfigForEntityType in CMS Content Sync 8

Same name and namespace in other branches
  1. 2.1.x src/Entity/Flow.php \Drupal\cms_content_sync\Entity\Flow::getDefaultFieldConfigForEntityType()
  2. 2.0.x src/Entity/Flow.php \Drupal\cms_content_sync\Entity\Flow::getDefaultFieldConfigForEntityType()

Parameters

$type:

$bundle:

null $existing:

null $field:

Return value

array

2 calls to Flow::getDefaultFieldConfigForEntityType()
Flow::createFlow in src/Entity/Flow.php
Create a flow configuration programmatically.
Flow::updateEntityTypeBundleVersion in src/Entity/Flow.php
Update the version of an entity type bundle within a flow configuration.

File

src/Entity/Flow.php, line 768

Class

Flow
Defines the "Content Sync - Flow" entity.

Namespace

Drupal\cms_content_sync\Entity

Code

public static function getDefaultFieldConfigForEntityType($type, $bundle, $existing = null, $field = null) {
  if ($field) {
    $field_default_values = [
      'export' => null,
      'import' => null,
    ];
    $entity_type = \Drupal::entityTypeManager()
      ->getDefinition($type);

    // @todo Should be gotten from the Entity Type Handler instead.
    $forbidden_fields = [
      // These are not relevant or misleading when synchronized.
      'revision_default',
      'revision_translation_affected',
      'content_translation_outdated',
      // Field collections.
      'host_type',
      // Files.
      'uri',
      'filemime',
      'filesize',
      // Media.
      'thumbnail',
      // Taxonomy.
      'parent',
      // These are standard fields defined by the Flow
      // Entity type that entities may not override (otherwise
      // these fields will collide with CMS Content Sync functionality)
      $entity_type
        ->getKey('bundle'),
      $entity_type
        ->getKey('id'),
      $entity_type
        ->getKey('uuid'),
      $entity_type
        ->getKey('label'),
      $entity_type
        ->getKey('revision'),
    ];
    $pools = Pool::getAll();
    if (count($pools)) {
      $reserved = reset($pools)
        ->getClient()
        ->getReservedPropertyNames();
      $forbidden_fields = array_merge($forbidden_fields, $reserved);
    }
    if (false !== in_array($field, $forbidden_fields)) {
      $field_default_values['handler'] = 'ignore';
      $field_default_values['export'] = PushIntent::PUSH_DISABLED;
      $field_default_values['import'] = PullIntent::PULL_DISABLED;
      return $field_default_values;
    }
    $field_handler_service = \Drupal::service('plugin.manager.cms_content_sync_field_handler');
    $field_definition = \Drupal::service('entity_field.manager')
      ->getFieldDefinitions($type, $bundle)[$field];
    $field_handlers = $field_handler_service
      ->getHandlerOptions($type, $bundle, $field, $field_definition, true);
    if (empty($field_handlers)) {
      throw new \Exception('Unsupported field type ' . $field_definition
        ->getType() . ' for field ' . $type . '.' . $bundle . '.' . $field);
    }
    reset($field_handlers);
    $handler_id = empty($field_default_values['handler']) ? key($field_handlers) : $field_default_values['handler'];
    $field_default_values['handler'] = $handler_id;
    $field_default_values['export'] = PushIntent::PUSH_AUTOMATICALLY;
    $field_default_values['import'] = PullIntent::PULL_AUTOMATICALLY;
    $handler = $field_handler_service
      ->createInstance($handler_id, [
      'entity_type_name' => $type,
      'bundle_name' => $bundle,
      'field_name' => $field,
      'field_definition' => $field_definition,
      'settings' => $field_default_values,
      'sync' => null,
    ]);
    $advanced_settings = $handler
      ->getHandlerSettings($field_default_values);
    if (count($advanced_settings)) {
      foreach ($advanced_settings as $name => $element) {
        $field_default_values['handler_settings'][$name] = $element['#default_value'];
      }
    }
    return $field_default_values;
  }
  $field_definition = \Drupal::service('entity_field.manager')
    ->getFieldDefinitions($type, $bundle);
  $result = [];
  foreach ($field_definition as $key => $field) {
    $field_id = $type . '-' . $bundle . '-' . $key;
    if ($existing && isset($existing[$field_id])) {
      continue;
    }
    $result[$field_id] = self::getDefaultFieldConfigForEntityType($type, $bundle, null, $key);
  }
  return $result;
}