You are here

function dynamic_entity_reference_views_data_alter in Dynamic Entity Reference 8.2

Implements hook_views_data_alter().

Changes dynamic_entity_reference base fields argument and filter to numeric.

File

./dynamic_entity_reference.views.inc, line 261
Provides views data for the dynamic_entity_reference module.

Code

function dynamic_entity_reference_views_data_alter(&$data) {
  $entity_manager = \Drupal::entityTypeManager();

  /** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
  list($entity_types, $sql_entity_types, $fields_all) = dynamic_entity_reference_get_all_base_fields();
  foreach ($fields_all as $entity_type_id => $fields) {
    $entity_type = $entity_types[$entity_type_id];
    $base_table = $entity_manager
      ->getHandler($entity_type_id, 'views_data')
      ->getViewsTableForEntityType($entity_type);

    /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
    foreach ($fields as $field) {
      $field_name = $field
        ->getName();

      // Unlimited (-1) or > 1 store field data in a dedicated table.
      $table = $field
        ->getCardinality() == 1 ? $base_table : $entity_type
        ->getBaseTable() . '__' . $field_name;

      // Filter out non SQL entity types because \Drupal\views\EntityViewsData
      // class only allows entities with
      // \Drupal\Core\Entity\Sql\SqlEntityStorageInterface.
      $targets = array_intersect(DynamicEntityReferenceItem::getTargetTypes($field
        ->getSettings()), array_keys($sql_entity_types));
      foreach ($targets as $target_entity_type_id) {
        $target_entity_id_is_int = DynamicEntityReferenceItem::entityHasIntegerId($target_entity_type_id);
        if ($target_entity_id_is_int) {
          $data[$table][$target_entity_type_id . '__' . $field_name]['argument']['id'] = 'numeric';
          $data[$table][$target_entity_type_id . '__' . $field_name]['filter']['id'] = 'numeric';
        }
      }
    }
  }
}