You are here

protected function EntityViewsData::mapSingleFieldViewsData in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/views/src/EntityViewsData.php \Drupal\views\EntityViewsData::mapSingleFieldViewsData()
  2. 10 core/modules/views/src/EntityViewsData.php \Drupal\views\EntityViewsData::mapSingleFieldViewsData()

Provides the views data for a given data type and schema field.

Parameters

string $table: The table of the field to handle.

string $field_name: The machine name of the field being processed.

string $field_type: The type of field being handled.

string $column_name: For fields containing multiple columns, the column name being processed.

string $column_type: Within the field, the column type being handled.

bool $first: TRUE if this is the first column within the field.

\Drupal\Core\Field\FieldDefinitionInterface $field_definition: The field definition.

Return value

array The modified views data field definition.

1 call to EntityViewsData::mapSingleFieldViewsData()
EntityViewsData::mapFieldDefinition in core/modules/views/src/EntityViewsData.php
Puts the views data for a single field onto the views data.

File

core/modules/views/src/EntityViewsData.php, line 441

Class

EntityViewsData
Provides generic views integration for entities.

Namespace

Drupal\views

Code

protected function mapSingleFieldViewsData($table, $field_name, $field_type, $column_name, $column_type, $first, FieldDefinitionInterface $field_definition) {
  $views_field = [];

  // Provide a nicer, less verbose label for the first column within a field.
  // @todo Introduce concept of the "main" column for a field, rather than
  //   assuming the first one is the main column.
  if ($first) {
    $views_field['title'] = $field_definition
      ->getLabel();
  }
  else {
    $views_field['title'] = $field_definition
      ->getLabel() . " ({$column_name})";
  }
  if ($description = $field_definition
    ->getDescription()) {
    $views_field['help'] = $description;
  }

  // Set up the field, sort, argument, and filters, based on
  // the column and/or field data type.
  // @todo Allow field types to customize this.
  // @see https://www.drupal.org/node/2337515
  switch ($field_type) {

    // Special case a few field types.
    case 'timestamp':
    case 'created':
    case 'changed':
      $views_field['field']['id'] = 'field';
      $views_field['argument']['id'] = 'date';
      $views_field['filter']['id'] = 'date';
      $views_field['sort']['id'] = 'date';
      break;
    case 'language':
      $views_field['field']['id'] = 'field';
      $views_field['argument']['id'] = 'language';
      $views_field['filter']['id'] = 'language';
      $views_field['sort']['id'] = 'standard';
      break;
    case 'boolean':
      $views_field['field']['id'] = 'field';
      $views_field['argument']['id'] = 'numeric';
      $views_field['filter']['id'] = 'boolean';
      $views_field['sort']['id'] = 'standard';
      break;
    case 'uri':

      // Let's render URIs as URIs by default, not links.
      $views_field['field']['id'] = 'field';
      $views_field['field']['default_formatter'] = 'string';
      $views_field['argument']['id'] = 'string';
      $views_field['filter']['id'] = 'string';
      $views_field['sort']['id'] = 'standard';
      break;
    case 'text':
    case 'text_with_summary':

      // Treat these three long text fields the same.
      $field_type = 'text_long';

    // Intentional fall-through here to the default processing!
    default:

      // For most fields, the field type is generic enough to just use
      // the column type to determine the filters etc.
      switch ($column_type) {
        case 'int':
        case 'integer':
        case 'smallint':
        case 'tinyint':
        case 'mediumint':
        case 'float':
        case 'double':
        case 'decimal':
          $views_field['field']['id'] = 'field';
          $views_field['argument']['id'] = 'numeric';
          $views_field['filter']['id'] = 'numeric';
          $views_field['sort']['id'] = 'standard';
          break;
        case 'char':
        case 'string':
        case 'varchar':
        case 'varchar_ascii':
        case 'tinytext':
        case 'text':
        case 'mediumtext':
        case 'longtext':
          $views_field['field']['id'] = 'field';
          $views_field['argument']['id'] = 'string';
          $views_field['filter']['id'] = 'string';
          $views_field['sort']['id'] = 'standard';
          break;
        default:
          $views_field['field']['id'] = 'field';
          $views_field['argument']['id'] = 'standard';
          $views_field['filter']['id'] = 'standard';
          $views_field['sort']['id'] = 'standard';
      }
  }

  // Do post-processing for a few field types.
  $process_method = 'processViewsDataFor' . Container::camelize($field_type);
  if (method_exists($this, $process_method)) {
    $this
      ->{$process_method}($table, $field_definition, $views_field, $column_name);
  }
  return $views_field;
}