Updated Drupal to 8.6. This goes with the following updates because it's possible...
[yaffs-website] / web / core / modules / user / src / UserListBuilder.php
1 <?php
2
3 namespace Drupal\user;
4
5 use Drupal\Core\Cache\CacheableMetadata;
6 use Drupal\Core\Datetime\DateFormatterInterface;
7 use Drupal\Core\Entity\EntityInterface;
8 use Drupal\Core\Entity\EntityListBuilder;
9 use Drupal\Core\Entity\EntityStorageInterface;
10 use Drupal\Core\Entity\EntityTypeInterface;
11 use Drupal\Core\Routing\RedirectDestinationInterface;
12 use Symfony\Component\DependencyInjection\ContainerInterface;
13
14 /**
15  * Defines a class to build a listing of user entities.
16  *
17  * @see \Drupal\user\Entity\User
18  */
19 class UserListBuilder extends EntityListBuilder {
20
21   /**
22    * The date formatter service.
23    *
24    * @var \Drupal\Core\Datetime\DateFormatterInterface
25    */
26   protected $dateFormatter;
27
28   /**
29    * The redirect destination service.
30    *
31    * @var \Drupal\Core\Routing\RedirectDestinationInterface
32    */
33   protected $redirectDestination;
34
35   /**
36    * Constructs a new UserListBuilder object.
37    *
38    * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
39    *   The entity type definition.
40    * @param \Drupal\Core\Entity\EntityStorageInterface $storage
41    *   The entity storage class.
42    * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
43    *   The date formatter service.
44    * @param \Drupal\Core\Routing\RedirectDestinationInterface $redirect_destination
45    *   The redirect destination service.
46    */
47   public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, DateFormatterInterface $date_formatter, RedirectDestinationInterface $redirect_destination) {
48     parent::__construct($entity_type, $storage);
49     $this->dateFormatter = $date_formatter;
50     $this->redirectDestination = $redirect_destination;
51   }
52
53   /**
54    * {@inheritdoc}
55    */
56   public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
57     return new static(
58       $entity_type,
59       $container->get('entity.manager')->getStorage($entity_type->id()),
60       $container->get('date.formatter'),
61       $container->get('redirect.destination')
62     );
63   }
64
65   /**
66    * {@inheritdoc}
67    */
68   public function load() {
69     $entity_query = $this->storage->getQuery();
70     $entity_query->condition('uid', 0, '<>');
71     $entity_query->pager(50);
72     $header = $this->buildHeader();
73     $entity_query->tableSort($header);
74     $uids = $entity_query->execute();
75     return $this->storage->loadMultiple($uids);
76   }
77
78   /**
79    * {@inheritdoc}
80    */
81   public function buildHeader() {
82     $header = [
83       'username' => [
84         'data' => $this->t('Username'),
85         'field' => 'name',
86         'specifier' => 'name',
87       ],
88       'status' => [
89         'data' => $this->t('Status'),
90         'field' => 'status',
91         'specifier' => 'status',
92         'class' => [RESPONSIVE_PRIORITY_LOW],
93       ],
94       'roles' => [
95         'data' => $this->t('Roles'),
96         'class' => [RESPONSIVE_PRIORITY_LOW],
97       ],
98       'member_for' => [
99         'data' => $this->t('Member for'),
100         'field' => 'created',
101         'specifier' => 'created',
102         'sort' => 'desc',
103         'class' => [RESPONSIVE_PRIORITY_LOW],
104       ],
105       'access' => [
106         'data' => $this->t('Last access'),
107         'field' => 'access',
108         'specifier' => 'access',
109         'class' => [RESPONSIVE_PRIORITY_LOW],
110       ],
111     ];
112     return $header + parent::buildHeader();
113   }
114
115   /**
116    * {@inheritdoc}
117    */
118   public function buildRow(EntityInterface $entity) {
119     $row['username']['data'] = [
120       '#theme' => 'username',
121       '#account' => $entity,
122     ];
123     $row['status'] = $entity->isActive() ? $this->t('active') : $this->t('blocked');
124
125     $roles = user_role_names(TRUE);
126     unset($roles[RoleInterface::AUTHENTICATED_ID]);
127     $users_roles = [];
128     foreach ($entity->getRoles() as $role) {
129       if (isset($roles[$role])) {
130         $users_roles[] = $roles[$role];
131       }
132     }
133     asort($users_roles);
134     $row['roles']['data'] = [
135       '#theme' => 'item_list',
136       '#items' => $users_roles,
137     ];
138     $options = [
139       'return_as_object' => TRUE,
140     ];
141     $row['member_for']['data'] = $this->dateFormatter->formatTimeDiffSince($entity->getCreatedTime(), $options)->toRenderable();
142     $last_access = $this->dateFormatter->formatTimeDiffSince($entity->getLastAccessedTime(), $options);
143
144     if ($entity->getLastAccessedTime()) {
145       $row['access']['data']['#markup'] = $last_access->getString();
146       CacheableMetadata::createFromObject($last_access)->applyTo($row['access']['data']);
147     }
148     else {
149       $row['access']['data']['#markup'] = t('never');
150     }
151     return $row + parent::buildRow($entity);
152   }
153
154   /**
155    * {@inheritdoc}
156    */
157   public function getOperations(EntityInterface $entity) {
158     $operations = parent::getOperations($entity);
159     if (isset($operations['edit'])) {
160       $destination = $this->redirectDestination->getAsArray();
161       $operations['edit']['query'] = $destination;
162     }
163     return $operations;
164   }
165
166   /**
167    * {@inheritdoc}
168    */
169   public function render() {
170     $build = parent::render();
171     $build['table']['#empty'] = $this->t('No people available.');
172     return $build;
173   }
174
175 }