Hola, estaba en la oficina aburrido y para hacer algo util me he puesto a crear una clase para rangos.
¿Como se funciona?Funciona con una base de datos mysql. Los rangos tienen los valores 0 o 1 asignados a las acciones, por ejemplo:

En este caso el moderador tiene permiso para acceder a la accion
zona1Antes de trabajar con esta clase, oviamente hay que llamar a la case
ranks yconectarnos a la base de datos mysql:
mysql_connect("localhost", "root", "password");
mysql_select_db("db");
$rangos = new ranks;
¿Como se agrega una accion?Con la funcion add_action:
$rangos->add_action("panel");
La accion debe de ser unica, la base de datos mysql no permite crear dos con el mismo nombre.
¿Como se elimina una accion? Con la funcion delete_action:
$rangos->delete_action("panel");
¿Como se agrega un rango? Con la funcion new_rank:
$rangos->new_rank("moderador");
No pueden haber dos rangos con el mismo nombre.
¿Como se elimina un rango? Con la funcion delete_rank:
$rangos->delete_rank("moderador");
¿Como se editar una accion para un rango?Con la funcion edit_action:
$rangos->edit_action("moderador", "panel", 1);
Si ponemos 1 es que esta permitido acceder a esa zona, si ponemos 0 es que esta prohibido acceder a esa zona.
¿Como se comprueba que un rango tiene permisos para hacer una accion?Con la funcion allowed:
if($rangos->allowed("moderador", "panel")) {
echo "Bienvenido";
} else {
exit("Esta prohibido");
}
Tambien se pueden poner mas acciones a la vez, pero tienen que estar separadas por coma:
if($rangos->allowed("moderador", "panel, panel2, panel3")) {
echo "Bienvenido";
} else {
exit("Esta prohibido");
}
Extraer todas las acciones en un array:Esto nos puede servir para luego ponerlo por ejemplo en una etiqueta select:
foreach($test->get_actions() as $actions) {
echo $actions.'<br>';
}
Codigo de la clase:
class ranks {
public $exclude_actions;
function __construct() {
$this->exclude_actions = array('id', 'name', 'enable');
}
function get_actions() {
$sql = mysql_query("DESCRIBE ranks;");
while($datos=mysql_fetch_array($sql)) {
if(!in_array($datos['Field'], $this->exclude_actions)) $actions[] = $datos['Field'];
}
return $actions;
}
function add_action($name) {
$query = mysql_query("ALTER TABLE `ranks` ADD `".$name."` BOOL NOT NULL DEFAULT '0' COMMENT 'action', ADD UNIQUE (`".$name."`) ");
return ($query==true) ? 'Accion creada con exito' : 'Error al crear la accion';
}
function delete_action($name) {
$query = mysql_query("ALTER TABLE `ranks` DROP `".$name."`");
return ($query==true) ? 'Accion eliminada con exito' : 'Error al eliminar la accion';
}
function new_rank($name, $enable=1) {
if(!mysql_num_rows(mysql_query("SELECT name FROM `ranks` WHERE `name`='".$name."';"))) { $query = mysql_query("INSERT INTO `ranks` (`name`, `enable`) VALUES ('".$name."', '".$enable."');");
} else return 'El rango ya existe';
return ($query==true) ? 'Rango creado con exito' : 'Error al crear el rango';
}
function delete_rank($name) {
if(mysql_num_rows(mysql_query("SELECT name FROM `ranks` WHERE `name`='".$name."';"))) { $query = mysql_query("DELETE FROM `ranks` WHERE `name`='".$name."';");
} else return 'El rango no existe';
return ($query==true) ? 'Rango eliminado con exito' : 'Error al eliminar el rango';
}
function edit_action($rank, $action, $t) {
$query = mysql_query("UPDATE `ranks` SET `".$action."` = '".$t."' WHERE `name` = '".$rank."';");
return ($query==true) ? 'Accion editada con exito' : 'Error al editar la accion';
}
function allowed($rank, $actions) {
$explode = explode(",", $actions);
unset($actions);
for($i=0;$i<=count($explode)-1;$i++) {
$actions .= ($i!=(count($explode)-1)) ? "`".$explode[$i]."`".',' : "`".$explode[$i]."`";
$where .= ($i!=(count($explode)-1)) ? "`".$explode[$i]."`=1 AND" : "`".$explode[$i]."`=1";
}
$sql = mysql_query("SELECT ".$actions.",`enable` FROM ranks WHERE `name`='".$rank."' AND `enable`=1 AND ".$where.";");
return mysql_num_rows($sql);
}
}
Codigo SQL para ejecutarlo en nuestra base de datos:
CREATE TABLE IF NOT EXISTS `ranks` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`enable` tinyint(1) NOT NULL default '1',
`zona1` tinyint(1) NOT NULL default '0' COMMENT 'action',
PRIMARY KEY (`id`),
UNIQUE KEY `zona1` (`zona1`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
Buenoo, esto es todo. Os ha gustado?

Si teneis alguna sugerencia, publicarla mas abajo.
Un saludo.