<?php 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								/**
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 * Created by Error202
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 * Date: 15.08.2017
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 */
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								namespace backend\controllers;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use backend\forms\rbac\RbacEditRoleForm;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use backend\forms\rbac\RbacUpdateChildren;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use core\services\PermissionManager;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yii\behaviors\TimestampBehavior;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use backend\forms\rbac\RbacCreateRoleForm;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use core\services\RoleManager;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yii\data\ArrayDataProvider;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yii\web\Controller;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yii\filters\VerbFilter;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yii\filters\AccessControl;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use Yii;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class RoleController extends Controller
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    private $_role;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    private $_permission;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function __construct($id, $module, RoleManager $role, PermissionManager $permission, $config = [])
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        parent::__construct($id, $module, $config);
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        $this->_role       = $role;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $this->_permission = $permission;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    /**
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     * @inheritdoc
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								     */
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function behaviors()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            [
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                'class' => TimestampBehavior::class,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'access' => [
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                'class' => AccessControl::class,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'rules' => [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    [
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        'actions' => ['create', 'view', 'index', 'update', 'delete'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        'allow'   => true,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        'roles'   => ['UserManagement'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    [    // all the action are accessible to admin
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        'allow' => true,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        'roles' => ['admin'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ],
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            'verbs'  => [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'class'   => VerbFilter::class,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'actions' => [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    'delete' => ['POST'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function actionIndex()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        $data = $this->_role->getRolesListArray();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $dataProvider = new ArrayDataProvider([
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            'allModels'  => $data,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'pagination' => [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'pageSize' => 20,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ],
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            'sort'       => [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                'attributes' => ['name', 'description'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            ],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return $this->render('index', ['dataProvider' => $dataProvider]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function actionCreate()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $form = new RbacCreateRoleForm();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if ($form->load(Yii::$app->request->post()) & &  $form->validate()) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            try {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                $this->_role->create($form->name, $form->description, $form->rule_name, $form->data);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return $this->redirect(['view', 'id' => $form->name]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } catch (\DomainException $e) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                Yii::$app->errorHandler->logException($e);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                Yii::$app->session->setFlash('error', $e->getMessage());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        }
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return $this->render('create', [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'model' => $form,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function actionUpdate($id)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $role = $this->findModel($id);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $form = new RbacEditRoleForm($role);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if ($form->load(Yii::$app->request->post()) & &  $form->validate()) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            try {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                $this->_role->update($role->name, $form->name, $form->description, $form->rule_name, $form->data);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return $this->redirect(['view', 'id' => $form->name]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } catch (\DomainException $e) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                Yii::$app->errorHandler->logException($e);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                Yii::$app->session->setFlash('error', $e->getMessage());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        }
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return $this->render('update', [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'model' => $form,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function actionDelete($id)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        try {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            $this->_role->delete($id);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } catch (\DomainException $e) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            Yii::$app->errorHandler->logException($e);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            Yii::$app->session->setFlash('error', $e->getMessage());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        }
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return $this->redirect(['index']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public function actionView($id)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        $currentRole      = $this->_role->getRole($id);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $rolesSelectArray = array_diff_assoc($this->_role->getRolesSelectArray(), [$currentRole->name => $currentRole->description]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $itemsForm = new RbacUpdateChildren();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if ($itemsForm->load(Yii::$app->request->post()) & &  $itemsForm->validate()) {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            $this->_role->saveChildren($id, $itemsForm->roles, $itemsForm->permissions);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            Yii::$app->session->setFlash('success', Yii::t('user', 'Children roles and permissions for "{role}" is updated.', ['role' => $currentRole->description]));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        $rolesSelected = $this->_role->getRolesSelectArrayByRole($id);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        $permissionsSelectArray = $this->_permission->getPermissionsSelectArray();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $permissionsSelected    = $this->_permission->getPermissionsSelectArrayByRole($id);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        $itemsForm->roles       = $rolesSelected;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        $itemsForm->permissions = $permissionsSelected;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return $this->render('view', [
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            'model'               => $this->findModel($id),
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'roles'               => $rolesSelectArray,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'permissions'         => $permissionsSelectArray,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            'itemsForm'           => $itemsForm,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ]);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    protected function findModel($id)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    {
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        return $this->_role->getRole($id);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}