EntityViewsData::getViewsData

public EntityViewsData::getViewsData()

Returns views data for the entity type.

Return value

array Views data in the format of hook_views_data().

Overrides EntityViewsDataInterface::getViewsData

File

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

Class

EntityViewsData
Provides generic views integration for entities.

Namespace

Drupal\views

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
public function getViewsData() {
  $data = [];
 
  $base_table = $this->entityType->getBaseTable() ? : $this->entityType->id();
  $views_revision_base_table = NULL;
  $revisionable = $this->entityType->isRevisionable();
  $base_field = $this->entityType->getKey('id');
 
  $revision_table = '';
  if ($revisionable) {
    $revision_table = $this->entityType->getRevisionTable() ? : $this->entityType->id() . '_revision';
  }
 
  $translatable = $this->entityType->isTranslatable();
  $data_table = '';
  if ($translatable) {
    $data_table = $this->entityType->getDataTable() ? : $this->entityType->id() . '_field_data';
  }
 
  // Some entity types do not have a revision data table defined, but still
  // have a revision table name set in
  // \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout() so we
  // apply the same kind of logic.
  $revision_data_table = '';
  if ($revisionable && $translatable) {
    $revision_data_table = $this->entityType->getRevisionDataTable() ? : $this->entityType->id() . '_field_revision';
  }
  $revision_field = $this->entityType->getKey('revision');
 
  // Setup base information of the views data.
  $data[$base_table]['table']['group'] = $this->entityType->getLabel();
  $data[$base_table]['table']['provider'] = $this->entityType->getProvider();
 
  $views_base_table = $base_table;
  if ($data_table) {
    $views_base_table = $data_table;
  }
  $data[$views_base_table]['table']['base'] = [
    'field' => $base_field,
    'title' => $this->entityType->getLabel(),
    'cache_contexts' => $this->entityType->getListCacheContexts(),
  ];
  $data[$base_table]['table']['entity revision'] = FALSE;
 
  if ($label_key = $this->entityType->getKey('label')) {
    if ($data_table) {
      $data[$views_base_table]['table']['base']['defaults'] = array(
        'field' => $label_key,
        'table' => $data_table,
      );
    }
    else {
      $data[$views_base_table]['table']['base']['defaults'] = array(
        'field' => $label_key,
      );
    }
  }
 
  // Entity types must implement a list_builder in order to use Views'
  // entity operations field.
  if ($this->entityType->hasListBuilderClass()) {
    $data[$base_table]['operations'] = array(
      'field' => array(
        'title' => $this->t('Operations links'),
        'help' => $this->t('Provides links to perform entity operations.'),
        'id' => 'entity_operations',
      ),
    );
  }
 
  if ($this->entityType->hasViewBuilderClass()) {
    $data[$base_table]['rendered_entity'] = [
      'field' => [
        'title' => $this->t('Rendered entity'),
        'help' => $this->t('Renders an entity in a view mode.'),
        'id' => 'rendered_entity',
      ],
    ];
  }
 
  // Setup relations to the revisions/property data.
  if ($data_table) {
    $data[$base_table]['table']['join'][$data_table] = [
      'left_field' => $base_field,
      'field' => $base_field,
      'type' => 'INNER'
    ];
    $data[$data_table]['table']['group'] = $this->entityType->getLabel();
    $data[$data_table]['table']['provider'] = $this->entityType->getProvider();
    $data[$data_table]['table']['entity revision'] = FALSE;
  }
  if ($revision_table) {
    $data[$revision_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
    $data[$revision_table]['table']['provider'] = $this->entityType->getProvider();
 
    $views_revision_base_table = $revision_table;
    if ($revision_data_table) {
      $views_revision_base_table = $revision_data_table;
    }
    $data[$views_revision_base_table]['table']['entity revision'] = TRUE;
    $data[$views_revision_base_table]['table']['base'] = array(
      'field' => $revision_field,
      'title' => $this->t('@entity_type revisions', array('@entity_type' => $this->entityType->getLabel())),
    );
    // Join the revision table to the base table.
    $data[$views_revision_base_table]['table']['join'][$views_base_table] = array(
      'left_field' => $revision_field,
      'field' => $revision_field,
      'type' => 'INNER',
    );
 
    if ($revision_data_table) {
      $data[$revision_data_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
      $data[$revision_data_table]['table']['entity revision'] = TRUE;
 
      $data[$revision_table]['table']['join'][$revision_data_table] = array(
        'left_field' => $revision_field,
        'field' => $revision_field,
        'type' => 'INNER',
      );
    }
  }
 
  $this->addEntityLinks($data[$base_table]);
 
  // Load all typed data definitions of all fields. This should cover each of
  // the entity base, revision, data tables.
  $field_definitions = $this->entityManager->getBaseFieldDefinitions($this->entityType->id());
  /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
  if ($table_mapping = $this->storage->getTableMapping($field_definitions)) {
    // Fetch all fields that can appear in both the base table and the data
    // table.
    $entity_keys = $this->entityType->getKeys();
    $duplicate_fields = array_intersect_key($entity_keys, array_flip(['id', 'revision', 'bundle']));
    // Iterate over each table we have so far and collect field data for each.
    // Based on whether the field is in the field_definitions provided by the
    // entity manager.
    // @todo We should better just rely on information coming from the entity
    //   storage.
    foreach ($table_mapping->getTableNames() as $table) {
      foreach ($table_mapping->getFieldNames($table) as $field_name) {
        // To avoid confusing duplication in the user interface, for fields
        // that are on both base and data tables, only add them on the data
        // table (same for revision vs. revision data).
        if ($data_table && ($table === $base_table || $table === $revision_table) && in_array($field_name, $duplicate_fields)) {
          continue;
        }
        $this->mapFieldDefinition($table, $field_name, $field_definitions[$field_name], $table_mapping, $data[$table]);
      }
    }
 
    foreach ($field_definitions as $field_definition) {
      if ($table_mapping->requiresDedicatedTableStorage($field_definition->getFieldStorageDefinition())) {
        $table = $table_mapping->getDedicatedDataTableName($field_definition->getFieldStorageDefinition());
 
        $data[$table]['table']['group'] = $this->entityType->getLabel();
        $data[$table]['table']['provider'] = $this->entityType->getProvider();
        $data[$table]['table']['join'][$views_base_table] = [
          'left_field' => $base_field,
          'field' => 'entity_id',
          'extra' => [
            ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE],
          ],
        ];
 
        if ($revisionable) {
          $revision_table = $table_mapping->getDedicatedRevisionTableName($field_definition->getFieldStorageDefinition());
 
          $data[$revision_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
          $data[$revision_table]['table']['provider'] = $this->entityType->getProvider();
          $data[$revision_table]['table']['join'][$views_revision_base_table] = [
            'left_field' => $revision_field,
            'field' => 'entity_id',
            'extra' => [
              ['field' => 'deleted', 'value' => 0, 'numeric' => TRUE],
            ],
          ];
        }
      }
    }
  }
 
  // Add the entity type key to each table generated.
  $entity_type_id = $this->entityType->id();
  array_walk($data, function(&$table_data) use ($entity_type_id) {
    $table_data['table']['entity type'] = $entity_type_id;
  });
 
  return $data;
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.