summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwebchick2013-11-23 21:04:57 (GMT)
committerwebchick2013-11-23 21:04:57 (GMT)
commitb973ed27f630fcf07cb3f9c1e93ce051912d2c44 (patch)
tree65db1628ddf10910aec622e5fb8f29a7e4862e68
parentdf1a669b77d93b2cfb45e3b56c248b260d9c918b (diff)
Issue #1938884 by tim.plunkett, dawehner, Xano, Les Lim: Replace the fallback user listing with a list controller.
-rw-r--r--core/modules/user/lib/Drupal/user/Controller/UserAdmin.php162
-rw-r--r--core/modules/user/lib/Drupal/user/Controller/UserListController.php166
-rw-r--r--core/modules/user/lib/Drupal/user/Entity/User.php1
-rw-r--r--core/modules/user/user.routing.yml2
4 files changed, 168 insertions, 163 deletions
diff --git a/core/modules/user/lib/Drupal/user/Controller/UserAdmin.php b/core/modules/user/lib/Drupal/user/Controller/UserAdmin.php
deleted file mode 100644
index c5da477..0000000
--- a/core/modules/user/lib/Drupal/user/Controller/UserAdmin.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\user\Controller\UserAdmin.
- */
-
-namespace Drupal\user\Controller;
-
-use Drupal\Core\Controller\ControllerBase;
-use Drupal\Core\Database\Connection;
-use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Entity\Query\QueryInterface;
-use Drupal\Core\Extension\ModuleHandlerInterface;
-use Drupal\user\UserStorageControllerInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Provides a user administrative listing.
- *
- * @todo Convert this to a entity list controller once table sort is supported.
- */
-class UserAdmin extends ControllerBase implements ContainerInjectionInterface {
-
- /**
- * The database connection.
- *
- * @var \Drupal\Core\Database\Connection
- */
- protected $connection;
-
- /**
- * The module handler.
- *
- * @var \Drupal\Core\Extension\ModuleHandlerInterface
- */
- protected $moduleHandler;
-
- /**
- * The user storage controller.
- *
- * @var \Drupal\user\UserStorageControllerInterface
- */
- protected $storageController;
-
- /**
- * The entity query.
- *
- * @var \Drupal\Core\Entity\Query\QueryInterface
- */
- protected $entityQuery;
-
- /**
- * Constructs a new UserAdmin object.
- *
- * @param \Drupal\Core\Database\Connection $connection
- * The database connection.
- * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
- * The module handler.
- * @param \Drupal\user\UserStorageControllerInterface $storage_controller
- * The user storage controller.
- * @param \Drupal\Core\Entity\Query\QueryInterface $entity_query
- * The entity query.
- */
- public function __construct(Connection $connection, ModuleHandlerInterface $module_handler, UserStorageControllerInterface $storage_controller, QueryInterface $entity_query) {
- $this->connection = $connection;
- $this->moduleHandler = $module_handler;
- $this->storageController = $storage_controller;
- $this->entityQuery = $entity_query;
- }
-
- /**
- * {@inheritdoc}
- */
- public static function create(ContainerInterface $container) {
- return new static(
- $container->get('database'),
- $container->get('module_handler'),
- $container->get('entity.manager')->getStorageController('user'),
- $container->get('entity.query')->get('user')
- );
- }
-
- /**
- * User administrative listing.
- *
- * @return array
- * A render array as expected by drupal_render().
- */
- public function userList() {
- $header = array(
- 'username' => array('data' => $this->t('Username'), 'field' => 'name', 'specifier' => 'name'),
- 'status' => array('data' => $this->t('Status'), 'field' => 'status', 'specifier' => 'status', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
- 'roles' => array('data' => $this->t('Roles'), 'class' => array(RESPONSIVE_PRIORITY_LOW)),
- 'member_for' => array('data' => $this->t('Member for'), 'field' => 'created', 'specifier' => 'created', 'sort' => 'desc', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
- 'access' => array('data' => $this->t('Last access'), 'field' => 'access', 'specifier' => 'access', 'class' => array(RESPONSIVE_PRIORITY_LOW)),
- 'operations' => $this->t('Operations'),
- );
-
- $this->entityQuery->condition('uid', 0, '<>');
- $this->entityQuery->pager(50);
- $this->entityQuery->tableSort($header);
- $uids = $this->entityQuery->execute();
- $accounts = $this->storageController->loadMultiple($uids);
-
- $destination = drupal_get_destination();
- $status = array($this->t('blocked'), $this->t('active'));
- $roles = array_map('\Drupal\Component\Utility\String::checkPlain', user_role_names(TRUE));
- unset($roles[DRUPAL_AUTHENTICATED_RID]);
- $options = array();
- foreach ($accounts as $account) {
- $users_roles = array();
- foreach ($account->getRoles() as $role) {
- if (isset($roles[$role])) {
- $users_roles[] = $roles[$role];
- }
- }
- asort($users_roles);
- $options[$account->id()]['username']['data'] = array(
- '#theme' => 'username',
- '#account' => $account,
- );
- $options[$account->id()]['status'] = $status[$account->isActive()];
- $options[$account->id()]['roles']['data'] = array(
- '#theme' => 'item_list',
- '#items' => $users_roles,
- );
- $options[$account->id()]['member_for'] = format_interval(REQUEST_TIME - $account->getCreatedTime());
- $options[$account->id()]['access'] = $account->access ? $this->t('@time ago', array('@time' => format_interval(REQUEST_TIME - $account->getLastAccessedTime()))) : t('never');
- $links = array();
- $links['edit'] = array(
- 'title' => $this->t('Edit'),
- 'href' => 'user/' . $account->id() . '/edit',
- 'query' => $destination,
- );
- if ($this->moduleHandler->invoke('content_translation', 'translate_access', array($account))) {
- $links['translate'] = array(
- 'title' => $this->t('Translate'),
- 'href' => 'user/' . $account->id() . '/translations',
- 'query' => $destination,
- );
- }
- $options[$account->id()]['operations']['data'] = array(
- '#type' => 'operations',
- '#links' => $links,
- );
- }
-
- $build['accounts'] = array(
- '#theme' => 'table',
- '#header' => $header,
- '#rows' => $options,
- '#empty' => $this->t('No people available.'),
- );
- $build['pager'] = array(
- '#theme' =>'pager',
- );
-
- return $build;
- }
-
-}
diff --git a/core/modules/user/lib/Drupal/user/Controller/UserListController.php b/core/modules/user/lib/Drupal/user/Controller/UserListController.php
new file mode 100644
index 0000000..7f8da1d
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/Controller/UserListController.php
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\user\Controller\UserListController.
+ */
+
+namespace Drupal\user\Controller;
+
+use Drupal\Core\Entity\EntityControllerInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityListController;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\Core\Entity\Query\QueryFactory;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Lists user entities.
+ *
+ * @see \Drupal\user\Entity\User
+ */
+class UserListController extends EntityListController implements EntityControllerInterface {
+
+ /**
+ * The entity query factory.
+ *
+ * @var \Drupal\Core\Entity\Query\QueryFactory
+ */
+ protected $queryFactory;
+
+ /**
+ * Constructs a new UserListController object.
+ *
+ * @param string $entity_type
+ * The type of entity to be listed.
+ * @param array $entity_info
+ * An array of entity info for the entity type.
+ * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage
+ * The entity storage controller class.
+ * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+ * The module handler to invoke hooks on.
+ * @param \Drupal\Core\Entity\Query\QueryFactory $query_factory
+ * The entity query factory.
+ */
+ public function __construct($entity_type, array $entity_info, EntityStorageControllerInterface $storage, ModuleHandlerInterface $module_handler, QueryFactory $query_factory) {
+ parent::__construct($entity_type, $entity_info, $storage, $module_handler);
+ $this->queryFactory = $query_factory;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) {
+ return new static(
+ $entity_type,
+ $entity_info,
+ $container->get('entity.manager')->getStorageController($entity_type),
+ $container->get('module_handler'),
+ $container->get('entity.query')
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function load() {
+ $entity_query = $this->queryFactory->get('user');
+ $entity_query->condition('uid', 0, '<>');
+ $entity_query->pager(50);
+ $header = $this->buildHeader();
+ $entity_query->tableSort($header);
+ $uids = $entity_query->execute();
+ return $this->storage->loadMultiple($uids);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildHeader() {
+ $header = array(
+ 'username' => array(
+ 'data' => $this->t('Username'),
+ 'field' => 'name',
+ 'specifier' => 'name',
+ ),
+ 'status' => array(
+ 'data' => $this->t('Status'),
+ 'field' => 'status',
+ 'specifier' => 'status',
+ 'class' => array(RESPONSIVE_PRIORITY_LOW),
+ ),
+ 'roles' => array(
+ 'data' => $this->t('Roles'),
+ 'class' => array(RESPONSIVE_PRIORITY_LOW),
+ ),
+ 'member_for' => array(
+ 'data' => $this->t('Member for'),
+ 'field' => 'created',
+ 'specifier' => 'created',
+ 'sort' => 'desc',
+ 'class' => array(RESPONSIVE_PRIORITY_LOW),
+ ),
+ 'access' => array(
+ 'data' => $this->t('Last access'),
+ 'field' => 'access',
+ 'specifier' => 'access',
+ 'class' => array(RESPONSIVE_PRIORITY_LOW),
+ ),
+ );
+ return $header + parent::buildHeader();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildRow(EntityInterface $entity) {
+ $row['username']['data'] = array(
+ '#theme' => 'username',
+ '#account' => $entity,
+ );
+ $row['status'] = $entity->isActive() ? $this->t('active') : $this->t('blocked');
+
+ $roles = array_map('\Drupal\Component\Utility\String::checkPlain', user_role_names(TRUE));
+ unset($roles[DRUPAL_AUTHENTICATED_RID]);
+ $users_roles = array();
+ foreach ($entity->getRoles() as $role) {
+ if (isset($roles[$role])) {
+ $users_roles[] = $roles[$role];
+ }
+ }
+ asort($users_roles);
+ $row['roles']['data'] = array(
+ '#theme' => 'item_list',
+ '#items' => $users_roles,
+ );
+ $row['member_for'] = format_interval(REQUEST_TIME - $entity->getCreatedTime());
+ $row['access'] = $entity->access ? $this->t('@time ago', array(
+ '@time' => format_interval(REQUEST_TIME - $entity->getLastAccessedTime()),
+ )) : t('never');
+ return $row + parent::buildRow($entity);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getOperations(EntityInterface $entity) {
+ $operations = parent::getOperations($entity);
+ if (isset($operations['edit'])) {
+ $destination = drupal_get_destination();
+ $operations['edit']['query'] = $destination;
+ }
+ return $operations;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function render() {
+ $build['accounts'] = parent::render();
+ $build['accounts']['#empty'] = $this->t('No people available.');
+ $build['pager']['#theme'] = 'pager';
+ return $build;
+ }
+
+}
diff --git a/core/modules/user/lib/Drupal/user/Entity/User.php b/core/modules/user/lib/Drupal/user/Entity/User.php
index c667d20..3d1815d 100644
--- a/core/modules/user/lib/Drupal/user/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Entity/User.php
@@ -21,6 +21,7 @@ use Drupal\user\UserInterface;
* controllers = {
* "storage" = "Drupal\user\UserStorageController",
* "access" = "Drupal\user\UserAccessController",
+ * "list" = "Drupal\user\Controller\UserListController",
* "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
* "form" = {
* "default" = "Drupal\user\ProfileFormController",
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index eeb8d3d..0a693e3 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -44,7 +44,7 @@ user.account_settings:
user.admin_account:
path: '/admin/people'
defaults:
- _controller: '\Drupal\user\Controller\UserAdmin::userList'
+ _entity_list: 'user'
requirements:
_permission: 'administer users'