function filterAuthorizedMenus($idUser, $administrative = 'no') { global $arrConf; require_once "libs/paloSantoACL.class.php"; $pACL = new paloACL($this->_DB); $org_access = ''; $uelastix = FALSE; if (isset($_SESSION)) { $pDB = new paloDB($arrConf['elastix_dsn']['elastix']); if (empty($pDB->errMsg)) { $uelastix = get_key_settings($pDB, 'uelastix'); $uelastix = (int) $uelastix != 0; } unset($pDB); } if ($uelastix && isset($_SESSION['elastix_user_permission'])) { return $_SESSION['elastix_user_permission']; } $superAdmin = $pACL->isUserSuperAdmin($_SESSION['elastix_user']); //el usuario superadmin solo tiene acceso a los modulos administrativos if ($superAdmin && $administrative == 'no') { return NULL; } if (!$superAdmin) { //comprobamos que el modulo puede ser accesado por la organizacion $org_access = "AND ar.organization_access='yes'"; } //obtenemos el id del grupo al que pertecene el usuario $idGroup = $pACL->getUserGroup($idUser); if ($idGroup == false) { return NULL; } //seleccionamos los recuersos a los cuales la organizacion a la que pertenece el usuario tiene acceso //y de eso hacemos uns interseccion con la //union de las acciones permitidas por el grupo al que pertenece el usuario //y las acciones permitidas a el usuario $query = "SELECT ar.id, ar.IdParent, ar.Link, ar.description, ar.Type, ar.order_no \n FROM acl_resource ar JOIN organization_resource ore ON ar.id=ore.id_resource \n JOIN acl_group g ON g.id_organization=ore.id_organization \n WHERE g.id=? AND ar.administrative=? {$org_access} AND ar.id IN \n (SELECT ract.id_resource FROM resource_action ract \n JOIN group_resource_action as gr ON ract.id=gr.id_resource_action \n WHERE gr.id_group=? AND ract.action='access' \n UNION \n SELECT ract.id_resource FROM user_resource_action as ur \n JOIN resource_action ract ON ract.id=ur.id_resource_action \n WHERE ur.id_user=? AND ract.action='access') ORDER BY ar.order_no"; $arrModulesFiltered = array(); $r = $this->_DB->fetchTable($query, TRUE, array($idGroup, $administrative, $idGroup, $idUser)); if (!is_array($r)) { $this->errMsg = $this->_DB->errMsg; return NULL; } foreach ($r as $tupla) { $tupla['HasChild'] = FALSE; $arrModulesFiltered[$tupla['id']] = $tupla; } //Leer el nombre de todos los menus dentro de acl_resource $r = $this->_DB->fetchTable('SELECT ar.id, ar.IdParent, ar.Link, ar.description, ar.Type, ar.order_no, 1 AS HasChild ' . "FROM acl_resource ar WHERE ar.administrative=? {$org_access} ORDER BY ar.order_no", TRUE, array($administrative)); if (!is_array($r)) { $this->errMsg = $this->_DB->errMsg; return NULL; } $allMenus = array(); foreach ($r as $tupla) { $tupla['HasChild'] = FALSE; $allMenus[$tupla['id']] = $tupla; } //resolveoms referencia a los niveles superiores $menuMenus = array(); foreach (array_keys($arrModulesFiltered) as $k) { if ($arrModulesFiltered[$k]['Type'] == 'module') { $menuMenus[$k] = $k; } $kp = $arrModulesFiltered[$k]['IdParent']; if (isset($allMenus[$kp])) { //menu de segundo o tercer nivel $menuMenus[$kp] = $kp; //se hace esta verificacion para que loe menus de primer nivel sean incluidos if (isset($allMenus[$kp]['IdParent'])) { $menuMenus[$allMenus[$kp]['IdParent']] = $allMenus[$kp]['IdParent']; } } } // Copiar al arreglo filtrado los menús de primer nivel y segundo nivel EN EL ORDEN LEÍDO $arrMenuFiltered = array_intersect_key($allMenus, $menuMenus); if ($uelastix) { $_SESSION['elastix_user_permission'] = $arrMenuFiltered; } return $arrMenuFiltered; }