acquia_dam-1.0.0-rc1/src/BundleFieldViewsData.php
src/BundleFieldViewsData.php
<?php
namespace Drupal\acquia_dam;
use Drupal\acquia_dam\Entity\BundleFieldDefinition;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\views\EntityViewsData;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides Views data definitions for bundle fields.
*
* Drupal core only registers Field Config fields and not other bundle fields
* that have been programmatically added.
*
* @todo remove after #2898635
* @see https://www.drupal.org/project/drupal/issues/2898635
* @see https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/src/CommerceEntityViewsData.php
*/
class BundleFieldViewsData extends EntityViewsData {
/**
* The entity type bundle info.
*
* @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface
*/
private $entityTypeBundleInfo;
/**
* The table mapping.
*
* @var \Drupal\Core\Entity\Sql\TableMappingInterface
*/
private $tableMapping;
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
$instance = parent::createInstance($container, $entity_type);
$instance->entityTypeBundleInfo = $container->get('entity_type.bundle.info');
return $instance;
}
/**
* {@inheritdoc}
*/
public function getViewsData() {
$data = [];
$this->tableMapping = $this->storage->getTableMapping();
$entity_type_id = $this->entityType->id();
$bundles = $this->entityTypeBundleInfo->getBundleInfo($entity_type_id);
foreach (array_keys($bundles) as $bundle) {
$field_definitions = $this->entityFieldManager->getFieldDefinitions($entity_type_id, $bundle);
foreach ($field_definitions as $field_definition) {
if ($field_definition instanceof BundleFieldDefinition) {
$this->addBundleFieldData($data, $field_definition);
}
}
}
return $data;
}
/**
* Adds views data for the given bundle field.
*
* Based on views_field_default_views_data(), which is only invoked
* for configurable fields.
*
* Assumes that the bundle field is not shared between bundles, since
* the bundle plugin API doesn't support that.
*
* @param array $data
* The views data.
* @param \Drupal\acquia_dam\Entity\BundleFieldDefinition $bundle_field
* The bundle field.
*/
protected function addBundleFieldData(array &$data, BundleFieldDefinition $bundle_field) {
$this->tableMapping = $this->storage->getTableMapping();
$field_name = $bundle_field->getName();
$entity_type_id = $this->entityType->id();
$base_table = $this->getViewsTableForEntityType($this->entityType);
$field_tables = [];
$field_tables[EntityStorageInterface::FIELD_LOAD_CURRENT] = [
'table' => $this->tableMapping->getDedicatedDataTableName($bundle_field),
'alias' => "{$entity_type_id}__{$field_name}",
];
$table_alias = $field_tables[EntityStorageInterface::FIELD_LOAD_CURRENT]['alias'];
$data[$table_alias]['table']['group'] = $this->entityType->getLabel();
$data[$table_alias]['table']['join'][$base_table] = [
'table' => $this->tableMapping->getDedicatedDataTableName($bundle_field),
'left_field' => $this->entityType->getKey('id'),
'field' => 'entity_id',
'extra' => [
['field' => 'deleted', 'value' => 0, 'numeric' => TRUE],
],
];
foreach ($field_tables as $table_info) {
$table_alias = $table_info['alias'];
$data[$table_alias]['table']['title'] = $bundle_field->getLabel();
$data[$table_alias]['table']['help'] = $bundle_field->getDescription();
$data[$table_alias]['table']['entity type'] = $this->entityType->id();
$data[$table_alias]['table']['provider'] = $this->entityType->getProvider();
$this->mapFieldDefinition($table_info['table'], $field_name, $bundle_field, $this->tableMapping, $data[$table_alias]);
}
}
}
