You are here

public function GDPRCollector::listFields in General Data Protection Regulation 8.2

Same name and namespace in other branches
  1. 8 modules/gdpr_fields/src/GDPRCollector.php \Drupal\gdpr_fields\GDPRCollector::listFields()
  2. 3.0.x modules/gdpr_fields/src/GDPRCollector.php \Drupal\gdpr_fields\GDPRCollector::listFields()

List fields on entity including their GDPR values.

Parameters

\Drupal\Core\Entity\EntityTypeInterface $entityType: The entity type id.

string $bundleId: The entity bundle id.

array $filters: Array of filters with following keys: 'empty' => filter out entities where all fields are not configured. 'rtf' => only include fields where RTF is configured. 'rta' => only include fields where RTA is configured. 'search' => only include fields whose name match.

Return value

array GDPR entity field list.

File

modules/gdpr_fields/src/GDPRCollector.php, line 78

Class

GDPRCollector
Defines a helper class for stuff related to views data.

Namespace

Drupal\gdpr_fields

Code

public function listFields(EntityTypeInterface $entityType, $bundleId, array $filters) {
  $bundleType = $entityType
    ->getBundleEntityType();
  $gdprSettings = GdprFieldConfigEntity::load($entityType
    ->id());

  // @todo explicitly skip commerce_order_item for now as they break bundles
  if ($entityType
    ->id() == 'commerce_order_item') {
    return [];
  }
  $fieldDefinitions = $this->entityFieldManager
    ->getFieldDefinitions($entityType
    ->id(), $bundleId);

  // Get fields for entity.
  $fields = [];

  // If the 'Filter out entities where all fields are not configured' option
  // is set, return an empty array if GDPR is not configured for the entity.
  if ($filters['empty'] && $gdprSettings === NULL) {
    return $fields;
  }
  $hasAtLeastOneConfiguredField = FALSE;
  foreach ($fieldDefinitions as $fieldId => $fieldDefinition) {

    /** @var \Drupal\Core\Field\FieldItemListInterface $fieldDefinition */
    $key = "{$entityType->id()}.{$bundleId}.{$fieldId}";
    $route_name = 'gdpr_fields.edit_field';
    $route_params = [
      'entity_type' => $entityType
        ->id(),
      'bundle_name' => $bundleId,
      'field_name' => $fieldId,
    ];
    if (isset($bundleType)) {
      $route_params[$bundleType] = $bundleId;
    }
    $rta = '0';
    $rtf = '0';
    $label = $fieldDefinition
      ->getLabel();

    // If we're searching by name, check if the label matches search.
    if ($filters['search'] && (!stripos($label, $filters['search']) || !stripos($fieldDefinition
      ->getName(), $filters['search']))) {
      continue;
    }
    $is_id = $entityType
      ->getKey('id') === $fieldId;
    $fields[$key] = [
      'title' => $label,
      'type' => $is_id ? 'primary_key' : $fieldDefinition
        ->getType(),
      'rta' => 'Not Configured',
      'rtf' => 'Not Configured',
      'notes' => '',
      'edit' => '',
      'is_id' => $is_id,
    ];
    if ($entityType
      ->get('field_ui_base_route')) {
      $fields[$key]['edit'] = Link::createFromRoute('edit', $route_name, $route_params);
    }
    if ($gdprSettings !== NULL) {

      /* @var \Drupal\gdpr_fields\Entity\GdprField $field_settings */
      $field_settings = $gdprSettings
        ->getField($bundleId, $fieldId);
      if ($field_settings->enabled) {
        $hasAtLeastOneConfiguredField = TRUE;
        $rta = $field_settings->rta;
        $rtf = $field_settings->rtf;
        $fields[$key]['rta'] = $field_settings
          ->rtaDescription();
        $fields[$key]['rtf'] = $field_settings
          ->rtfDescription();
        $fields[$key]['notes'] = $field_settings->notes;
      }
    }

    // Apply filters.
    if (!empty($filters['rtf']) && !in_array($rtf, $filters['rtf'], FALSE)) {
      unset($fields[$key]);
    }
    if (!empty($filters['rta']) && !in_array($rta, $filters['rta'], FALSE)) {
      unset($fields[$key]);
    }
  }

  // Handle the 'Filter out Entities where all fields are not configured'
  // checkbox.
  if ($filters['empty'] && !$hasAtLeastOneConfiguredField) {
    return [];
  }
  return $fields;
}