/** * Define role privileges ( ACL role <-> module <-> route ) * * @access public * @return ViewModel */ public function privilegesAction() { $id = $this->params('id'); /* @var $query \Utilities\Service\Query\Query */ $query = $this->getServiceLocator()->get('wrapperQuery'); $em = $query->entityManager; $roleObj = $query->find('Users\\Entity\\Role', $id); $rolePrivileges = $query->findBy('Users\\Entity\\Acl', array('role' => $roleObj)); $request = $this->getRequest(); if ($request->isPost()) { // delete old privileges foreach ($rolePrivileges as $p) { $query->remove($p); } // insert new privileges $data = $request->getPost()->toArray(); if (isset($data['privileges'])) { foreach ($data['privileges'] as $p) { list($module, $route) = explode("-", $p); $aclEntity = new AclEntity(); $aclEntity->setModule($module); $aclEntity->setRoute($route); $aclEntity->setRole($roleObj); $em->persist($aclEntity); } } $em->flush(); $url = $this->getEvent()->getRouter()->assemble(array('action' => 'index'), array('name' => 'roles')); $this->redirect()->toUrl($url); } $manager = $this->getServiceLocator()->get('ModuleManager'); $loadedModules = $manager->getLoadedModules(); $excludedModules = $loadedModules['CertigateAcl']->getConfig()['roles_management']['excluded_modules']; $filtereModules = []; foreach ($loadedModules as $k => $v) { if (!in_array($k, $excludedModules)) { $filtereModules[$k] = $v; } } $roleRoutes = []; foreach ($rolePrivileges as $p) { $roleRoutes[] = implode("-", [$p->getModule(), $p->getRoute()]); } foreach ($filtereModules as $module => $object) { $routes = array_keys($object->getConfig()['router']['routes']); $newRoutes = []; foreach ($routes as $r) { if (in_array(implode("-", [$module, $r]), $roleRoutes)) { $newRoutes[] = ['name' => $r, 'checked' => true]; } else { $newRoutes[] = ['name' => $r, 'checked' => false]; } } $modulesRoutes[] = ['module' => $module, 'routes' => $newRoutes]; } return new ViewModel(['modulesRoutes' => $modulesRoutes, 'role' => $roleObj]); }