Completed
Push — master ( ff2027...fcd164 )
by Alexey
03:03
created

Role::getRolesByRole()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 7
c 1
b 0
f 0
dl 0
loc 11
rs 10
cc 3
nc 3
nop 0
1
<?php
2
3
namespace modules\rbac\models;
4
5
use Yii;
6
use yii\base\Model;
7
use yii\rbac\Item;
8
use modules\rbac\traits\ModuleTrait;
9
use modules\rbac\Module;
10
11
/**
12
 * Class Role
13
 * @package modules\rbac\models
14
 *
15
 * @property array rolesArray
16
 */
17
class Role extends Model
18
{
19
    use ModuleTrait;
20
21
    // константы ролей
22
    const ROLE_SUPER_ADMIN = 'super_admin';
23
    const ROLE_SUPER_ADMIN_DESCRIPTION = 'Super Administrator';
24
25
    const ROLE_ADMIN = 'admin';
26
    const ROLE_ADMIN_DESCRIPTION = 'Administrator';
27
28
    const ROLE_MANAGER = 'manager';
29
    const ROLE_MANAGER_DESCRIPTION = 'Manager';
30
31
    const ROLE_EDITOR = 'editor';
32
    const ROLE_EDITOR_DESCRIPTION = 'Editor';
33
34
    const ROLE_DEFAULT = 'user';
35
    const ROLE_DEFAULT_DESCRIPTION = 'User';
36
37
    // сценарии
38
    const SCENARIO_CREATE = 'create';
39
    const SCENARIO_UPDATE = 'update';
40
41
    public $name;
42
    public $description;
43
    public $isNewRecord = false;
44
45
    /** @var  array $rolesByRole Наследуемые роли */
46
    public $rolesByRole;
47
    /** @var  array $itemsRoles Доступные роли */
48
    public $itemsRoles;
49
50
    /** @var  array $permissionsByRole Установленные разрешения для роли */
51
    public $permissionsByRole;
52
    /** @var array $itemsPermissions Разрешения */
53
    public $itemsPermissions;
54
55
    /**
56
     * @inheritdoc
57
     * @return array
58
     */
59
    public function rules()
60
    {
61
        return [
62
            ['name', 'required', 'on' => self::SCENARIO_CREATE],
63
            ['name', 'string', 'max' => 64, 'on' => self::SCENARIO_CREATE],
64
            ['name', 'match', 'pattern' => '#^[\w_-]+$#i', 'message' => Module::t('module', 'It is allowed to use the Latin alphabet, numbers, dashes and underscores.(A-z,0-1,-,_)'), 'on' => self::SCENARIO_CREATE],
65
            ['name', 'validateUniqueName', 'skipOnEmpty' => false, 'skipOnError' => false, 'on' => [self::SCENARIO_CREATE]],
66
67
            [['description'], 'string'],
68
            [['rolesByRole', 'itemsRoles', 'permissionsByRole', 'itemsPermissions'], 'required', 'message' => Module::t('module', 'You must select in the field «{attribute}».'), 'on' => self::SCENARIO_UPDATE]
69
        ];
70
    }
71
72
    /**
73
     * @param string $attribute
74
     */
75
    public function validateUniqueName($attribute)
76
    {
77
        if (!$attribute) {
78
            $this->addError($attribute, Module::t('module', 'Enter name role.'));
79
        }
80
        if (!$this->hasErrors()) {
81
            $this->processCheckRoleName($attribute);
82
        }
83
    }
84
85
    /**
86
     * Tree roles
87
     * @return array
88
     */
89
    public static function tree()
90
    {
91
        return [
92
            self::ROLE_SUPER_ADMIN => self::ROLE_ADMIN,
93
            self::ROLE_ADMIN => self::ROLE_MANAGER,
94
            self::ROLE_MANAGER => self::ROLE_EDITOR,
95
            self::ROLE_EDITOR => self::ROLE_DEFAULT
96
        ];
97
    }
98
99
    /**
100
     * @param string $attribute
101
     * @return mixed
102
     */
103
    public function processCheckRoleName($attribute)
104
    {
105
        if (!empty($this->name)) {
106
            $auth = Yii::$app->authManager;
107
            if ($auth->getRole($this->name)) {
108
                $this->addError($attribute, Module::t('module', 'This name is already taken.'));
109
            }
110
        }
111
        return $attribute;
112
    }
113
114
    /**
115
     * @return array
116
     */
117
    public function scenarios()
118
    {
119
        $scenarios = parent::scenarios();
120
        $scenarios[self::SCENARIO_CREATE] = ['name', 'description'];
121
        $scenarios[self::SCENARIO_UPDATE] = ['name', 'description', 'rolesByRole', 'itemsRoles', 'permissionsByRole', 'itemsPermissions'];
122
        return $scenarios;
123
    }
124
125
    /**
126
     * @inheritdoc
127
     * @return array
128
     */
129
    public function attributeLabels()
130
    {
131
        return [
132
            'name' => Module::t('module', 'Name'),
133
            'description' => Module::t('module', 'Description'),
134
            'rolesByRole' => Module::t('module', 'Roles by role'),
135
            'itemsRoles' => Module::t('module', 'Items roles'),
136
            'permissionsByRole' => Module::t('module', 'Permissions by role'),
137
            'itemsPermissions' => Module::t('module', 'Items permissions')
138
        ];
139
    }
140
141
    /**
142
     * @return array
143
     */
144
    public function getRolesArray()
145
    {
146
        return [
147
            self::ROLE_SUPER_ADMIN => self::ROLE_SUPER_ADMIN_DESCRIPTION,
148
            self::ROLE_ADMIN => self::ROLE_ADMIN_DESCRIPTION,
149
            self::ROLE_MANAGER => self::ROLE_MANAGER_DESCRIPTION,
150
            self::ROLE_EDITOR => self::ROLE_EDITOR_DESCRIPTION,
151
            self::ROLE_DEFAULT => self::ROLE_DEFAULT_DESCRIPTION
152
        ];
153
    }
154
155
    /**
156
     * Возвращает установленные разрешения для роли
157
     * @return array
158
     */
159
    public function getPermissionsByRole()
160
    {
161
        $auth = Yii::$app->authManager;
162
        $perm = $auth->getPermissionsByRole($this->name);
163
        $arr = [];
164
        foreach ($perm as $value) {
165
            if ($value->name !== $this->name) {
166
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
167
            }
168
        }
169
        return $arr;
170
    }
171
172
    /**
173
     * Возвращает все разрешения
174
     * @return array
175
     */
176
    public function getItemsPermissions()
177
    {
178
        $auth = Yii::$app->authManager;
179
        $perm = $auth->getPermissions();
180
        $arr = [];
181
        foreach ($perm as $value) {
182
            if ($value->name !== $this->name) {
183
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
184
            }
185
        }
186
        $permByRole = $this->getPermissionsByRole();
187
        return array_diff($arr, $permByRole);
188
    }
189
190
    /**
191
     * Возвращает дочерние роли
192
     * @return array
193
     */
194
    public function getRolesByRole()
195
    {
196
        $auth = Yii::$app->authManager;
197
        $roles = $auth->getChildRoles($this->name);
198
        $arr = [];
199
        foreach ($roles as $value) {
200
            if ($value->name !== $this->name) {
201
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
202
            }
203
        }
204
        return $arr;
205
    }
206
207
    /**
208
     * Возвращает все роли
209
     * @return array
210
     */
211
    public function getItemsRoles()
212
    {
213
        $auth = Yii::$app->authManager;
214
        $roles = $auth->getRoles();
215
        $arr = [];
216
        foreach ($roles as $value) {
217
            if ($value->name !== $this->name) {
218
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
219
            }
220
        }
221
        $rolesByRole = $this->getRolesByRole();
222
        return array_diff($arr, $rolesByRole);
223
    }
224
225
    /**
226
     * @return \yii\rbac\Role[]
227
     */
228
    public function getRoleChild()
229
    {
230
        $auth = Yii::$app->authManager;
231
        return $auth->getChildRoles($this->name);
232
    }
233
234
    /**
235
     * Возвращает массив дочерних ролей
236
     * @return array
237
     */
238
    public function getRoleChildArray()
239
    {
240
        $roles = $this->getRoleChild();
241
        $arr = [];
242
        foreach ($roles as $value) {
243
            if ($value->name !== $this->name) {
244
                $arr[$value->name] = $value->description;
245
            }
246
        }
247
        return $arr;
248
    }
249
250
    /**
251
     * Получаем все роли
252
     * @return \yii\rbac\Role[]
253
     */
254
    public function getRoles()
255
    {
256
        $auth = Yii::$app->authManager;
257
        return $auth->getRoles();
258
    }
259
260
    /**
261
     * Возвращает массив ролей
262
     * @return array
263
     */
264
    public function getRoleItemsArray()
265
    {
266
        $roles = $this->getRoles();
267
        $arr = [];
268
        foreach ($roles as $value) {
269
            if ($value->name !== $this->name) {
270
                $arr[$value->name] = $value->description;
271
            }
272
        }
273
        return $arr;
274
    }
275
276
    /**
277
     *
278
     * @return array
279
     */
280
    public function getRolePermissions()
281
    {
282
        $auth = Yii::$app->authManager;
283
        $children = $auth->getChildren($this->name);
284
        $perm = [];
285
        foreach ($children as $key => $child) {
286
            if ($child->type === 2) {
287
                $perm[$key] = $child;
288
            }
289
        }
290
        return $perm;
291
    }
292
293
    /**
294
     * Все дети
295
     * @return Item[]
296
     */
297
    public function getChildren()
298
    {
299
        $auth = Yii::$app->authManager;
300
        return $auth->getChildren($this->name);
301
    }
302
}
303