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