Completed
Push — master ( 5b873e...d824de )
by Alexey
02:27
created

Permission   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 153
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 16
dl 0
loc 153
c 0
b 0
f 0
rs 10

8 Methods

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