Пример #1
0
 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;
 }