示例#1
0
 /** Añade o borra permisos de una accion de algun objeto.   	
  *  1º parametro: Se debe pasar un array donde cada elemento del mismo
  *  tiene el objeto accion que se desea dar permiso,  
  *  y el objeto al cual se le permite la accion.
  *  El 2º parametro es el objeto el cual concede el permiso
  *  El 3º parametro se especifica si no se omitieron todos los permisos, por lo caul
  *  se debe realziar los borrados de los permisos q quedaron en la BD, el parametro es un
  *  array de 21 elementos, donde el primero es la accion (q no se permitira mas) y el segundo
  *  es la clase a la cual no se le permitira la accion
  * */
 public static function refreshObjectPermission($permissions = false, $action_object, $delete_permissions = false)
 {
     global $ari;
     //valido q el 1º parametro sea un array
     if (!is_array($permissions)) {
         return false;
     }
     //valido q el 2º parametro (o sea el objeto q permite la accion) sea un objeto
     if (!is_object($action_object)) {
         return false;
     }
     //saco la clase y el id del objeto q permite la accion, ya q es comun
     $action_object_id = $ari->db->qMagic($action_object->id());
     $action_object_class = $ari->db->qMagic(get_class($action_object));
     //algunas variables q usare
     $query_delete = array();
     $i = 0;
     $array_store = array();
     //recorro el aray permission y reacomo los elementos de forma q me quede un array donde
     //cada elemento queda con la forma
     //$array_store[id de accion][clase del objeto q le cedo el permiso][ indice incremental ] = id del objeto al q le cedo el permiso
     //esto me permite agrupar los elementos a los cuales le concedo una accion y pertenecen a la misma clase,
     //esto me permite reducir la cantidad de consultas q deberia hacer
     foreach ($permissions as $p) {
         if (isset($p['action']) || isset($p['allowed_object'])) {
             if (is_a($p['action'], "seguridad_action") && is_object($p['allowed_object'])) {
                 $array_store[$p['action']->get('action')][get_class($p['allowed_object'])][$i] = $p['allowed_object']->id();
                 $i++;
             }
             //end if
         }
         //end if
     }
     //end if
     //voy a formar el array de consultas q ejecutare en la transaccion
     $array_query = array();
     //voy recorriendo el array por id de accion (o sea la primer clave del array $array store)
     foreach (array_keys($array_store) as $a) {
         //ahora para cada accion recorro los elmentos a los q cedo el permiso y son de la misma clase
         //o sea por la segunda key del array
         foreach (array_keys($array_store[$a]) as $c) {
             //formo un string con los id de los elementos nuevos a los q le cedere el permiso
             //para usarlo en una clausula in
             $flagFirst = true;
             foreach ($array_store[$a][$c] as $i) {
                 if ($flagFirst) {
                     $array_store[$a][$c]['in'] = $ari->db->qMagic($i);
                     $flagFirst = false;
                 } else {
                     $array_store[$a][$c]['in'] .= "," . $ari->db->qMagic($i);
                 }
             }
             //end foreach
             //armo la consulta de eliminacion, es decir elimino
             //todos los elementos permitdos q no esten entre los nuevos permisos
             $aQmagic = $ari->db->qMagic($a);
             $cQmagic = $ari->db->qMagic($c);
             $array_query[] = "DELETE FROM Security_ObjectPermission\n\t\t\t\t   \t\t\t WHERE ActionID = {$aQmagic}\n\t\t   \t\t   \t\t\t AND ActionObjectID  = {$action_object_id}  \n\t\t  \t   \t\t\t\t AND ActionObjectClass = {$action_object_class}   \n\t\t       \t\t\t\t AND AllowedObjectClass = {$cQmagic}\n\t\t       \t\t\t\t AND AllowedObjectID NOT IN (" . $array_store[$a][$c]['in'] . ");";
             //armo la consulta de insercion multiple filas, inserto los nuevos
             //elementos q ya no esten registrados
             $array_query[] = "INSERT INTO `Security_ObjectPermission` \n\t\t\t\t\t\t\t (`ActionID`, `ActionObjectID`, `ActionObjectClass`, `AllowedObjectID`, `AllowedObjectClass`)\n\t\t\t\t\t\t\t SELECT {$aQmagic}, {$action_object_id}, {$action_object_class}, ID, {$cQmagic} \n\t\t\t\t\t\t\t FROM " . seguridad::getTableName($c) . " WHERE ID IN (" . $array_store[$a][$c]['in'] . " )\n\t\t\t\t\t\t \t AND ID NOT IN \n\t\t\t     \t\t\t (SELECT AllowedObjectID\n\t\t   \t  \t\t\t\t FROM Security_ObjectPermission \n\t\t   \t   \t\t\t\t WHERE ActionID = {$aQmagic}  \n\t\t       \t\t\t\t AND ActionObjectID  = {$action_object_id}  \n\t\t\t       \t\t\t AND ActionObjectClass = {$action_object_class}   \n\t\t         \t\t\t AND AllowedObjectClass = {$cQmagic});";
         }
         //end foreach
     }
     //end foreach
     //realizo la transaccion
     if (is_array($array_query)) {
         // comienzo la transaccion
         $ari->db->StartTrans();
         //borro los items que no se seleccionaron, vienen en el 3º parametro
         if (is_array($delete_permissions)) {
             foreach ($delete_permissions as $d) {
                 if (isset($d['allowed_class']) && isset($d['action'])) {
                     if (trim($d['allowed_class']) != "" && is_a($d['action'], "seguridad_action")) {
                         $class = $ari->db->qMagic($d['allowed_class']);
                         $action_id = $ari->db->qMagic($d['action']->get('action'));
                         $array_query[] = "DELETE FROM Security_ObjectPermission\n\t\t\t   \t\t\t\t\t\t\t  WHERE ActionID = {$action_id}  \n\t\t   \t   \t\t\t\t\t\t\t  AND ActionObjectID  = {$action_object_id}  \n\t\t  \t   \t\t\t\t\t\t\t  AND ActionObjectClass = {$action_object_class}   \n\t\t       \t\t\t\t\t\t\t  AND AllowedObjectClass= {$class} ";
                     }
                     //end if
                 }
                 //end if
             }
             //end foreach
         }
         //end if
         //ejecuto las demas acciones
         foreach ($array_query as $sql) {
             $ari->db->Execute($sql);
         }
         //end foreach
         if (!$ari->db->CompleteTrans()) {
             throw new OOB_exception("Error en DB: {$ari->db->ErrorMsg()}", "010", "Error en la Base de Datos", false);
             //return false;
         } else {
             return true;
         }
         //end if
     }
     //end if
     return false;
 }