Version 1
[yaffs-website] / web / core / modules / field_ui / src / EntityDisplayModeListBuilder.php
diff --git a/web/core/modules/field_ui/src/EntityDisplayModeListBuilder.php b/web/core/modules/field_ui/src/EntityDisplayModeListBuilder.php
new file mode 100644 (file)
index 0000000..c9d8966
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+
+namespace Drupal\field_ui;
+
+use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Defines a class to build a listing of view mode entities.
+ *
+ * @see \Drupal\Core\Entity\Entity\EntityViewMode
+ */
+class EntityDisplayModeListBuilder extends ConfigEntityListBuilder {
+
+  /**
+   * All entity types.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeInterface[]
+   */
+  protected $entityTypes;
+
+  /**
+   * Constructs a new EntityDisplayModeListBuilder object.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type definition.
+   * @param \Drupal\Core\Entity\EntityStorageInterface $storage
+   *   The entity storage class.
+   * @param \Drupal\Core\Entity\EntityTypeInterface[] $entity_types
+   *   List of all entity types.
+   */
+  public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, array $entity_types) {
+    parent::__construct($entity_type, $storage);
+
+    $this->entityTypes = $entity_types;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+    $entity_manager = $container->get('entity.manager');
+    return new static(
+      $entity_type,
+      $entity_manager->getStorage($entity_type->id()),
+      $entity_manager->getDefinitions()
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader() {
+    $header['label'] = $this->t('Name');
+    return $header + parent::buildHeader();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity) {
+    $row['label'] = $entity->label();
+    return $row + parent::buildRow($entity);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function load() {
+    $entities = [];
+    foreach (parent::load() as $entity) {
+      $entities[$entity->getTargetType()][] = $entity;
+    }
+    return $entities;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render() {
+    $build = [];
+    foreach ($this->load() as $entity_type => $entities) {
+      if (!isset($this->entityTypes[$entity_type])) {
+        continue;
+      }
+
+      // Filter entities.
+      if (!$this->isValidEntity($entity_type)) {
+        continue;
+      }
+
+      $table = [
+        '#prefix' => '<h2>' . $this->entityTypes[$entity_type]->getLabel() . '</h2>',
+        '#type' => 'table',
+        '#header' => $this->buildHeader(),
+        '#rows' => [],
+      ];
+      foreach ($entities as $entity) {
+        if ($row = $this->buildRow($entity)) {
+          $table['#rows'][$entity->id()] = $row;
+        }
+      }
+
+      // Move content at the top.
+      if ($entity_type == 'node') {
+        $table['#weight'] = -10;
+      }
+
+      $short_type = str_replace(['entity_', '_mode'], '', $this->entityTypeId);
+      $table['#rows']['_add_new'][] = [
+        'data' => [
+          '#type' => 'link',
+          '#url' => Url::fromRoute($short_type == 'view' ? 'entity.entity_view_mode.add_form' : 'entity.entity_form_mode.add_form', ['entity_type_id' => $entity_type]),
+          '#title' => $this->t('Add new %label @entity-type', ['%label' => $this->entityTypes[$entity_type]->getLabel(), '@entity-type' => $this->entityType->getLowercaseLabel()]),
+        ],
+        'colspan' => count($table['#header']),
+      ];
+      $build[$entity_type] = $table;
+    }
+    return $build;
+  }
+
+  /**
+   * Filters entities based on their view builder handlers.
+   *
+   * @param $entity_type
+   *   The entity type of the entity that needs to be validated.
+   *
+   * @return bool
+   *   TRUE if the entity has the correct view builder handler, FALSE if the
+   *   entity doesn't have the correct view builder handler.
+   */
+  protected function isValidEntity($entity_type) {
+    return $this->entityTypes[$entity_type]->get('field_ui_base_route') && $this->entityTypes[$entity_type]->hasViewBuilderClass();
+  }
+
+}