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

Permission::groupEditor()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
c 1
b 0
f 0
dl 0
loc 5
rs 10
cc 1
nc 1
nop 0
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_CONFIG = 'managerConfig';
23
    const PERMISSION_MANAGER_CONFIG_DESCRIPTION = 'Access to the config site';
24
25
    const PERMISSION_MANAGER_RBAC = 'managerRbac';
26
    const PERMISSION_MANAGER_RBAC_DESCRIPTION = 'Access to RBAC management';
27
28
    const PERMISSION_MANAGER_USERS = 'managerUsers';
29
    const PERMISSION_MANAGER_USERS_DESCRIPTION = 'Access to Users management';
30
31
    const PERMISSION_MANAGER_POST = 'managerPosts';
32
    const PERMISSION_MANAGER_POST_DESCRIPTION = 'Access to Posts management';
33
34
    const PERMISSION_MANAGER_COMMENTS = 'managerComments';
35
    const PERMISSION_MANAGER_COMMENTS_DESCRIPTION = 'Access to Comments management';
36
37
    // редактирование только своих постов
38
    const PERMISSION_UPDATE_OWN_POST = 'updateOwnPost';
39
    const PERMISSION_UPDATE_OWN_POST_DESCRIPTION = 'Editing your own post';
40
41
    // сценарии
42
    const SCENARIO_CREATE = 'create';
43
    const SCENARIO_UPDATE = 'update';
44
45
    public $name;
46
    public $description;
47
    public $isNewRecord = false;
48
49
    /** @var  array $permissions Установленные разрешения для роли */
50
    public $permissions;
51
    /** @var array $permissionItems Разрешения */
52
    public $permissionItems;
53
54
    /**
55
     * @return array
56
     */
57
    public static function getPermissionsArray()
58
    {
59
        return [
60
            self::PERMISSION_VIEW_ADMIN_PAGE => self::PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION,
61
            self::PERMISSION_MANAGER_CONFIG => self::PERMISSION_MANAGER_CONFIG_DESCRIPTION,
62
            self::PERMISSION_MANAGER_RBAC => self::PERMISSION_MANAGER_RBAC_DESCRIPTION,
63
            self::PERMISSION_MANAGER_USERS => self::PERMISSION_MANAGER_USERS_DESCRIPTION,
64
            self::PERMISSION_MANAGER_POST => self::PERMISSION_MANAGER_POST_DESCRIPTION,
65
            self::PERMISSION_MANAGER_COMMENTS => self::PERMISSION_MANAGER_COMMENTS_DESCRIPTION,
66
            self::PERMISSION_UPDATE_OWN_POST => self::PERMISSION_UPDATE_OWN_POST_DESCRIPTION
67
        ];
68
    }
69
70
    /**
71
     * Groups permissions
72
     * @return array
73
     */
74
    public static function getGroups()
75
    {
76
        return [
77
            Role::ROLE_SUPER_ADMIN => self::groupSuperAdmin(),
78
            Role::ROLE_ADMIN => self::groupAdmin(),
79
            Role::ROLE_MANAGER => self::groupManager(),
80
            Role::ROLE_EDITOR => self::groupEditor()
81
        ];
82
    }
83
84
    /**
85
     * Group permissions to role super_admin
86
     * @return array
87
     */
88
    public static function groupSuperAdmin()
89
    {
90
        return [
91
            self::PERMISSION_VIEW_ADMIN_PAGE,
92
            self::PERMISSION_MANAGER_CONFIG,
93
            self::PERMISSION_MANAGER_POST,
94
            self::PERMISSION_MANAGER_COMMENTS,
95
            self::PERMISSION_MANAGER_USERS,
96
            self::PERMISSION_MANAGER_RBAC
97
        ];
98
    }
99
100
    /**
101
     * Group permissions to role admin
102
     * @return array
103
     */
104
    public static function groupAdmin()
105
    {
106
        return [
107
            self::PERMISSION_VIEW_ADMIN_PAGE,
108
            self::PERMISSION_MANAGER_POST,
109
            self::PERMISSION_MANAGER_COMMENTS,
110
            self::PERMISSION_MANAGER_USERS
111
        ];
112
    }
113
114
    /**
115
     * Group permissions to role manager
116
     * @return array
117
     */
118
    public static function groupManager()
119
    {
120
        return [
121
            self::PERMISSION_VIEW_ADMIN_PAGE,
122
            self::PERMISSION_MANAGER_POST
123
        ];
124
    }
125
126
    /**
127
     * Group permissions to role editor
128
     * @return array
129
     */
130
    public static function groupEditor()
131
    {
132
        return [
133
            self::PERMISSION_VIEW_ADMIN_PAGE,
134
            self::PERMISSION_UPDATE_OWN_POST
135
        ];
136
    }
137
138
139
    /**
140
     * @inheritdoc
141
     * @return array
142
     */
143
    public function rules()
144
    {
145
        return [
146
            ['name', 'required', 'on' => self::SCENARIO_CREATE],
147
            ['name', 'string', 'max' => 64, 'on' => self::SCENARIO_CREATE],
148
            ['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],
149
            ['name', 'validateUniqueName', 'skipOnEmpty' => false, 'skipOnError' => false, 'on' => [self::SCENARIO_CREATE]],
150
151
            [['description'], 'string'],
152
            [['permissionItems', 'permissions'], 'required', 'message' => Module::t('module', 'You must select in the field «{attribute}».'), 'on' => self::SCENARIO_UPDATE]
153
        ];
154
    }
155
156
    /**
157
     * @param string $attribute
158
     */
159
    public function validateUniqueName($attribute)
160
    {
161
        if (!$attribute) {
162
            $this->addError($attribute, Module::t('module', 'Enter name permission.'));
163
        }
164
165
        if (!$this->hasErrors()) {
166
            $this->processCheckPermissionName($attribute);
167
        }
168
    }
169
170
    /**
171
     * @param string $attribute
172
     * @return mixed
173
     */
174
    public function processCheckPermissionName($attribute)
175
    {
176
        if (!empty($this->name)) {
177
            $auth = Yii::$app->authManager;
178
            if ($auth->getPermission($this->name)) {
179
                $this->addError($attribute, Module::t('module', 'This name is already taken.'));
180
            }
181
        }
182
        return $attribute;
183
    }
184
185
    /**
186
     * @return array
187
     */
188
    public function scenarios()
189
    {
190
        $scenarios = parent::scenarios();
191
        $scenarios[self::SCENARIO_CREATE] = ['name', 'description'];
192
        $scenarios[self::SCENARIO_UPDATE] = ['name', 'description', 'permissionItems', 'permissions'];
193
        return $scenarios;
194
    }
195
196
    /**
197
     * @return array
198
     */
199
    public function attributeLabels()
200
    {
201
        return [
202
            'name' => Module::t('module', 'Name'),
203
            'description' => Module::t('module', 'Description'),
204
            'rolesByPermission' => Module::t('module', 'Roles by permission'),
205
            'itemsRoles' => Module::t('module', 'Items roles'),
206
            'permissions' => Module::t('module', 'Permissions by role'),
207
            'permissionItems' => Module::t('module', 'Items permissions')
208
        ];
209
    }
210
211
    /**
212
     * Возвращает детей разрешения для текущего разрешения
213
     * @return array
214
     */
215
    public function getPermissionChildren()
216
    {
217
        $auth = Yii::$app->authManager;
218
        $perm = $auth->getChildren($this->name);
219
        $arr = [];
220
        foreach ($perm as $value) {
221
            if ($value->name !== $this->name) {
222
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
223
            }
224
        }
225
        return $arr;
226
    }
227
228
    /**
229
     * Возвращает все разрешения
230
     * @return array
231
     */
232
    public function getItemsPermissions()
233
    {
234
        $auth = Yii::$app->authManager;
235
        $perm = $auth->getPermissions();
236
        $arr = [];
237
        foreach ($perm as $value) {
238
            if ($value->name !== $this->name) {
239
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
240
            }
241
        }
242
        $permChild = $this->getPermissionChildren();
243
        return array_diff($arr, $permChild);
244
    }
245
}
246