You are here

function verf_views_data_alter in Views Entity Reference Filter 8

Implements hook_views_data_alter().

File

./verf.module, line 14
Contains hook implementations.

Code

function verf_views_data_alter(array &$data) {
  $manager = \Drupal::entityTypeManager();
  $field_config_storage = $manager
    ->getStorage('field_config');

  /** @var \Drupal\field\FieldConfigInterface[] $field_configs */
  $field_configs = $field_config_storage
    ->loadByProperties([
    'field_type' => 'entity_reference',
  ]);
  foreach ($field_configs as $field_config) {
    $table_name = $field_config
      ->getTargetEntityTypeId() . '__' . $field_config
      ->getName();
    $column_name = $field_config
      ->getName() . '_target_id';
    if (isset($data[$table_name][$column_name])) {
      $data[$table_name][$column_name . '_verf'] = [
        'title' => t('@label (VERF selector)', [
          '@label' => $field_config
            ->label(),
        ]),
        'group' => $data[$table_name][$column_name]['group'],
        'help' => $data[$table_name][$column_name]['help'],
        'filter' => [
          'field' => $column_name,
          'table' => $table_name,
          'id' => 'verf',
          'additional fields' => [],
          'field_name' => $field_config
            ->getName(),
          'entity_type' => $field_config
            ->getTargetEntityTypeId(),
          'verf_target_entity_type_id' => $field_config
            ->getSetting('target_type'),
          'allow empty' => TRUE,
        ],
      ];
    }
  }
  foreach ($manager
    ->getDefinitions() as $entity_type) {
    if (!$entity_type
      ->entityClassImplements(FieldableEntityInterface::class)) {
      continue;
    }

    // We cannot alter Views data if we cannot map fields to tables.
    $entity_storage = $manager
      ->getStorage($entity_type
      ->id());
    if (!$entity_storage instanceof SqlEntityStorageInterface) {
      continue;
    }

    /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $base_field_definitions */
    $base_field_definitions = \Drupal::service('entity_field.manager')
      ->getBaseFieldDefinitions($entity_type
      ->id());
    $table_mapping = $entity_storage
      ->getTableMapping();

    // Loop through all of this entity type's stored fields.
    foreach ($table_mapping
      ->getTableNames() as $table_name) {
      foreach ($table_mapping
        ->getFieldNames($table_name) as $field_name) {

        // Skip fields that are not base fields.
        if (!isset($base_field_definitions[$field_name])) {
          continue;
        }

        // Only add to entity_reference fields.
        $base_field_storage_definition = $base_field_definitions[$field_name]
          ->getFieldStorageDefinition();
        if ($base_field_storage_definition
          ->getType() !== 'entity_reference') {
          continue;
        }
        $settings = $base_field_storage_definition
          ->getSettings();
        $column_name = $table_mapping
          ->getFieldColumnName($base_field_storage_definition, $field_name);
        $data[$table_name][$column_name . '_verf'] = verf_get_filter($base_field_storage_definition
          ->getLabel(), $column_name, $table_name, $field_name, $entity_type
          ->id(), $settings['target_type']);
      }
    }
  }
}