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; | |
} | |
} |