Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
8.33% |
1 / 12 |
CRAP | |
9.62% |
5 / 52 |
| EntityListBuilder | |
0.00% |
0 / 1 |
|
15.38% |
2 / 13 |
346.63 | |
9.62% |
5 / 52 |
| createInstance | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| getStorage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| load | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getEntityIds | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
| getLabel | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
| getOperations | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| getDefaultOperations | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 12 |
|||
| buildHeader | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| buildRow | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| buildOperations | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| render | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 13 |
|||
| getTitle | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\Entity\EntityListBuilder. | |
| */ | |
| namespace Drupal\Core\Entity; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| /** | |
| * Defines a generic implementation to build a listing of entities. | |
| * | |
| * @ingroup entity_api | |
| */ | |
| class EntityListBuilder extends EntityHandlerBase implements EntityListBuilderInterface, EntityHandlerInterface { | |
| /** | |
| * The entity storage class. | |
| * | |
| * @var \Drupal\Core\Entity\EntityStorageInterface | |
| */ | |
| protected $storage; | |
| /** | |
| * The entity type ID. | |
| * | |
| * @var string | |
| */ | |
| protected $entityTypeId; | |
| /** | |
| * Information about the entity type. | |
| * | |
| * @var \Drupal\Core\Entity\EntityTypeInterface | |
| */ | |
| protected $entityType; | |
| /** | |
| * The number of entities to list per page, or FALSE to list all entities. | |
| * | |
| * For example, set this to FALSE if the list uses client-side filters that | |
| * require all entities to be listed (like the views overview). | |
| * | |
| * @var int|false | |
| */ | |
| protected $limit = 50; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { | |
| return new static( | |
| $entity_type, | |
| $container->get('entity.manager')->getStorage($entity_type->id()) | |
| ); | |
| } | |
| /** | |
| * Constructs a new EntityListBuilder object. | |
| * | |
| * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
| * The entity type definition. | |
| * @param \Drupal\Core\Entity\EntityStorageInterface $storage | |
| * The entity storage class. | |
| */ | |
| public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage) { | |
| $this->entityTypeId = $entity_type->id(); | |
| $this->storage = $storage; | |
| $this->entityType = $entity_type; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getStorage() { | |
| return $this->storage; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function load() { | |
| $entity_ids = $this->getEntityIds(); | |
| return $this->storage->loadMultiple($entity_ids); | |
| } | |
| /** | |
| * Loads entity IDs using a pager sorted by the entity id. | |
| * | |
| * @return array | |
| * An array of entity IDs. | |
| */ | |
| protected function getEntityIds() { | |
| $query = $this->getStorage()->getQuery() | |
| ->sort($this->entityType->getKey('id')); | |
| // Only add the pager if a limit is specified. | |
| if ($this->limit) { | |
| $query->pager($this->limit); | |
| } | |
| return $query->execute(); | |
| } | |
| /** | |
| * Gets the label of an entity. | |
| * | |
| * @param \Drupal\Core\Entity\EntityInterface $entity | |
| * The entity being listed. | |
| * | |
| * @return string | |
| * The entity label. | |
| * | |
| * @deprecated in Drupal 8.0.x, will be removed before Drupal 9.0.0 | |
| * Use $entity->label() instead. This method used to escape the entity | |
| * label. The render system's autoescape is now relied upon. | |
| */ | |
| protected function getLabel(EntityInterface $entity) { | |
| return $entity->label(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getOperations(EntityInterface $entity) { | |
| $operations = $this->getDefaultOperations($entity); | |
| $operations += $this->moduleHandler()->invokeAll('entity_operation', array($entity)); | |
| $this->moduleHandler->alter('entity_operation', $operations, $entity); | |
| uasort($operations, '\Drupal\Component\Utility\SortArray::sortByWeightElement'); | |
| return $operations; | |
| } | |
| /** | |
| * Gets this list's default operations. | |
| * | |
| * @param \Drupal\Core\Entity\EntityInterface $entity | |
| * The entity the operations are for. | |
| * | |
| * @return array | |
| * The array structure is identical to the return value of | |
| * self::getOperations(). | |
| */ | |
| protected function getDefaultOperations(EntityInterface $entity) { | |
| $operations = array(); | |
| if ($entity->access('update') && $entity->hasLinkTemplate('edit-form')) { | |
| $operations['edit'] = array( | |
| 'title' => $this->t('Edit'), | |
| 'weight' => 10, | |
| 'url' => $entity->urlInfo('edit-form'), | |
| ); | |
| } | |
| if ($entity->access('delete') && $entity->hasLinkTemplate('delete-form')) { | |
| $operations['delete'] = array( | |
| 'title' => $this->t('Delete'), | |
| 'weight' => 100, | |
| 'url' => $entity->urlInfo('delete-form'), | |
| ); | |
| } | |
| return $operations; | |
| } | |
| /** | |
| * Builds the header row for the entity listing. | |
| * | |
| * @return array | |
| * A render array structure of header strings. | |
| * | |
| * @see \Drupal\Core\Entity\EntityListBuilder::render() | |
| */ | |
| public function buildHeader() { | |
| $row['operations'] = $this->t('Operations'); | |
| return $row; | |
| } | |
| /** | |
| * Builds a row for an entity in the entity listing. | |
| * | |
| * @param \Drupal\Core\Entity\EntityInterface $entity | |
| * The entity for this row of the list. | |
| * | |
| * @return array | |
| * A render array structure of fields for this entity. | |
| * | |
| * @see \Drupal\Core\Entity\EntityListBuilder::render() | |
| */ | |
| public function buildRow(EntityInterface $entity) { | |
| $row['operations']['data'] = $this->buildOperations($entity); | |
| return $row; | |
| } | |
| /** | |
| * Builds a renderable list of operation links for the entity. | |
| * | |
| * @param \Drupal\Core\Entity\EntityInterface $entity | |
| * The entity on which the linked operations will be performed. | |
| * | |
| * @return array | |
| * A renderable array of operation links. | |
| * | |
| * @see \Drupal\Core\Entity\EntityListBuilder::buildRow() | |
| */ | |
| public function buildOperations(EntityInterface $entity) { | |
| $build = array( | |
| '#type' => 'operations', | |
| '#links' => $this->getOperations($entity), | |
| ); | |
| return $build; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| * | |
| * Builds the entity listing as renderable array for table.html.twig. | |
| * | |
| * @todo Add a link to add a new item to the #empty text. | |
| */ | |
| public function render() { | |
| $build['table'] = array( | |
| '#type' => 'table', | |
| '#header' => $this->buildHeader(), | |
| '#title' => $this->getTitle(), | |
| '#rows' => array(), | |
| '#empty' => $this->t('There is no @label yet.', array('@label' => $this->entityType->getLabel())), | |
| '#cache' => [ | |
| 'contexts' => $this->entityType->getListCacheContexts(), | |
| 'tags' => $this->entityType->getListCacheTags(), | |
| ], | |
| ); | |
| foreach ($this->load() as $entity) { | |
| if ($row = $this->buildRow($entity)) { | |
| $build['table']['#rows'][$entity->id()] = $row; | |
| } | |
| } | |
| // Only add the pager if a limit is specified. | |
| if ($this->limit) { | |
| $build['pager'] = array( | |
| '#type' => 'pager', | |
| ); | |
| } | |
| return $build; | |
| } | |
| /** | |
| * Gets the title of the page. | |
| * | |
| * @return string | |
| * A string title of the page. | |
| */ | |
| protected function getTitle() { | |
| return; | |
| } | |
| } |