Permission::validateUniqueName()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 4
c 1
b 0
f 1
dl 0
loc 8
rs 10
cc 3
nc 4
nop 1
1
<?php
2
3
namespace modules\rbac\models;
4
5
use Yii;
6
use yii\base\Model;
7
use modules\rbac\traits\ModuleTrait;
8
use modules\rbac\Module;
9
10
/**
11
 * Class Permission
12
 * @package modules\rbac\models
13
 *
14
 * @property-read array $itemsPermissions
15
 * @property-read array $permissionChildren
16
 * @property-read array|string[] $permissionsArray
17
 */
18
class Permission extends Model
19
{
20
    use ModuleTrait;
21
22
    // разрешения
23
    const PERMISSION_VIEW_ADMIN_PAGE = 'viewAdminPage';
24
    const PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION = 'Access to the admin area';
25
26
    const PERMISSION_MANAGER_RBAC = 'managerRbac';
27
    const PERMISSION_MANAGER_RBAC_DESCRIPTION = 'Access to RBAC management';
28
29
    const PERMISSION_MANAGER_USERS = 'managerUsers';
30
    const PERMISSION_MANAGER_USERS_DESCRIPTION = 'Access to Users management';
31
32
    const PERMISSION_MANAGER_POST = 'managerPosts';
33
    const PERMISSION_MANAGER_POST_DESCRIPTION = 'Access to Posts management';
34
35
    // редактирование только своих постов
36
    const PERMISSION_UPDATE_OWN_POST = 'updateOwnPost';
37
    const PERMISSION_UPDATE_OWN_POST_DESCRIPTION = 'Editing your own post';
38
39
    // сценарии
40
    const SCENARIO_CREATE = 'create';
41
    const SCENARIO_UPDATE = 'update';
42
43
    public $name;
44
    public $description;
45
    public $isNewRecord = false;
46
47
    /** @var  array $permissions Установленные разрешения для роли */
48
    public $permissions;
49
    /** @var array $permissionItems Разрешения */
50
    public $permissionItems;
51
52
    /**
53
     * @inheritdoc
54
     * @return array
55
     */
56
    public function rules()
57
    {
58
        return [
59
            ['name', 'required', 'on' => self::SCENARIO_CREATE],
60
            ['name', 'string', 'max' => 64, 'on' => self::SCENARIO_CREATE],
61
            ['name', 'match', 'pattern' => '#^[\w_-]+$#i', 'message' => Module::t(
62
                'module',
63
                'It is allowed to use the Latin alphabet, numbers, dashes and underscores.(A-z,0-1,-,_)'
64
            ), 'on' => self::SCENARIO_CREATE],
65
            ['name', 'validateUniqueName', 'skipOnEmpty' => false, 'skipOnError' => false,
66
                'on' => [self::SCENARIO_CREATE]
67
            ],
68
69
            [['description'], 'string'],
70
            [['permissionItems', 'permissions'], 'required', 'message' => Module::t(
71
                'module',
72
                'You must select in the field «{attribute}».'
73
            ), 'on' => self::SCENARIO_UPDATE],
74
        ];
75
    }
76
77
    /**
78
     * @param string $attribute
79
     */
80
    public function validateUniqueName($attribute)
81
    {
82
        if (!$attribute) {
83
            $this->addError($attribute, Module::t('module', 'Enter name permission.'));
84
        }
85
86
        if (!$this->hasErrors()) {
87
            $this->processCheckPermissionName($attribute);
88
        }
89
    }
90
91
    /**
92
     * @param string $attribute
93
     * @return mixed
94
     */
95
    public function processCheckPermissionName($attribute)
96
    {
97
        if (!empty($this->name)) {
98
            $auth = Yii::$app->authManager;
99
            if ($auth->getPermission($this->name)) {
100
                $this->addError($attribute, Module::t('module', 'This name is already taken.'));
101
            }
102
        }
103
        return $attribute;
104
    }
105
106
    /**
107
     * @return array
108
     */
109
    public function scenarios()
110
    {
111
        $scenarios = parent::scenarios();
112
        $scenarios[self::SCENARIO_CREATE] = ['name', 'description'];
113
        $scenarios[self::SCENARIO_UPDATE] = ['name', 'description', 'permissionItems', 'permissions'];
114
        return $scenarios;
115
    }
116
117
    /**
118
     * @return array
119
     */
120
    public function attributeLabels()
121
    {
122
        return [
123
            'name' => Module::t('module', 'Name'),
124
            'description' => Module::t('module', 'Description'),
125
            'rolesByPermission' => Module::t('module', 'Roles by permission'),
126
            'itemsRoles' => Module::t('module', 'Items roles'),
127
            'permissions' => Module::t('module', 'Permissions by role'),
128
            'permissionItems' => Module::t('module', 'Items permissions'),
129
        ];
130
    }
131
132
    /**
133
     * @return array
134
     */
135
    public function getPermissionsArray()
136
    {
137
        return [
138
            self::PERMISSION_VIEW_ADMIN_PAGE => self::PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION,
139
            self::PERMISSION_MANAGER_RBAC => self::PERMISSION_MANAGER_RBAC_DESCRIPTION,
140
            self::PERMISSION_MANAGER_USERS => self::PERMISSION_MANAGER_USERS_DESCRIPTION,
141
            self::PERMISSION_MANAGER_POST => self::PERMISSION_MANAGER_POST_DESCRIPTION,
142
            self::PERMISSION_UPDATE_OWN_POST => self::PERMISSION_UPDATE_OWN_POST_DESCRIPTION,
143
        ];
144
    }
145
146
    /**
147
     * Возвращает детей разрешения для текущего разрешения
148
     * @return array
149
     */
150
    public function getPermissionChildren()
151
    {
152
        $auth = Yii::$app->authManager;
153
        $perm = $auth->getChildren($this->name);
154
        $arr = [];
155
        foreach ($perm as $value) {
156
            if ($value->name != $this->name) {
157
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
158
            }
159
        }
160
        return $arr;
161
    }
162
163
    /**
164
     * Возвращает все разрешения
165
     * @return array
166
     */
167
    public function getItemsPermissions()
168
    {
169
        $auth = Yii::$app->authManager;
170
        $perm = $auth->getPermissions();
171
        $arr = [];
172
        foreach ($perm as $value) {
173
            if ($value->name != $this->name) {
174
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
175
            }
176
        }
177
        $permChild = $this->getPermissionChildren();
178
        return array_diff($arr, $permChild);
179
    }
180
}
181