summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwebchick2013-01-19 05:16:28 (GMT)
committer webchick2013-01-19 05:16:28 (GMT)
commit2ae1597227b962f5563944fdc30b17a18692a217 (patch)
treee9a149d5f52b73f2ca512ecfaf75b7783208842b
parentdd8c44b490bf1930812d016d31c1aec9d5aa93d3 (diff)
Issue #1479454 by Hugo Wetterberg, galooph, dawehner, andypost, marcingy, heyrocker, larowlan, alexpott, tim.plunkett, fubhy, sun: Change notice: Convert user roles to configurables.
-rw-r--r--core/modules/block/block.module4
-rw-r--r--core/modules/block/lib/Drupal/block/BlockBase.php2
-rw-r--r--core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php2
-rw-r--r--core/modules/filter/filter.admin.inc2
-rw-r--r--core/modules/filter/filter.module4
-rw-r--r--core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php2
-rw-r--r--core/modules/node/node.views.inc10
-rw-r--r--core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php27
-rw-r--r--core/modules/system/lib/Drupal/system/Tests/Upgrade/UserRoleUpgradePathTest.php15
-rw-r--r--core/modules/user/config/user.role.anonymous.yml3
-rw-r--r--core/modules/user/config/user.role.authenticated.yml3
-rw-r--r--core/modules/user/lib/Drupal/user/AccountFormController.php2
-rw-r--r--core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php60
-rw-r--r--core/modules/user/lib/Drupal/user/Plugin/views/access/Role.php2
-rw-r--r--core/modules/user/lib/Drupal/user/Plugin/views/argument/RolesRid.php11
-rw-r--r--core/modules/user/lib/Drupal/user/Plugin/views/argument_validator/User.php2
-rw-r--r--core/modules/user/lib/Drupal/user/Plugin/views/field/Roles.php19
-rw-r--r--core/modules/user/lib/Drupal/user/Plugin/views/filter/Roles.php2
-rw-r--r--core/modules/user/lib/Drupal/user/RoleStorageController.php69
-rw-r--r--core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php58
-rw-r--r--core/modules/user/lib/Drupal/user/Tests/Views/HandlerFieldRoleTest.php60
-rw-r--r--core/modules/user/lib/Drupal/user/UserStorageController.php4
-rw-r--r--core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml154
-rw-r--r--core/modules/user/user.admin.inc87
-rw-r--r--core/modules/user/user.api.php6
-rw-r--r--core/modules/user/user.install68
-rw-r--r--core/modules/user/user.module133
-rw-r--r--core/modules/user/user.views.inc16
-rw-r--r--core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php2
-rw-r--r--core/profiles/standard/config/user.role.administrator.yml3
-rw-r--r--core/profiles/standard/standard.install13
31 files changed, 565 insertions, 280 deletions
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index b6a5381..6bc94f2 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -586,8 +586,8 @@ function template_preprocess_block(&$variables) {
function block_user_role_delete($role) {
foreach (entity_load_multiple('block') as $block_id => $block) {
$visibility = $block->get('visibility');
- if (isset($visibility['roles']['roles'][$role->rid])) {
- unset($visibility['roles']['roles'][$role->rid]);
+ if (isset($visibility['roles']['roles'][$role->id()])) {
+ unset($visibility['roles']['roles'][$role->id()]);
$block->set('visibility', $visibility);
$block->save();
}
diff --git a/core/modules/block/lib/Drupal/block/BlockBase.php b/core/modules/block/lib/Drupal/block/BlockBase.php
index a0f003d..c9812b7 100644
--- a/core/modules/block/lib/Drupal/block/BlockBase.php
+++ b/core/modules/block/lib/Drupal/block/BlockBase.php
@@ -367,7 +367,7 @@ abstract class BlockBase extends PluginBase implements BlockInterface {
}
// Per-role visibility.
- $role_options = array_map('check_plain', user_roles());
+ $role_options = array_map('check_plain', user_role_names());
$form['visibility']['role'] = array(
'#type' => 'details',
'#title' => t('Roles'),
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
index d049aa3..91cab48 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
@@ -39,7 +39,7 @@ class CommentLinksTest extends CommentTestBase {
// Remove additional user permissions from $this->web_user added by setUp(),
// since this test is limited to anonymous and authenticated roles only.
- user_role_delete(key($this->web_user->roles));
+ entity_delete_multiple('user_role', array(key($this->web_user->roles)));
// Matrix of possible environmental conditions and configuration settings.
// See setEnvironment() for details.
diff --git a/core/modules/filter/filter.admin.inc b/core/modules/filter/filter.admin.inc
index 32a3668..4cc4a1f 100644
--- a/core/modules/filter/filter.admin.inc
+++ b/core/modules/filter/filter.admin.inc
@@ -169,7 +169,7 @@ function filter_admin_format_form($form, &$form_state, $format) {
$form['roles'] = array(
'#type' => 'checkboxes',
'#title' => t('Roles'),
- '#options' => array_map('check_plain', user_roles()),
+ '#options' => array_map('check_plain', user_role_names()),
'#disabled' => $is_fallback,
'#weight' => -10,
);
diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 3e57f30..3ff344c 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -398,11 +398,11 @@ function filter_formats_reset() {
function filter_get_roles_by_format($format) {
// Handle the fallback format upfront (all roles have access to this format).
if ($format->format == filter_fallback_format()) {
- return user_roles();
+ return user_role_names();
}
// Do not list any roles if the permission does not exist.
$permission = filter_permission_name($format);
- return !empty($permission) ? user_roles(FALSE, $permission) : array();
+ return !empty($permission) ? user_role_names(FALSE, $permission) : array();
}
/**
diff --git a/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php b/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php
index a71a9e9..48faf24 100644
--- a/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php
+++ b/core/modules/filter/lib/Drupal/filter/Tests/FilterFormatAccessTest.php
@@ -182,7 +182,7 @@ class FilterFormatAccessTest extends WebTestBase {
$this->assertFalse(in_array($this->disallowed_format->format, array_keys(filter_get_formats_by_role($rid))), 'A text format which a role does not have access to does not appear in the list of formats available to that role.');
// Check that the fallback format is always allowed.
- $this->assertEqual(filter_get_roles_by_format(filter_format_load(filter_fallback_format())), user_roles(), 'All roles have access to the fallback format.');
+ $this->assertEqual(filter_get_roles_by_format(filter_format_load(filter_fallback_format())), user_role_names(), 'All roles have access to the fallback format.');
$this->assertTrue(in_array(filter_fallback_format(), array_keys(filter_get_formats_by_role($rid))), 'The fallback format appears in the list of allowed formats for any role.');
}
diff --git a/core/modules/node/node.views.inc b/core/modules/node/node.views.inc
index 8f8d75f..aa199e7 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -691,11 +691,9 @@ function node_views_analyze(ViewExecutable $view) {
// check for no access control
$access = $display->getOption('access');
if (empty($access['type']) || $access['type'] == 'none') {
- $select = db_select('role', 'r');
- $select->innerJoin('role_permission', 'p', 'r.rid = p.rid');
- $result = $select->fields('r', array('rid'))
- ->fields('p', array('permission'))
- ->condition('r.rid', array('anonymous', 'authenticated'), 'IN')
+ $result = db_select('role_permission', 'p')
+ ->fields('p', array('rid', 'permission'))
+ ->condition('p.rid', array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID), 'IN')
->condition('p.permission', 'access content')
->execute();
@@ -703,7 +701,7 @@ function node_views_analyze(ViewExecutable $view) {
$role->safe = TRUE;
$roles[$role->rid] = $role;
}
- if (!($roles['anonymous']->safe && $roles['authenticated']->safe)) {
+ if (!($roles[DRUPAL_ANONYMOUS_RID]->safe && $roles[DRUPAL_AUTHENTICATED_RID]->safe)) {
$ret[] = Analyzer::formatMessage(t('Some roles lack permission to access content, but display %display has no access control.', array('%display' => $display->display['display_title'])), 'warning');
}
$filters = $display->getOption('filters');
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
index 0afbcd3..92c6ae5 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
@@ -509,11 +509,14 @@ abstract class WebTestBase extends TestBase {
* (optional) The role ID (machine name). Defaults to a random name.
* @param string $name
* (optional) The label for the role. Defaults to a random string.
+ * @param integer $weight
+ * (optional) The weight for the role. Defaults NULL so that entity_create()
+ * sets the weight to maximum + 1.
*
* @return string
* Role ID of newly created role, or FALSE if role creation failed.
*/
- protected function drupalCreateRole(array $permissions, $rid = NULL, $name = NULL) {
+ protected function drupalCreateRole(array $permissions, $rid = NULL, $name = NULL, $weight = NULL) {
// Generate a random, lowercase machine name if none was passed.
if (!isset($rid)) {
$rid = strtolower($this->randomName(8));
@@ -529,22 +532,26 @@ abstract class WebTestBase extends TestBase {
}
// Create new role.
- $role = new stdClass();
- $role->rid = $rid;
- $role->name = $name;
- $result = user_role_save($role);
+ $role = entity_create('user_role', array(
+ 'id' => $rid,
+ 'label' => $name,
+ ));
+ if (!is_null($weight)) {
+ $role->set('weight', $weight);
+ }
+ $result = $role->save();
$this->assertIdentical($result, SAVED_NEW, t('Created role ID @rid with name @name.', array(
- '@name' => var_export($role->name, TRUE),
- '@rid' => var_export($role->rid, TRUE),
+ '@name' => var_export($role->label(), TRUE),
+ '@rid' => var_export($role->id(), TRUE),
)), t('Role'));
if ($result === SAVED_NEW) {
// Grant the specified permissions to the role, if any.
if (!empty($permissions)) {
- user_role_grant_permissions($role->rid, $permissions);
+ user_role_grant_permissions($role->id(), $permissions);
- $assigned_permissions = db_query('SELECT permission FROM {role_permission} WHERE rid = :rid', array(':rid' => $role->rid))->fetchCol();
+ $assigned_permissions = db_query('SELECT permission FROM {role_permission} WHERE rid = :rid', array(':rid' => $role->id()))->fetchCol();
$missing_permissions = array_diff($permissions, $assigned_permissions);
if (!$missing_permissions) {
$this->pass(t('Created permissions: @perms', array('@perms' => implode(', ', $permissions))), t('Role'));
@@ -553,7 +560,7 @@ abstract class WebTestBase extends TestBase {
$this->fail(t('Failed to create permissions: @perms', array('@perms' => implode(', ', $missing_permissions))), t('Role'));
}
}
- return $role->rid;
+ return $role->id();
}
else {
return FALSE;
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserRoleUpgradePathTest.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserRoleUpgradePathTest.php
index f87c19f..670420a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserRoleUpgradePathTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UserRoleUpgradePathTest.php
@@ -73,4 +73,19 @@ class UserRoleUpgradePathTest extends UpgradePathTestBase {
$this->drupalGet('admin/config/people/accounts');
$this->assertFieldByName('user_admin_role', 3);
}
+
+ /**
+ * Tests that roles were converted to config.
+ */
+ public function testRoleUpgradeToConfig() {
+ $this->assertTrue($this->performUpgrade(), 'The upgrade was completed successfully.');
+
+ // Check that the 'anonymous' role has been converted to config.
+ $anonymous = entity_load('user_role', DRUPAL_ANONYMOUS_RID);
+ $this->assertNotEqual(FALSE, $anonymous, "The 'anonymous' role has been converted to config.");
+
+ // Check that the 'authenticated' role has been converted to config.
+ $authenticated = entity_load('user_role', DRUPAL_AUTHENTICATED_RID);
+ $this->assertNotEqual(FALSE, $authenticated, "The 'authenticated' role has been converted to config.");
+ }
}
diff --git a/core/modules/user/config/user.role.anonymous.yml b/core/modules/user/config/user.role.anonymous.yml
new file mode 100644
index 0000000..11defb0
--- /dev/null
+++ b/core/modules/user/config/user.role.anonymous.yml
@@ -0,0 +1,3 @@
+id: anonymous
+label: Anonymous user
+weight: 0
diff --git a/core/modules/user/config/user.role.authenticated.yml b/core/modules/user/config/user.role.authenticated.yml
new file mode 100644
index 0000000..dc4b65d
--- /dev/null
+++ b/core/modules/user/config/user.role.authenticated.yml
@@ -0,0 +1,3 @@
+id: authenticated
+label: Authenticated user
+weight: 1
diff --git a/core/modules/user/lib/Drupal/user/AccountFormController.php b/core/modules/user/lib/Drupal/user/AccountFormController.php
index 7a1001d..8f2f0c5 100644
--- a/core/modules/user/lib/Drupal/user/AccountFormController.php
+++ b/core/modules/user/lib/Drupal/user/AccountFormController.php
@@ -129,7 +129,7 @@ abstract class AccountFormController extends EntityFormController {
'#access' => $admin,
);
- $roles = array_map('check_plain', user_roles(TRUE));
+ $roles = array_map('check_plain', user_role_names(TRUE));
// The disabled checkbox subelement for the 'authenticated user' role
// must be generated separately and added to the checkboxes element,
// because of a limitation in Form API not supporting a single disabled
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php
new file mode 100644
index 0000000..de17dc9
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/Role.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\user\Plugin\Core\Entity\Role.
+ */
+
+namespace Drupal\user\Plugin\Core\Entity;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+
+/**
+ * Defines the user role entity class.
+ *
+ * @Plugin(
+ * id = "user_role",
+ * label = @Translation("Role"),
+ * module = "user",
+ * controller_class = "Drupal\user\RoleStorageController",
+ * config_prefix = "user.role",
+ * entity_keys = {
+ * "id" = "id",
+ * "uuid" = "uuid",
+ * "label" = "label"
+ * }
+ * )
+ */
+class Role extends ConfigEntityBase {
+
+ /**
+ * The machine name of this role.
+ *
+ * @var string
+ */
+ public $id;
+
+ /**
+ * The UUID of this role.
+ *
+ * @var string
+ */
+ public $uuid;
+
+ /**
+ * The human-readable label of this role.
+ *
+ * @var string
+ */
+ public $label;
+
+ /**
+ * The weight of this role in administrative listings.
+ *
+ * @var int
+ */
+ public $weight;
+
+}
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/access/Role.php b/core/modules/user/lib/Drupal/user/Plugin/views/access/Role.php
index 2a07d79..146968a 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/access/Role.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/access/Role.php
@@ -46,7 +46,7 @@ class Role extends AccessPluginBase {
return t('Multiple roles');
}
else {
- $rids = user_roles();
+ $rids = user_role_names();
$rid = reset($this->options['role']);
return check_plain($rids[$rid]);
}
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/argument/RolesRid.php b/core/modules/user/lib/Drupal/user/Plugin/views/argument/RolesRid.php
index 634307e..da3bd92 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/argument/RolesRid.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/argument/RolesRid.php
@@ -23,16 +23,7 @@ use Drupal\views\Plugin\views\argument\ManyToOne;
class RolesRid extends ManyToOne {
function title_query() {
- $titles = array();
-
- $query = db_select('role', 'r');
- $query->addField('r', 'name');
- $query->condition('r.rid', $this->value);
- $result = $query->execute();
- foreach ($result as $term) {
- $titles[] = check_plain($term->name);
- }
- return $titles;
+ return array(entity_load('user_role', $this->value)->label());
}
}
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/argument_validator/User.php b/core/modules/user/lib/Drupal/user/Plugin/views/argument_validator/User.php
index a31b0af..36a6a5a 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/argument_validator/User.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/argument_validator/User.php
@@ -56,7 +56,7 @@ class User extends ArgumentValidatorPluginBase {
$form['roles'] = array(
'#type' => 'checkboxes',
'#title' => t('Restrict to the selected roles'),
- '#options' => array_map('check_plain', user_roles(TRUE)),
+ '#options' => array_map('check_plain', user_role_names(TRUE)),
'#default_value' => $this->options['roles'],
'#description' => t('If no roles are selected, users from any role will be allowed.'),
'#states' => array(
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/field/Roles.php b/core/modules/user/lib/Drupal/user/Plugin/views/field/Roles.php
index c4eb050..0c4b72f 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/field/Roles.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/field/Roles.php
@@ -47,17 +47,26 @@ class Roles extends PrerenderList {
}
if ($uids) {
- $query = db_select('role', 'r');
- $query->join('users_roles', 'u', 'u.rid = r.rid');
- $query->addField('r', 'name');
+ $roles = user_roles();
+ $query = db_select('users_roles', 'u');
$query->fields('u', array('uid', 'rid'));
+ $query->condition('u.rid', array_keys($roles));
$query->condition('u.uid', $uids);
- $query->orderBy('r.name');
+
$result = $query->execute();
foreach ($result as $role) {
- $this->items[$role->uid][$role->rid]['role'] = check_plain($role->name);
+ $this->items[$role->uid][$role->rid]['role'] = check_plain($roles[$role->rid]->label());
$this->items[$role->uid][$role->rid]['rid'] = $role->rid;
}
+ // Sort the roles for each user by role weight.
+ $ordered_roles = array_flip(array_keys($roles));
+ foreach ($this->items as &$user_roles) {
+ // Create an array of rids that the user has in the role weight order.
+ $sorted_keys = array_intersect_key($ordered_roles, $user_roles);
+ // Merge with the unsorted array of role information which has the
+ // effect of sorting it.
+ $user_roles = array_merge($sorted_keys, $user_roles);
+ }
}
}
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/filter/Roles.php b/core/modules/user/lib/Drupal/user/Plugin/views/filter/Roles.php
index 8ee3569..139856e 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/filter/Roles.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/filter/Roles.php
@@ -23,7 +23,7 @@ use Drupal\views\Plugin\views\filter\ManyToOne;
class Roles extends ManyToOne {
function get_value_options() {
- $this->value_options = user_roles(TRUE);
+ $this->value_options = user_role_names(TRUE);
unset($this->value_options[DRUPAL_AUTHENTICATED_RID]);
}
diff --git a/core/modules/user/lib/Drupal/user/RoleStorageController.php b/core/modules/user/lib/Drupal/user/RoleStorageController.php
new file mode 100644
index 0000000..f5f6575
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/RoleStorageController.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\user\RoleStorageController.
+ */
+
+namespace Drupal\user;
+
+use Drupal\Core\Config\Entity\ConfigStorageController;
+use Drupal\Core\Entity\EntityInterface;
+
+/**
+ * Controller class for user roles.
+ */
+class RoleStorageController extends ConfigStorageController {
+
+ /**
+ * Overrides ConfigStorageController::preSave().
+ */
+ public function preSave(EntityInterface $entity) {
+ if (!isset($entity->weight) && $roles = entity_load_multiple('user_role')) {
+ // Set a role weight to make this new role last.
+ $max = array_reduce($roles, function($max, $entity) {
+ return $max > $entity->weight ? $max : $entity->weight;
+ });
+ $entity->weight = $max + 1;
+ }
+ parent::preSave($entity);
+ }
+
+ /**
+ * Overrides ConfigStorageController::resetCache().
+ */
+ public function resetCache(array $ids = NULL) {
+ parent::resetCache($ids);
+
+ // Clear the user access cache.
+ drupal_static_reset('user_access');
+ drupal_static_reset('user_role_permissions');
+ }
+
+ /**
+ * Overrides ConfigStorageController::postDelete().
+ */
+ protected function postDelete($entities) {
+ $rids = array_keys($entities);
+
+ // Delete permission assignments.
+ db_delete('role_permission')
+ ->condition('rid', $rids)
+ ->execute();
+ // Remove the role from all users.
+ db_delete('users_roles')
+ ->condition('rid', $rids)
+ ->execute();
+ }
+
+ /**
+ * Overrides ConfigStorageController::attachLoad().
+ */
+ protected function attachLoad(&$queried_entities, $revision_id = FALSE) {
+ // Sort the queried roles by their weight.
+ uasort($queried_entities, 'Drupal\Core\Config\Entity\ConfigEntityBase::sort');
+
+ parent::attachLoad($queried_entities, $revision_id);
+ }
+
+}
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php
index 50d4da7..d322a64 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserRoleAdminTest.php
@@ -37,10 +37,10 @@ class UserRoleAdminTest extends WebTestBase {
// correspond to an integer, to test that the role administration pages
// correctly distinguish between role names and IDs.)
$role_name = '123';
- $edit = array('role[name]' => $role_name, 'role[rid]' => $role_name);
+ $edit = array('role[label]' => $role_name, 'role[id]' => $role_name);
$this->drupalPost('admin/people/roles', $edit, t('Add role'));
$this->assertText(t('The role has been added.'), 'The role has been added.');
- $role = user_role_load($role_name);
+ $role = entity_load('user_role', $role_name);
$this->assertTrue(is_object($role), 'The role was successfully retrieved from the database.');
// Try adding a duplicate role.
@@ -50,18 +50,18 @@ class UserRoleAdminTest extends WebTestBase {
// Test renaming a role.
$old_name = $role_name;
$role_name = '456';
- $edit = array('role[name]' => $role_name);
- $this->drupalPost("admin/people/roles/edit/{$role->rid}", $edit, t('Save role'));
+ $edit = array('role[label]' => $role_name);
+ $this->drupalPost("admin/people/roles/edit/{$role->id()}", $edit, t('Save role'));
$this->assertText(t('The role has been renamed.'), 'The role has been renamed.');
- $new_role = user_role_load($old_name);
- $this->assertEqual($new_role->name, $role_name, 'The role name has been successfully changed.');
+ $new_role = entity_load('user_role', $old_name);
+ $this->assertEqual($new_role->label(), $role_name, 'The role name has been successfully changed.');
// Test deleting a role.
- $this->drupalPost("admin/people/roles/edit/{$role->rid}", NULL, t('Delete role'));
+ $this->drupalPost("admin/people/roles/edit/{$role->id()}", NULL, t('Delete role'));
$this->drupalPost(NULL, NULL, t('Delete'));
$this->assertText(t('The role has been deleted.'), 'The role has been deleted');
- $this->assertNoLinkByHref("admin/people/roles/edit/{$role->rid}", 'Role edit link removed.');
- $this->assertFalse(user_role_load($role_name), 'A deleted role can no longer be loaded.');
+ $this->assertNoLinkByHref("admin/people/roles/edit/{$role->id()}", 'Role edit link removed.');
+ $this->assertFalse(entity_load('user_role', $role_name), 'A deleted role can no longer be loaded.');
// Make sure that the system-defined roles can be edited via the user
// interface.
@@ -74,24 +74,36 @@ class UserRoleAdminTest extends WebTestBase {
}
/**
- * Test user role weight change operation.
+ * Test user role weight change operation and ordering.
*/
- function testRoleWeightChange() {
+ function testRoleWeightOrdering() {
$this->drupalLogin($this->admin_user);
-
- // Pick up a random role and get its weight.
- $rid = array_rand(user_roles());
- $role = user_role_load($rid);
- $old_weight = $role->weight;
-
- // Change the role weight and submit the form.
- $edit = array('roles['. $rid .'][weight]' => $old_weight + 1);
+ $roles = user_roles();
+ $weight = count($roles);
+ $new_role_weights = array();
+ $saved_rids = array();
+
+ // Change the role weights to make the roles in reverse order.
+ $edit = array();
+ foreach ($roles as $role) {
+ $edit['roles['. $role->id() .'][weight]'] = $weight;
+ $new_role_weights[$role->id()] = $weight;
+ $saved_rids[] = $role->id;
+ $weight--;
+ }
$this->drupalPost('admin/people/roles', $edit, t('Save order'));
$this->assertText(t('The role settings have been updated.'), 'The role settings form submitted successfully.');
- // Retrieve the saved role and compare its weight.
- $role = user_role_load($rid);
- $new_weight = $role->weight;
- $this->assertTrue(($old_weight + 1) == $new_weight, 'Role weight updated successfully.');
+ // Load up the user roles with the new weights.
+ drupal_static_reset('user_roles');
+ $roles = user_roles();
+ $rids = array();
+ // Test that the role weights have been correctly saved.
+ foreach ($roles as $role) {
+ $this->assertEqual($role->weight, $new_role_weights[$role->id()]);
+ $rids[] = $role->id;
+ }
+ // The order of the roles should be reversed.
+ $this->assertIdentical($rids, array_reverse($saved_rids));
}
}
diff --git a/core/modules/user/lib/Drupal/user/Tests/Views/HandlerFieldRoleTest.php b/core/modules/user/lib/Drupal/user/Tests/Views/HandlerFieldRoleTest.php
new file mode 100644
index 0000000..f85d7fa
--- /dev/null
+++ b/core/modules/user/lib/Drupal/user/Tests/Views/HandlerFieldRoleTest.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\user\Tests\Views\HandlerFieldRoleTest.
+ */
+
+namespace Drupal\user\Tests\Views;
+
+/**
+ * Tests the role field handler.
+ *
+ * @see views_handler_field_user_name
+ */
+class HandlerFieldRoleTest extends UserTestBase {
+
+ /**
+ * Views used by this test.
+ *
+ * @var array
+ */
+ public static $testViews = array('test_views_handler_field_role');
+
+ public static function getInfo() {
+ return array(
+ 'name' => 'User: Role Field',
+ 'description' => 'Tests the handler of the user: role field.',
+ 'group' => 'Views Modules',
+ );
+ }
+
+ public function testRole() {
+ // Create a couple of roles for the view.
+ $rolename_a = 'a' . $this->randomName(8);
+ $rid_a = $this->drupalCreateRole(array('access content'), $rolename_a, $rolename_a, 9);
+
+ $rolename_b = 'b' . $this->randomName(8);
+ $rid_b = $this->drupalCreateRole(array('access content'), $rolename_b, $rolename_b, 8);
+
+ $rolename_not_assigned = $this->randomName(8);
+ $this->drupalCreateRole(array('access content'), $rolename_not_assigned, $rolename_not_assigned);
+
+ // Add roles to user 1.
+ $user = user_load(1);
+ $user->roles[$rid_a] = $rolename_a;
+ $user->roles[$rid_b] = $rolename_b;
+ $user->save();
+
+ $view = views_get_view('test_views_handler_field_role');
+ $this->executeView($view);
+ $view->row_index = 0;
+ // The role field is populated during pre_render.
+ $view->field['rid']->pre_render($view->result);
+ $render = $view->field['rid']->advanced_render($view->result[0]);
+
+ $this->assertEqual($rolename_b . $rolename_a, $render, 'View test_views_handler_field_role renders role assigned to user in the correct order.');
+ $this->assertFalse(strpos($render, $rolename_not_assigned), 'View test_views_handler_field_role does not render a role not assigned to a user.');
+ }
+
+}
diff --git a/core/modules/user/lib/Drupal/user/UserStorageController.php b/core/modules/user/lib/Drupal/user/UserStorageController.php
index 5d7b634..3d8e981 100644
--- a/core/modules/user/lib/Drupal/user/UserStorageController.php
+++ b/core/modules/user/lib/Drupal/user/UserStorageController.php
@@ -34,9 +34,9 @@ class UserStorageController extends DatabaseStorageController {
}
// Add any additional roles from the database.
- $result = db_query('SELECT r.rid, r.name, ur.uid FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid IN (:uids)', array(':uids' => array_keys($queried_users)));
+ $result = db_query('SELECT rid, uid FROM {users_roles} WHERE uid IN (:uids)', array(':uids' => array_keys($queried_users)));
foreach ($result as $record) {
- $queried_users[$record->uid]->roles[$record->rid] = $record->name;
+ $queried_users[$record->uid]->roles[$record->rid] = $record->rid;
}
// Call the default attachLoad() method. This will add fields and call
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml
new file mode 100644
index 0000000..8cb9b7a
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml
@@ -0,0 +1,154 @@
+api_version: '3.0'
+base_field: uid
+base_table: users
+core: 8.x
+description: ''
+disabled: '0'
+display:
+ default:
+ display_plugin: default
+ id: default
+ display_title: Master
+ position: ''
+ display_options:
+ access:
+ type: perm
+ perm: 'access user profiles'
+ cache:
+ type: none
+ query:
+ type: views_query
+ exposed_form:
+ type: basic
+ pager:
+ type: none
+ options:
+ items_per_page: ''
+ style:
+ type: default
+ row:
+ type: fields
+ fields:
+ name:
+ id: name
+ table: users
+ field: name
+ relationship: none
+ group_type: group
+ admin_label: ''
+ label: Name
+ exclude: '0'
+ alter:
+ alter_text: '0'
+ text: ''
+ make_link: '0'
+ path: ''
+ absolute: '0'
+ external: '0'
+ replace_spaces: '0'
+ path_case: none
+ trim_whitespace: '0'
+ alt: ''
+ rel: ''
+ link_class: ''
+ prefix: ''
+ suffix: ''
+ target: ''
+ nl2br: '0'
+ max_length: ''
+ word_boundary: '1'
+ ellipsis: '1'
+ more_link: '0'
+ more_link_text: ''
+ more_link_path: ''
+ strip_tags: '0'
+ trim: '0'
+ preserve_tags: ''
+ html: '0'
+ element_type: ''
+ element_class: ''
+ element_label_type: ''
+ element_label_class: ''
+ element_label_colon: '1'
+ element_wrapper_type: ''
+ element_wrapper_class: ''
+ element_default_classes: '1'
+ empty: ''
+ hide_empty: '0'
+ empty_zero: '0'
+ hide_alter_empty: '1'
+ link_to_user: '1'
+ overwrite_anonymous: '0'
+ anonymous_text: ''
+ format_username: '1'
+ rid:
+ id: rid
+ table: users_roles
+ field: rid
+ relationship: none
+ group_type: group
+ admin_label: ''
+ label: Roles
+ exclude: '0'
+ alter:
+ alter_text: '0'
+ text: ''
+ make_link: '0'
+ path: ''
+ absolute: '0'
+ external: '0'
+ replace_spaces: '0'
+ path_case: none
+ trim_whitespace: '0'
+ alt: ''
+ rel: ''
+ link_class: ''
+ prefix: ''
+ suffix: ''
+ target: ''
+ nl2br: '0'
+ max_length: ''
+ word_boundary: '1'
+ ellipsis: '1'
+ more_link: '0'
+ more_link_text: ''
+ more_link_path: ''
+ strip_tags: '0'
+ trim: '0'
+ preserve_tags: ''
+ html: '0'
+ element_type: ''
+ element_class: ''
+ element_label_type: ''
+ element_label_class: ''
+ element_label_colon: '1'
+ element_wrapper_type: ''
+ element_wrapper_class: ''
+ element_default_classes: '1'
+ empty: ''
+ hide_empty: '0'
+ empty_zero: '0'
+ hide_alter_empty: '1'
+ type: separator
+ separator: ''
+ filters:
+ status:
+ value: '1'
+ table: users
+ field: status
+ id: status
+ expose:
+ operator: '0'
+ group: '1'
+ sorts: { }
+ title: test_user_role
+ page_1:
+ display_plugin: page
+ id: page_1
+ display_title: Page
+ position: ''
+ display_options:
+ path: test-views-handler-field-role
+human_name: test_views_handler_field_role
+name: test_views_handler_field_role
+tag: ''
diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc
index 1689f62..1b4d5b0 100644
--- a/core/modules/user/user.admin.inc
+++ b/core/modules/user/user.admin.inc
@@ -208,7 +208,7 @@ function user_admin_account() {
$destination = drupal_get_destination();
$status = array(t('blocked'), t('active'));
- $roles = array_map('check_plain', user_roles(TRUE));
+ $roles = array_map('check_plain', user_role_names(TRUE));
$accounts = array();
foreach ($result as $account) {
$account = user_load($account->uid);
@@ -316,7 +316,7 @@ function user_admin_settings($form, &$form_state) {
// Do not allow users to set the anonymous or authenticated user roles as the
// administrator role.
- $roles = user_roles();
+ $roles = user_role_names();
unset($roles[DRUPAL_ANONYMOUS_RID]);
unset($roles[DRUPAL_AUTHENTICATED_RID]);
$roles[0] = t('disabled');
@@ -656,7 +656,7 @@ function user_admin_settings_submit($form, &$form_state) {
function user_admin_permissions($form, $form_state, $rid = NULL) {
// Retrieve role names for columns.
- $role_names = user_roles();
+ $role_names = user_role_names();
if (isset($rid)) {
$role_names = array($rid => $role_names[$rid]);
}
@@ -757,7 +757,7 @@ function user_admin_permissions_submit($form, &$form_state) {
function theme_user_admin_permissions($variables) {
$form = $variables['form'];
- $roles = user_roles();
+ $roles = user_role_names();
foreach (element_children($form['permission']) as $key) {
$row = array();
// Module name
@@ -826,27 +826,21 @@ function theme_user_permission_description($variables) {
* @see theme_user_admin_roles()
*/
function user_admin_roles($form, $form_state) {
- $roles = db_select('role', 'r')
- ->addTag('translatable')
- ->fields('r')
- ->orderBy('weight')
- ->orderBy('name')
- ->execute();
+ $roles = user_roles();
$form['roles'] = array(
'#tree' => TRUE,
);
- $max_weight = 0;
- foreach ($roles as $role) {
- $max_weight = max($max_weight, $role->weight);
- $form['roles'][$role->rid]['#role'] = $role;
- $form['roles'][$role->rid]['#weight'] = $role->weight;
- $form['roles'][$role->rid]['name'] = array(
- '#markup' => check_plain($role->name),
+
+ foreach ($roles as $rid => $role) {
+ $form['roles'][$rid]['#role'] = $role;
+ $form['roles'][$rid]['#weight'] = $role->weight;
+ $form['roles'][$rid]['name'] = array(
+ '#markup' => check_plain($role->label()),
);
- $form['roles'][$role->rid]['weight'] = array(
+ $form['roles'][$rid]['weight'] = array(
'#type' => 'textfield',
- '#title' => t('Weight for @title', array('@title' => $role->name)),
+ '#title' => t('Weight for @title', array('@title' => $role->label())),
'#title_display' => 'invisible',
'#size' => 4,
'#default_value' => $role->weight,
@@ -854,26 +848,25 @@ function user_admin_roles($form, $form_state) {
);
$links['edit'] = array(
'title' => t('edit role'),
- 'href' => 'admin/people/roles/edit/' . $role->rid,
+ 'href' => 'admin/people/roles/edit/' . $rid,
'weight' => 0,
);
$links['permissions'] = array(
'title' => t('edit permissions'),
- 'href' => 'admin/people/permissions/' . $role->rid,
+ 'href' => 'admin/people/permissions/' . $rid,
'weight' => 5,
);
- $form['roles'][$role->rid]['operations'] = array(
+ $form['roles'][$rid]['operations'] = array(
'#type' => 'operations',
'#links' => $links,
);
}
// Embed the role add form.
- $add_role = (object) array(
- 'rid' => NULL,
- 'name' => NULL,
- 'weight' => $max_weight + 1,
- );
+ $add_role = entity_create('user_role', array(
+ 'id' => NULL,
+ 'label' => NULL,
+ ));
$add_form = user_admin_role(array(), $form_state, $add_role);
$add_form['actions']['submit']['#submit'] = array('user_admin_role_submit');
$add_form['role']['actions'] = $add_form['actions'];
@@ -899,7 +892,7 @@ function user_admin_roles_order_submit($form, &$form_state) {
foreach ($form_state['values']['roles'] as $rid => $role_values) {
$role = $form['roles'][$rid]['#role'];
$role->weight = $role_values['weight'];
- user_role_save($role);
+ $role->save();
}
drupal_set_message(t('The role settings have been updated.'));
}
@@ -953,32 +946,33 @@ function theme_user_admin_roles($variables) {
*
* @ingroup forms
* @see user_admin_role_submit()
+ *
+ * @todo Move into a RoleFormController.
*/
function user_admin_role($form, $form_state, $role) {
$form['role'] = array(
'#tree' => TRUE,
'#parents' => array('role'),
);
-
- $form['role']['name'] = array(
+ $form['role']['label'] = array(
'#type' => 'textfield',
'#title' => t('Role name'),
- '#default_value' => $role->name,
+ '#default_value' => $role->label(),
'#size' => 30,
'#required' => TRUE,
'#maxlength' => 64,
'#description' => t('The name for this role. Example: "Moderator", "Editorial board", "Site architect".'),
);
- $form['role']['rid'] = array(
+ $form['role']['id'] = array(
'#type' => 'machine_name',
- '#default_value' => $role->rid,
+ '#default_value' => $role->id(),
'#required' => TRUE,
- '#disabled' => !empty($role->rid),
+ '#disabled' => !$role->isNew(),
'#size' => 30,
'#maxlength' => 64,
'#machine_name' => array(
'exists' => 'user_role_load',
- 'source' => array('role', 'name'),
+ 'source' => array('role', 'label'),
),
);
$form['role']['weight'] = array(
@@ -988,12 +982,12 @@ function user_admin_role($form, $form_state, $role) {
$form['actions'] = array('#type' => 'actions');
$form['actions']['submit'] = array(
'#type' => 'submit',
- '#value' => !empty($role->rid) ? t('Save role') : t('Add role'),
+ '#value' => !$role->isNew() ? t('Save role') : t('Add role'),
);
$form['actions']['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete role'),
- '#access' => !empty($role->rid) && !in_array($role->rid, array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID)),
+ '#access' => !$role->isNew() && !in_array($role->id(), array(DRUPAL_ANONYMOUS_RID, DRUPAL_AUTHENTICATED_RID)),
'#submit' => array('user_admin_role_delete_submit'),
);
@@ -1004,9 +998,11 @@ function user_admin_role($form, $form_state, $role) {
* Form submit handler for the user_admin_role() form.
*/
function user_admin_role_submit($form, &$form_state) {
- $role = (object) $form_state['values']['role'];
- $status = user_role_save($role);
- if ($status === SAVED_UPDATED) {
+ // Prevent leading and trailing spaces in role names.
+ $form_state['values']['role']['label'] = trim($form_state['values']['role']['label']);
+
+ $role = entity_create('user_role', $form_state['values']['role']);
+ if ($role->save() == SAVED_UPDATED) {
drupal_set_message(t('The role has been renamed.'));
}
else {
@@ -1019,26 +1015,25 @@ function user_admin_role_submit($form, &$form_state) {
* Form submit handler for the user_admin_role() form.
*/
function user_admin_role_delete_submit($form, &$form_state) {
- $form_state['redirect'] = 'admin/people/roles/delete/' . $form_state['values']['role']['rid'];
+ $form_state['redirect'] = 'admin/people/roles/delete/' . $form_state['values']['role']['id'];
}
/**
* Form to confirm role delete operation.
*/
function user_admin_role_delete_confirm($form, &$form_state, $role) {
- $form['rid'] = array(
+ $form['id'] = array(
'#type' => 'value',
- '#value' => $role->rid,
+ '#value' => $role->id(),
);
- return confirm_form($form, t('Are you sure you want to delete the role %name ?', array('%name' => $role->name)), 'admin/people/roles', t('This action cannot be undone.'), t('Delete'));
+ return confirm_form($form, t('Are you sure you want to delete the role %name ?', array('%name' => $role->label())), 'admin/people/roles', t('This action cannot be undone.'), t('Delete'));
}
/**
* Form submit handler for user_admin_role_delete_confirm().
*/
function user_admin_role_delete_confirm_submit($form, &$form_state) {
- user_role_delete($form_state['values']['rid']);
+ entity_delete_multiple('user_role', array($form_state['values']['id']));
drupal_set_message(t('The role has been deleted.'));
$form_state['redirect'] = 'admin/people/roles';
}
-
diff --git a/core/modules/user/user.api.php b/core/modules/user/user.api.php
index cae3dde..652c5b5 100644
--- a/core/modules/user/user.api.php
+++ b/core/modules/user/user.api.php
@@ -440,7 +440,7 @@ function hook_user_role_insert($role) {
// Save extra fields provided by the module to user roles.
db_insert('my_module_table')
->fields(array(
- 'rid' => $role->rid,
+ 'rid' => $role->id(),
'role_description' => $role->description,
))
->execute();
@@ -460,7 +460,7 @@ function hook_user_role_insert($role) {
function hook_user_role_update($role) {
// Save extra fields provided by the module to user roles.
db_merge('my_module_table')
- ->key(array('rid' => $role->rid))
+ ->key(array('rid' => $role->id()))
->fields(array(
'role_description' => $role->description
))
@@ -481,7 +481,7 @@ function hook_user_role_update($role) {
function hook_user_role_delete($role) {
// Delete existing instances of the deleted role.
db_delete('my_module_table')
- ->condition('rid', $role->rid)
+ ->condition('rid', $role->id())
->execute();
}
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 92febf4..ff5a0e2 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -148,39 +148,6 @@ function user_schema() {
),
);
- $schema['role'] = array(
- 'description' => 'Stores user roles.',
- 'fields' => array(
- 'rid' => array(
- 'type' => 'varchar',
- // The role ID is often used as part of a compound index; at least MySQL
- // has a maximum index length of 1000 characters (333 on utf8), so we
- // limit the maximum length.
- 'length' => 64,
- 'not null' => TRUE,
- 'description' => 'Primary Key: Unique role ID.',
- ),
- 'name' => array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- 'description' => 'Role label.',
- 'translatable' => TRUE,
- ),
- 'weight' => array(
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- 'description' => 'The weight of this role in listings and the user interface.',
- ),
- ),
- 'primary key' => array('rid'),
- 'indexes' => array(
- 'name_weight' => array('name', 'weight'),
- ),
- );
-
$schema['role_permission'] = array(
'description' => 'Stores the permissions assigned to user roles.',
'fields' => array(
@@ -326,13 +293,6 @@ function user_install() {
'status' => 1,
))
->execute();
-
- // Insert built-in roles.
- db_insert('role')
- ->fields(array('rid', 'name', 'weight'))
- ->values(array(DRUPAL_ANONYMOUS_RID, 'Anonymous user', 0))
- ->values(array(DRUPAL_AUTHENTICATED_RID, 'Authenticated user', 1))
- ->execute();
}
/**
@@ -1055,5 +1015,33 @@ function user_update_8016() {
}
/**
+ * Migrate user roles into configuration.
+ *
+ * @ingroup config_upgrade
+ */
+function user_update_8017() {
+ $uuid = new Uuid();
+
+ $roles = db_select('role', 'r')
+ ->fields('r')
+ ->execute()
+ ->fetchAll();
+
+ foreach ($roles as $role) {
+ config('user.role.' . $role->rid)
+ ->set('id', $role->rid)
+ ->set('uuid', $uuid->generate())
+ ->set('label', $role->name)
+ ->set('weight', $role->weight)
+ ->set('langcode', LANGUAGE_NOT_SPECIFIED)
+ ->save();
+ }
+
+ update_config_manifest_add('user.role', array_map(function ($role) {
+ return $role->rid;
+ }, $roles));
+}
+
+/**
* @} End of "addtogroup updates-7.x-to-8.x".
*/
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 3082cde..89bc6c1 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -6,6 +6,7 @@ use Drupal\comment\Plugin\Core\Entity\Comment;
use Drupal\entity\Plugin\Core\Entity\EntityDisplay;
use Drupal\file\Plugin\Core\Entity\File;
use Drupal\user\Plugin\Core\Entity\User;
+use Drupal\user\UserRole;
use Drupal\Core\Template\Attribute;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -1818,6 +1819,25 @@ function user_mail_tokens(&$replacements, $data, $options) {
* An associative array with the role id as the key and the role name as
* value.
*/
+function user_role_names($membersonly = FALSE, $permission = NULL) {
+ return array_map(function($item) {
+ return $item->label();
+ }, user_roles($membersonly, $permission));
+}
+
+/**
+ * Retrieve an array of roles matching specified conditions.
+ *
+ * @param $membersonly
+ * Set this to TRUE to exclude the 'anonymous' role.
+ * @param $permission
+ * A string containing a permission. If set, only roles containing that
+ * permission are returned.
+ *
+ * @return
+ * An associative array with the role id as the key and the role object as
+ * value.
+ */
function user_roles($membersonly = FALSE, $permission = NULL) {
$user_roles = &drupal_static(__FUNCTION__);
@@ -1830,23 +1850,22 @@ function user_roles($membersonly = FALSE, $permission = NULL) {
}
}
- $query = db_select('role', 'r');
- $query->addTag('translatable');
- $query->fields('r', array('rid', 'name'));
- $query->orderBy('weight');
- $query->orderBy('name');
- if (!empty($permission)) {
- $query->innerJoin('role_permission', 'p', 'r.rid = p.rid');
- $query->condition('p.permission', $permission);
- }
+ $roles = entity_load_multiple('user_role');
if ($membersonly) {
- $query->condition('r.rid', DRUPAL_ANONYMOUS_RID, '!=');
+ unset($roles[DRUPAL_ANONYMOUS_RID]);
+ }
+
+ if (!empty($permission)) {
+ $result = db_select('role_permission', 'p')
+ ->fields('p', array('rid'))
+ ->condition('p.rid', array_keys($roles))
+ ->condition('p.permission', $permission)
+ ->execute()->fetchCol();
+ $roles = array_intersect_key($roles, array_flip($result));
}
- $roles = $query->execute()->fetchAllKeyed();
if (empty($permission)) {
$user_roles[$cid] = $roles;
- return $user_roles[$cid];
}
return $roles;
@@ -1863,87 +1882,7 @@ function user_roles($membersonly = FALSE, $permission = NULL) {
* otherwise.
*/
function user_role_load($rid) {
- return db_select('role', 'r')
- ->fields('r')
- ->condition('rid', $rid)
- ->execute()
- ->fetchObject();
-}
-
-/**
- * Save a user role to the database.
- *
- * @param $role
- * A role object to modify or add.
- *
- * @return
- * Status constant indicating if role was created or updated.
- * Failure to write the user role record will return FALSE. Otherwise
- * SAVED_NEW or SAVED_UPDATED is returned depending on the operation
- * performed.
- */
-function user_role_save($role) {
- if ($role->name) {
- // Prevent leading and trailing spaces in role names.
- $role->name = trim($role->name);
- }
- if (!isset($role->weight)) {
- // Set a role weight to make this new role last.
- $query = db_select('role');
- $query->addExpression('MAX(weight)');
- $role->weight = $query->execute()->fetchField() + 1;
- }
-
- // Let modules modify the user role before it is saved to the database.
- module_invoke_all('user_role_presave', $role);
-
- $exists = db_select('role', 'r')
- ->fields('r', array('rid'))
- ->condition('rid', $role->rid)
- ->execute()
- ->fetchAll();
-
- if (empty($exists)) {
- $status = drupal_write_record('role', $role);
- module_invoke_all('user_role_insert', $role);
- }
- else {
- $status = drupal_write_record('role', $role, 'rid');
- module_invoke_all('user_role_update', $role);
- }
-
- // Clear the user access cache.
- drupal_static_reset('user_access');
- drupal_static_reset('user_role_permissions');
-
- return $status;
-}
-
-/**
- * Delete a user role from database.
- *
- * @param $role
- * A string with the role ID.
- */
-function user_role_delete($role) {
- $role = user_role_load($role);
-
- db_delete('role')
- ->condition('rid', $role->rid)
- ->execute();
- db_delete('role_permission')
- ->condition('rid', $role->rid)
- ->execute();
- // Update the users who have this role set:
- db_delete('users_roles')
- ->condition('rid', $role->rid)
- ->execute();
-
- module_invoke_all('user_role_delete', $role);
-
- // Clear the user access cache.
- drupal_static_reset('user_access');
- drupal_static_reset('user_role_permissions');
+ return entity_load('user_role', $rid);
}
/**
@@ -1951,7 +1890,7 @@ function user_role_delete($role) {
*/
function user_role_delete_access($role) {
// Prevent the system-defined roles from being removed.
- if ($role->rid == DRUPAL_ANONYMOUS_RID || $role->rid == DRUPAL_AUTHENTICATED_RID) {
+ if ($role->id() == DRUPAL_ANONYMOUS_RID || $role->id() == DRUPAL_AUTHENTICATED_RID) {
return FALSE;
}
@@ -2090,7 +2029,7 @@ function user_user_operations($form = array(), $form_state = array()) {
);
if (user_access('administer permissions')) {
- $roles = user_roles(TRUE);
+ $roles = user_role_names(TRUE);
unset($roles[DRUPAL_AUTHENTICATED_RID]); // Can't edit authenticated role.
$add_roles = array();
@@ -2175,7 +2114,7 @@ function user_user_operations_block($accounts) {
* Callback function for admin mass adding/deleting a user role.
*/
function user_multiple_role_edit($accounts, $operation, $rid) {
- $role_name = db_query('SELECT name FROM {role} WHERE rid = :rid', array(':rid' => $rid))->fetchField();
+ $role_name = entity_load('user_role', $rid)->label();
switch ($operation) {
case 'add_role':
@@ -2307,7 +2246,7 @@ function user_multiple_cancel_confirm_submit($form, &$form_state) {
function user_filters() {
// Regular filters
$filters = array();
- $roles = user_roles(TRUE);
+ $roles = user_role_names(TRUE);
unset($roles[DRUPAL_AUTHENTICATED_RID]); // Don't list authorized role.
if (count($roles)) {
$filters['role'] = array(
diff --git a/core/modules/user/user.views.inc b/core/modules/user/user.views.inc
index 9264381..868c3ab 100644
--- a/core/modules/user/user.views.inc
+++ b/core/modules/user/user.views.inc
@@ -351,22 +351,6 @@ function user_views_data() {
),
);
- // role table
-
- $data['role']['table']['join'] = array(
- // Directly links to users table.
- 'users' => array(
- 'left_table' => 'users_roles',
- 'left_field' => 'rid',
- 'field' => 'rid',
- ),
- // needed for many to one helper sometimes
- 'users_roles' => array(
- 'left_field' => 'rid',
- 'field' => 'rid',
- ),
- );
-
// permission table
$data['role_permission']['table']['group'] = t('User');
$data['role_permission']['table']['join'] = array(
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php
index fbd6184..b737cc7 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/filter/FilterPluginBase.php
@@ -551,7 +551,7 @@ abstract class FilterPluginBase extends HandlerBase {
'#default_value' => $this->options['expose']['remember'],
);
- $role_options = array_map('check_plain', user_roles());
+ $role_options = array_map('check_plain', user_role_names());
$form['expose']['remember_roles'] = array(
'#type' => 'checkboxes',
'#title' => t('User roles'),
diff --git a/core/profiles/standard/config/user.role.administrator.yml b/core/profiles/standard/config/user.role.administrator.yml
new file mode 100644
index 0000000..71187f9
--- /dev/null
+++ b/core/profiles/standard/config/user.role.administrator.yml
@@ -0,0 +1,3 @@
+id: administrator
+label: Administrator
+weight: 2
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index c360fd1..da701db 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -225,19 +225,14 @@ function standard_install() {
user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access content', 'access comments'));
user_role_grant_permissions(DRUPAL_AUTHENTICATED_RID, array('access content', 'access comments', 'post comments', 'skip comment approval'));
- // Create a default role for site administrators, with all available permissions assigned.
- $admin_role = new stdClass();
- $admin_role->rid = 'administrator';
- $admin_role->name = 'Administrator';
- $admin_role->weight = 2;
- user_role_save($admin_role);
- user_role_grant_permissions($admin_role->rid, array_keys(module_invoke_all('permission')));
+ // Enable all permissions for the administrator role.
+ user_role_grant_permissions('administrator', array_keys(module_invoke_all('permission')));
// Set this as the administrator role.
- $user_settings->set('admin_role', $admin_role->rid)->save();
+ $user_settings->set('admin_role', 'administrator')->save();
// Assign user 1 the "administrator" role.
db_insert('users_roles')
- ->fields(array('uid' => 1, 'rid' => $admin_role->rid))
+ ->fields(array('uid' => 1, 'rid' => 'administrator'))
->execute();
// Create a Home link in the main menu.