/** 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; }