Passed
Push — master ( f7a351...988e81 )
by Alexey
03:10
created

RolesController::actionDelete()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
eloc 7
nc 2
nop 1
cc 2
1
<?php
2
3
namespace modules\rbac\controllers;
4
5
use Yii;
6
use yii\data\ArrayDataProvider;
7
use yii\web\Controller;
8
use yii\filters\AccessControl;
9
use yii\filters\VerbFilter;
10
use yii\web\BadRequestHttpException;
11
use yii\widgets\ActiveForm;
12
use yii\web\Response;
13
use modules\rbac\models\Role;
14
use modules\rbac\Module;
15
16
/**
17
 * Class RolesController
18
 * @package modules\rbac\controllers
19
 */
20
class RolesController extends Controller
21
{
22
    /**
23
     * @inheritdoc
24
     * @return array
25
     */
26
    public function behaviors()
27
    {
28
        return [
29
            'access' => [
30
                'class' => AccessControl::className(),
0 ignored issues
show
Deprecated Code introduced by
The function yii\base\BaseObject::className() has been deprecated: since 2.0.14. On PHP >=5.5, use `::class` instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

30
                'class' => /** @scrutinizer ignore-deprecated */ AccessControl::className(),

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
31
                'rules' => [
32
                    [
33
                        'allow' => true,
34
                        'roles' => ['managerRbac'],
35
                    ],
36
                ],
37
            ],
38
            'verbs' => [
39
                'class' => VerbFilter::className(),
0 ignored issues
show
Deprecated Code introduced by
The function yii\base\BaseObject::className() has been deprecated: since 2.0.14. On PHP >=5.5, use `::class` instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

39
                'class' => /** @scrutinizer ignore-deprecated */ VerbFilter::className(),

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
40
                'actions' => [
41
                    'delete' => ['POST']
42
                ],
43
            ],
44
        ];
45
    }
46
47
    /**
48
     * Lists all Role models.
49
     * @return mixed
50
     */
51
    public function actionIndex()
52
    {
53
        $auth = Yii::$app->authManager;
54
        $dataProvider = new ArrayDataProvider([
55
            'allModels' => $auth->getRoles(),
56
            'sort' => [
57
                'attributes' => ['name', 'description', 'ruleName'],
58
            ],
59
            'pagination' => [
60
                'pageSize' => 15,
61
            ],
62
        ]);
63
        return $this->render('index', [
64
            'dataProvider' => $dataProvider,
65
        ]);
66
    }
67
68
    /**
69
     * Displays a single Role model.
70
     * @param string|int $id
71
     * @return mixed
72
     */
73
    public function actionView($id)
74
    {
75
        $auth = Yii::$app->authManager;
76
        $role = $auth->getRole($id);
77
78
        $model = new Role(['name' => $role->name]);
79
        return $this->render('view', [
80
            'role' => $role,
81
            'model' => $model
82
        ]);
83
    }
84
85
    /**
86
     * Creates Role a new Role model.
87
     * If creation is successful, the browser will be redirected to the 'view' page.
88
     * @return array|string|\yii\web\Response
89
     * @throws \Exception
90
     */
91
    public function actionCreate()
92
    {
93
        $model = new Role(['scenario' => Role::SCENARIO_CREATE]);
94
        $model->isNewRecord = true;
95
96
        if ($model->load(Yii::$app->request->post())) {
97
            if ($model->validate()) {
98
                $auth = Yii::$app->authManager;
99
                $role = $auth->createRole($model->name);
100
                $role->description = $model->description;
101
                if ($auth->add($role)) {
102
                    return $this->redirect(['view', 'id' => $model->name]);
103
                }
104
            }
105
        }
106
        return $this->render('create', [
107
            'model' => $model,
108
        ]);
109
    }
110
111
    /**
112
     * @return array|bool
113
     */
114
    public function actionAjaxValidateForm()
115
    {
116
        $model = new Role(['scenario' => Role::SCENARIO_CREATE]);
117
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
118
            Yii::$app->response->format = Response::FORMAT_JSON;
119
            return ActiveForm::validate($model);
120
        }
121
        return false;
122
    }
123
124
    /**
125
     * Updates an existing Role model.
126
     * If update is successful, the browser will be redirected to the 'view' page.
127
     * @param string|int $id
128
     * @return string|\yii\web\Response
129
     * @throws \Exception
130
     */
131
    public function actionUpdate($id)
132
    {
133
        $auth = Yii::$app->authManager;
134
        $role = $auth->getRole($id);
135
136
        $model = new Role([
137
            'scenario' => Role::SCENARIO_UPDATE,
138
            'name' => $role->name,
139
            'description' => $role->description,
140
        ]);
141
        if ($model->load(Yii::$app->request->post())) {
142
            $role->description = $model->description;
143
            if ($auth->update($id, $role)) {
144
                return $this->redirect(['view', 'id' => $id]);
145
            }
146
        }
147
        return $this->render('update', [
148
            'model' => $model,
149
        ]);
150
    }
151
152
    /**
153
     * Привязываем роль
154
     * @return \yii\web\Response
155
     * @throws BadRequestHttpException
156
     * @throws \Exception
157
     */
158
    public function actionAddRoles()
159
    {
160
        $model = new Role([
161
            'scenario' => Role::SCENARIO_UPDATE,
162
        ]);
163
        if ($model->load(Yii::$app->request->post())) {
164
            $auth = Yii::$app->authManager;
165
            $role = $auth->getRole($model->name);
166
            foreach ($model->itemsRoles as $value) {
167
                $add = $auth->getRole($value);
168
                // Проверяем, не является добовляемая роль родителем?
169
                $result = $this->detectLoop($role, $add);
170
                if (!$result) {
171
                    $auth->addChild($role, $add);
172
                } else {
173
                    Yii::$app->session->setFlash('error', Module::t('module', 'The role of the "{:parent}" is the parent of the "{:role}"!', [':parent' => $add->name, ':role' => $role->name]));
174
                }
175
            }
176
            return $this->redirect(['update', 'id' => $model->name, '#' => 'assign-container-roles']);
177
        }
178
        throw new BadRequestHttpException(Module::t('module', 'Not a valid request to the method!'));
179
    }
180
181
    /**
182
     * Отзываем роль
183
     * @return array|\yii\web\Response
184
     * @throws BadRequestHttpException
185
     */
186
    public function actionRemoveRoles()
187
    {
188
        $model = new Role([
189
            'scenario' => Role::SCENARIO_UPDATE,
190
        ]);
191
        if ($model->load(Yii::$app->request->post())) {
192
            $auth = Yii::$app->authManager;
193
            $role = $auth->getRole($model->name);
194
            foreach ($model->rolesByRole as $value) {
195
                $remove = $auth->getRole($value);
196
                $auth->removeChild($role, $remove);
197
            }
198
            return $this->redirect(['update', 'id' => $model->name, '#' => 'assign-container-roles']);
199
        }
200
        throw new BadRequestHttpException(Module::t('module', 'Not a valid request to the method!'));
201
    }
202
203
    /**
204
     * Привязываем разрешение
205
     * @return array|\yii\web\Response
206
     * @throws BadRequestHttpException
207
     * @throws \Exception
208
     */
209
    public function actionAddPermissions()
210
    {
211
        $model = new Role([
212
            'scenario' => Role::SCENARIO_UPDATE,
213
        ]);
214
        if ($model->load(Yii::$app->request->post())) {
215
            $auth = Yii::$app->authManager;
216
            $role = $auth->getRole($model->name);
217
            foreach ($model->itemsPermissions as $value) {
218
                $add = $auth->getPermission($value);
219
                // Проверяем, не является добовляемое разрешение родителем?
220
                $result = $this->detectLoop($role, $add);
221
                if (!$result) {
222
                    $auth->addChild($role, $add);
223
                } else {
224
                    Yii::$app->session->setFlash('error', Module::t('module', 'The permission of the "{:parent}" is the parent of the "{:permission}"!', [':parent' => $add->name, ':permission' => $role->name]));
225
                }
226
            }
227
            return $this->redirect(['update', 'id' => $model->name, '#' => 'assign-container-permissions']);
228
        }
229
        throw new BadRequestHttpException(Module::t('module', 'Not a valid request to the method!'));
230
    }
231
232
    /**
233
     * Отзываем разрешение
234
     * @return array|\yii\web\Response
235
     * @throws BadRequestHttpException
236
     */
237
    public function actionRemovePermissions()
238
    {
239
        $model = new Role([
240
            'scenario' => Role::SCENARIO_UPDATE,
241
        ]);
242
        if ($model->load(Yii::$app->request->post())) {
243
            $auth = Yii::$app->authManager;
244
            $role = $auth->getRole($model->name);
245
            foreach ($model->permissionsByRole as $value) {
246
                $remove = $auth->getPermission($value);
247
                $auth->removeChild($role, $remove);
248
            }
249
            return $this->redirect(['update', 'id' => $model->name, '#' => 'assign-container-permissions']);
250
        }
251
        throw new BadRequestHttpException(Module::t('module', 'Not a valid request to the method!'));
252
    }
253
254
    /**
255
     * Deletes an existing Role model.
256
     * If deletion is successful, the browser will be redirected to the 'index' page.
257
     * @param string|int $id
258
     * @return \yii\web\Response
259
     */
260
    public function actionDelete($id)
261
    {
262
        $auth = Yii::$app->authManager;
263
        $role = $auth->getRole($id);
264
        if ($auth->remove($role)) {
265
            Yii::$app->session->setFlash('success', Module::t('module', 'The role "{:name}" have been successfully deleted.', [':name' => $role->name]));
266
        } else {
267
            Yii::$app->session->setFlash('error', Module::t('module', 'Error!'));
268
        }
269
        return $this->redirect(['index']);
270
    }
271
272
    /**
273
     * @param object $parent
274
     * @param object $child
275
     * @return bool
276
     */
277
    protected function detectLoop($parent, $child)
278
    {
279
        $auth = Yii::$app->authManager;
280
        if ($child->name === $parent->name) {
281
            return true;
282
        }
283
        foreach ($auth->getChildren($child->name) as $grandchild) {
284
            if ($this->detectLoop($parent, $grandchild)) {
285
                return true;
286
            }
287
        }
288
        return false;
289
    }
290
}
291