Completed
Push — master ( ccef5b...80a78a )
by Alexey
02:38
created

Permission   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 139
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 15
dl 0
loc 139
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A rules() 0 10 1
A processCheckPermissionName() 0 9 3
A getItemsPermissions() 0 12 3
A attributeLabels() 0 9 1
A scenarios() 0 6 1
A getPermissionChildren() 0 11 3
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
     * Возвращает детей разрешения для текущего разрешения
122
     * @return array
123
     */
124
    public function getPermissionChildren()
125
    {
126
        $auth = Yii::$app->authManager;
127
        $perm = $auth->getChildren($this->name);
128
        $arr = [];
129
        foreach ($perm as $value) {
130
            if ($value->name != $this->name) {
131
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
132
            }
133
        }
134
        return $arr;
135
    }
136
137
    /**
138
     * Возвращает все разрешения
139
     * @return array
140
     */
141
    public function getItemsPermissions()
142
    {
143
        $auth = Yii::$app->authManager;
144
        $perm = $auth->getPermissions();
145
        $arr = [];
146
        foreach ($perm as $value) {
147
            if ($value->name != $this->name) {
148
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
149
            }
150
        }
151
        $permChild = $this->getPermissionChildren();
152
        return array_diff($arr, $permChild);
153
    }
154
}
155