Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\user\Entity;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Config\Entity\ConfigEntityBase;
|
Chris@0
|
6 use Drupal\Core\Entity\EntityStorageInterface;
|
Chris@0
|
7 use Drupal\user\RoleInterface;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * Defines the user role entity class.
|
Chris@0
|
11 *
|
Chris@0
|
12 * @ConfigEntityType(
|
Chris@0
|
13 * id = "user_role",
|
Chris@0
|
14 * label = @Translation("Role"),
|
Chris@0
|
15 * handlers = {
|
Chris@0
|
16 * "storage" = "Drupal\user\RoleStorage",
|
Chris@0
|
17 * "access" = "Drupal\user\RoleAccessControlHandler",
|
Chris@0
|
18 * "list_builder" = "Drupal\user\RoleListBuilder",
|
Chris@0
|
19 * "form" = {
|
Chris@0
|
20 * "default" = "Drupal\user\RoleForm",
|
Chris@0
|
21 * "delete" = "Drupal\Core\Entity\EntityDeleteForm"
|
Chris@0
|
22 * }
|
Chris@0
|
23 * },
|
Chris@0
|
24 * admin_permission = "administer permissions",
|
Chris@0
|
25 * config_prefix = "role",
|
Chris@0
|
26 * static_cache = TRUE,
|
Chris@0
|
27 * entity_keys = {
|
Chris@0
|
28 * "id" = "id",
|
Chris@0
|
29 * "weight" = "weight",
|
Chris@0
|
30 * "label" = "label"
|
Chris@0
|
31 * },
|
Chris@0
|
32 * links = {
|
Chris@0
|
33 * "delete-form" = "/admin/people/roles/manage/{user_role}/delete",
|
Chris@0
|
34 * "edit-form" = "/admin/people/roles/manage/{user_role}",
|
Chris@0
|
35 * "edit-permissions-form" = "/admin/people/permissions/{user_role}",
|
Chris@0
|
36 * "collection" = "/admin/people/roles",
|
Chris@0
|
37 * },
|
Chris@0
|
38 * config_export = {
|
Chris@0
|
39 * "id",
|
Chris@0
|
40 * "label",
|
Chris@0
|
41 * "weight",
|
Chris@0
|
42 * "is_admin",
|
Chris@0
|
43 * "permissions",
|
Chris@0
|
44 * }
|
Chris@0
|
45 * )
|
Chris@0
|
46 */
|
Chris@0
|
47 class Role extends ConfigEntityBase implements RoleInterface {
|
Chris@0
|
48
|
Chris@0
|
49 /**
|
Chris@0
|
50 * The machine name of this role.
|
Chris@0
|
51 *
|
Chris@0
|
52 * @var string
|
Chris@0
|
53 */
|
Chris@0
|
54 protected $id;
|
Chris@0
|
55
|
Chris@0
|
56 /**
|
Chris@0
|
57 * The human-readable label of this role.
|
Chris@0
|
58 *
|
Chris@0
|
59 * @var string
|
Chris@0
|
60 */
|
Chris@0
|
61 protected $label;
|
Chris@0
|
62
|
Chris@0
|
63 /**
|
Chris@0
|
64 * The weight of this role in administrative listings.
|
Chris@0
|
65 *
|
Chris@0
|
66 * @var int
|
Chris@0
|
67 */
|
Chris@0
|
68 protected $weight;
|
Chris@0
|
69
|
Chris@0
|
70 /**
|
Chris@0
|
71 * The permissions belonging to this role.
|
Chris@0
|
72 *
|
Chris@0
|
73 * @var array
|
Chris@0
|
74 */
|
Chris@0
|
75 protected $permissions = [];
|
Chris@0
|
76
|
Chris@0
|
77 /**
|
Chris@0
|
78 * An indicator whether the role has all permissions.
|
Chris@0
|
79 *
|
Chris@0
|
80 * @var bool
|
Chris@0
|
81 */
|
Chris@0
|
82 protected $is_admin;
|
Chris@0
|
83
|
Chris@0
|
84 /**
|
Chris@0
|
85 * {@inheritdoc}
|
Chris@0
|
86 */
|
Chris@0
|
87 public function getPermissions() {
|
Chris@0
|
88 if ($this->isAdmin()) {
|
Chris@0
|
89 return [];
|
Chris@0
|
90 }
|
Chris@0
|
91 return $this->permissions;
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * {@inheritdoc}
|
Chris@0
|
96 */
|
Chris@0
|
97 public function getWeight() {
|
Chris@0
|
98 return $this->get('weight');
|
Chris@0
|
99 }
|
Chris@0
|
100
|
Chris@0
|
101 /**
|
Chris@0
|
102 * {@inheritdoc}
|
Chris@0
|
103 */
|
Chris@0
|
104 public function setWeight($weight) {
|
Chris@0
|
105 $this->set('weight', $weight);
|
Chris@0
|
106 return $this;
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 /**
|
Chris@0
|
110 * {@inheritdoc}
|
Chris@0
|
111 */
|
Chris@0
|
112 public function hasPermission($permission) {
|
Chris@0
|
113 if ($this->isAdmin()) {
|
Chris@0
|
114 return TRUE;
|
Chris@0
|
115 }
|
Chris@0
|
116 return in_array($permission, $this->permissions);
|
Chris@0
|
117 }
|
Chris@0
|
118
|
Chris@0
|
119 /**
|
Chris@0
|
120 * {@inheritdoc}
|
Chris@0
|
121 */
|
Chris@0
|
122 public function grantPermission($permission) {
|
Chris@0
|
123 if ($this->isAdmin()) {
|
Chris@0
|
124 return $this;
|
Chris@0
|
125 }
|
Chris@0
|
126 if (!$this->hasPermission($permission)) {
|
Chris@0
|
127 $this->permissions[] = $permission;
|
Chris@0
|
128 }
|
Chris@0
|
129 return $this;
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 /**
|
Chris@0
|
133 * {@inheritdoc}
|
Chris@0
|
134 */
|
Chris@0
|
135 public function revokePermission($permission) {
|
Chris@0
|
136 if ($this->isAdmin()) {
|
Chris@0
|
137 return $this;
|
Chris@0
|
138 }
|
Chris@0
|
139 $this->permissions = array_diff($this->permissions, [$permission]);
|
Chris@0
|
140 return $this;
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 /**
|
Chris@0
|
144 * {@inheritdoc}
|
Chris@0
|
145 */
|
Chris@0
|
146 public function isAdmin() {
|
Chris@0
|
147 return (bool) $this->is_admin;
|
Chris@0
|
148 }
|
Chris@0
|
149
|
Chris@0
|
150 /**
|
Chris@0
|
151 * {@inheritdoc}
|
Chris@0
|
152 */
|
Chris@0
|
153 public function setIsAdmin($is_admin) {
|
Chris@0
|
154 $this->is_admin = $is_admin;
|
Chris@0
|
155 return $this;
|
Chris@0
|
156 }
|
Chris@0
|
157
|
Chris@0
|
158 /**
|
Chris@0
|
159 * {@inheritdoc}
|
Chris@0
|
160 */
|
Chris@0
|
161 public static function postLoad(EntityStorageInterface $storage, array &$entities) {
|
Chris@0
|
162 parent::postLoad($storage, $entities);
|
Chris@0
|
163 // Sort the queried roles by their weight.
|
Chris@0
|
164 // See \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
|
Chris@0
|
165 uasort($entities, 'static::sort');
|
Chris@0
|
166 }
|
Chris@0
|
167
|
Chris@0
|
168 /**
|
Chris@0
|
169 * {@inheritdoc}
|
Chris@0
|
170 */
|
Chris@0
|
171 public function preSave(EntityStorageInterface $storage) {
|
Chris@0
|
172 parent::preSave($storage);
|
Chris@0
|
173
|
Chris@0
|
174 if (!isset($this->weight) && ($roles = $storage->loadMultiple())) {
|
Chris@0
|
175 // Set a role weight to make this new role last.
|
Chris@0
|
176 $max = array_reduce($roles, function ($max, $role) {
|
Chris@0
|
177 return $max > $role->weight ? $max : $role->weight;
|
Chris@0
|
178 });
|
Chris@0
|
179 $this->weight = $max + 1;
|
Chris@0
|
180 }
|
Chris@0
|
181
|
Chris@0
|
182 if (!$this->isSyncing()) {
|
Chris@0
|
183 // Permissions are always ordered alphabetically to avoid conflicts in the
|
Chris@0
|
184 // exported configuration.
|
Chris@0
|
185 sort($this->permissions);
|
Chris@0
|
186 }
|
Chris@0
|
187 }
|
Chris@0
|
188
|
Chris@0
|
189 }
|