View source
<?php
namespace Drupal\entityqueue;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\entityqueue\Entity\EntitySubqueue;
use Symfony\Component\DependencyInjection\ContainerInterface;
class EntityQueueListBuilder extends ConfigEntityListBuilder {
protected $entityTypeManager;
protected $limit = FALSE;
public function __construct(EntityTypeInterface $entity_type, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($entity_type, $entity_type_manager
->getStorage($entity_type
->id()));
$this->entityTypeManager = $entity_type_manager;
}
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static($entity_type, $container
->get('entity_type.manager'));
}
public function load() {
$entities = [
'enabled' => [],
'disabled' => [],
];
foreach (parent::load() as $entity) {
if (!$entity
->access('update')) {
continue;
}
if ($entity
->status()) {
$entities['enabled'][] = $entity;
}
else {
$entities['disabled'][] = $entity;
}
}
return $entities;
}
public function buildHeader() {
$header['label'] = $this
->t('Queue name');
$header['target_type'] = $this
->t('Target type');
$header['handler'] = $this
->t('Queue type');
$header['items'] = $this
->t('Items');
return $header + parent::buildHeader();
}
public function buildRow(EntityInterface $entity) {
assert($entity instanceof EntityQueueInterface);
$row = [
'data' => [
'label' => $entity
->label(),
'target_type' => $this->entityTypeManager
->getDefinition($entity
->getTargetEntityTypeId())
->getLabel(),
'handler' => $entity
->getHandlerPlugin()
->getPluginDefinition()['title'],
'items' => $this
->getQueueItemsStatus($entity),
] + parent::buildRow($entity),
'title' => $this
->t('Machine name: @name', [
'@name' => $entity
->id(),
]),
];
return $row;
}
public function render() {
$entities = $this
->load();
$build['#type'] = 'container';
$build['#attributes']['id'] = 'entity-queue-list';
$build['#attached']['library'][] = 'core/drupal.ajax';
$build['#cache'] = [
'contexts' => Cache::mergeContexts($this->entityType
->getListCacheContexts(), [
'user.permissions',
]),
'tags' => $this->entityType
->getListCacheTags(),
];
$build['enabled']['heading']['#markup'] = '<h2>' . $this
->t('Enabled', [], [
'context' => 'Plural',
]) . '</h2>';
$build['disabled']['heading']['#markup'] = '<h2>' . $this
->t('Disabled', [], [
'context' => 'Plural',
]) . '</h2>';
foreach ([
'enabled',
'disabled',
] as $status) {
$build[$status]['#type'] = 'container';
$build[$status]['#attributes'] = [
'class' => [
'entity-queue-list-section',
$status,
],
];
$build[$status]['table'] = [
'#type' => 'table',
'#attributes' => [
'class' => [
'entity-queue-listing-table',
],
],
'#header' => $this
->buildHeader(),
'#rows' => [],
'#cache' => [
'contexts' => $this->entityType
->getListCacheContexts(),
'tags' => $this->entityType
->getListCacheTags(),
],
];
foreach ($entities[$status] as $entity) {
$build[$status]['table']['#rows'][$entity
->id()] = $this
->buildRow($entity);
}
}
$build['enabled']['table']['#empty'] = $this
->t('There are no enabled queues.');
$build['disabled']['table']['#empty'] = $this
->t('There are no disabled queues.');
return $build;
}
public function getDefaultOperations(EntityInterface $entity) {
assert($entity instanceof EntityQueueInterface);
$operations = parent::getDefaultOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = $this
->t('Configure');
}
foreach ([
'enable',
'disable',
] as $op) {
if (isset($operations[$op])) {
$operations[$op]['url'] = $entity
->toUrl($op);
$operations[$op]['attributes']['class'][] = 'use-ajax';
}
}
$operations += $entity
->getHandlerPlugin()
->getQueueListBuilderOperations();
return $operations;
}
protected function getQueueItemsStatus(EntityQueueInterface $queue) {
$handler = $queue
->getHandlerPlugin();
$items = NULL;
if ($handler
->supportsMultipleSubqueues()) {
$subqueues_count = $this->entityTypeManager
->getStorage('entity_subqueue')
->getQuery()
->condition('queue', $queue
->id(), '=')
->count()
->execute();
$items = $this
->formatPlural($subqueues_count, '@count subqueue', '@count subqueues');
}
else {
$subqueue = EntitySubqueue::load($queue
->id());
$items = $this
->formatPlural(count($subqueue->items), '@count item', '@count items');
}
return $items;
}
}