View source
<?php
namespace Drupal\extra_field\Plugin;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
class ExtraFieldDisplayManager extends DefaultPluginManager implements ExtraFieldDisplayManagerInterface {
protected $entityBundles;
protected $entityTypeManager;
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct('Plugin/ExtraField/Display', $namespaces, $module_handler, 'Drupal\\extra_field\\Plugin\\ExtraFieldDisplayInterface', 'Drupal\\extra_field\\Annotation\\ExtraFieldDisplay');
$this
->alterInfo('extra_field_display_info');
$this
->setCacheBackend($cache_backend, 'extra_field_display_plugins');
$this->entityTypeManager = $entity_type_manager;
}
public function fieldInfo() {
$info = [];
$definitions = $this
->getDefinitions();
foreach ($definitions as $key => $definition) {
$entityBundles = $this
->supportedEntityBundles($definition['bundles']);
foreach ($entityBundles as $entityBundle) {
$entityType = $entityBundle['entity'];
$bundle = $entityBundle['bundle'];
$fieldName = $this
->fieldName($key);
$info[$entityType][$bundle]['display'][$fieldName] = [
'label' => $definition['label'],
'weight' => $definition['weight'],
'visible' => $definition['visible'],
];
}
}
return $info;
}
public function entityView(array &$build, ContentEntityInterface $entity, EntityViewDisplayInterface $display, $viewMode) {
$definitions = $this
->getDefinitions();
$entityBundleKey = $this
->entityBundleKey($entity
->getEntityTypeId(), $entity
->bundle());
foreach ($definitions as $pluginId => $definition) {
if ($this
->matchEntityBundleKey($definition['bundles'], $entityBundleKey)) {
$factory = $this
->getFactory();
if ($display
->getComponent($this
->fieldName($pluginId))) {
$plugin = $factory
->createInstance($pluginId);
$fieldName = $this
->fieldName($pluginId);
$plugin
->setEntity($entity);
$plugin
->setEntityViewDisplay($display);
$plugin
->setViewMode($viewMode);
$elements = $plugin
->view($entity);
if (!empty($elements)) {
$build[$fieldName] = $elements;
}
}
}
}
}
protected function matchEntityBundleKey(array $pluginBundles, $entityBundleKey) {
$match = FALSE;
foreach ($pluginBundles as $pluginBundle) {
if (strpos($pluginBundle, '.*')) {
$match = explode('.', $pluginBundle)[0] == explode('.', $entityBundleKey)[0];
}
else {
$match = $pluginBundle == $entityBundleKey;
}
if ($match) {
break;
}
}
return $match;
}
protected function supportedEntityBundles(array $entityBundleKeys) {
$result = [];
foreach ($entityBundleKeys as $entityBundleKey) {
if (strpos($entityBundleKey, '.')) {
list($entityType, $bundle) = explode('.', $entityBundleKey);
if ($bundle == '*') {
foreach ($this
->allEntityBundles($entityType) as $bundle) {
$key = $this
->entityBundleKey($entityType, $bundle);
$result[$key] = [
'entity' => $entityType,
'bundle' => $bundle,
];
}
}
else {
$result[$entityBundleKey] = [
'entity' => $entityType,
'bundle' => $bundle,
];
}
}
}
return $result;
}
protected function allEntityBundles($entityType) {
if (!isset($this->entityBundles[$entityType])) {
$bundleType = $this->entityTypeManager
->getDefinition($entityType)
->getBundleEntityType();
if ($bundleType) {
$bundles = $this->entityTypeManager
->getStorage($bundleType)
->getQuery()
->execute();
}
else {
$bundles = [
$entityType => $entityType,
];
}
$this->entityBundles[$entityType] = $bundles;
}
return $this->entityBundles[$entityType];
}
protected function fieldName($pluginId) {
return 'extra_field_' . $pluginId;
}
protected function entityBundleKey($entityType, $bundle) {
return "{$entityType}.{$bundle}";
}
}