hn-8.x-1.x-dev/src/EntitiesWithViews.php
src/EntitiesWithViews.php
<?php namespace Drupal\hn; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\FieldableEntityInterface; /** * This class holds all referenced entities with their views. */ class EntitiesWithViews { /** * A list of entities with their view modes. * * @var EntityWithViews[] */ private $entities = []; /** * Adds an entity with view mode to the entity list. * * @param \Drupal\Core\Entity\EntityInterface $entity * The entity to add. * @param string $view_mode * The view mode this entity is loaded with. * * @return \Drupal\hn\EntityWithViews * Returns a holder of the entity with the view provided. */ public function addEntity(EntityInterface $entity, $view_mode = 'default') { if (!$entity instanceof FieldableEntityInterface) { return NULL; } if (!isset($this->entities[$entity->uuid()])) { $this->entities[$entity->uuid()] = new EntityWithViews($entity); } $entity_with_views = $this->entities[$entity->uuid()]; $entity_with_views->addViewMode($view_mode); return $entity_with_views; } /** * Returns all currently stored entities. * * @return \Drupal\Core\Entity\EntityInterface[] * All currently stored entities. */ public function getEntities() { $entities = []; foreach ($this->entities as $entity_with_views) { $entities[] = $entity_with_views->getEntity(); }; return $entities; } } /** * Holds a single entity and one or multiple views. */ class EntityWithViews { /** * The entity this class holds. * * @var \Drupal\Core\Entity\EntityInterface */ private $entity; /** * Holds all view modes as a key, and their displays as value. * * @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface[] */ private $viewModes = []; /** * EntityWithViews constructor. * * @param \Drupal\Core\Entity\EntityInterface $entity * The entity that this class holds. */ public function __construct(EntityInterface $entity) { $this->entity = $entity; } /** * Returns the entity. */ public function getEntity() { return $this->entity; } /** * Adds a view mode to this entity. * * @param string $view_mode * The view mode to add. */ public function addViewMode($view_mode) { if (!isset($this->viewModes[$view_mode])) { $entity_type = $this->entity->getEntityTypeId(); $bundle = $this->entity->bundle(); $display = \Drupal::entityTypeManager() ->getStorage('entity_view_display') ->load($entity_type . '.' . $bundle . '.' . $view_mode); if (!$display) { $values = [ 'targetEntityType' => $entity_type, 'bundle' => $bundle, 'mode' => $view_mode, 'status' => TRUE, ]; $display = \Drupal::entityTypeManager() ->getStorage('entity_view_display') ->create($values); } $this->viewModes[$view_mode] = $display; } } /** * Returns all view modes added to this entity. * * @return string[] * The view modes. */ public function getViewModes() { return array_keys($this->viewModes); } /** * Returns all hidden fields' names. * * @return string[] * All hidden fields. */ public function getHiddenFields() { $hidden = []; foreach ($this->viewModes as $display) { $hidden[] = array_keys($display->toArray()['hidden']); } if (count($hidden) === 1) { return $hidden[0]; } $hidden_fields = array_intersect(...$hidden); return $hidden_fields; } /** * Returns the display for a view mode. * * @param string $view_mode * A view mode for this entity. * * @return \Drupal\Core\Entity\Display\EntityViewDisplayInterface * The entity display. */ public function getDisplay($view_mode) { return $this->viewModes[$view_mode]; } }