Issue #1938884 by tim.plunkett, dawehner, Xano, Les Lim: Replace the fallback user listing with a list controller.

8.0.x
webchick 2013-11-23 13:04:57 -08:00
parent df1a669b77
commit b973ed27f6
4 changed files with 168 additions and 163 deletions

View File

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

View File

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

View File

@ -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",

View File

@ -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'