Autor Tema: Clase para rangos  (Leído 475 veces)

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Clase para rangos
« en: 22 de Abril de 2010, 17:34:20 pm »
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 zona1

Antes 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.&#39;<br>&#39;;
}


Codigo de la clase:

class ranks {
public 
$exclude_actions;
function 
__construct() {
$this->exclude_actions = array(&#39;id&#39;, &#39;name&#39;, &#39;enable&#39;);
}
function 
get_actions() {
$sql mysql_query("DESCRIBE ranks;");
while(
$datos=mysql_fetch_array($sql)) {
if(!
in_array($datos[&#39;Field&#39;], $this->exclude_actions)) $actions[] = $datos[&#39;Field&#39;];
}
return 
$actions;
}

function 
add_action($name) {
$query mysql_query("ALTER TABLE `ranks`  ADD `".$name."` BOOL NOT NULL DEFAULT &#39;0&#39; COMMENT &#39;action&#39;,  ADD UNIQUE (`".$name."`) ");
return (
$query==true) ? &#39;Accion creada con exito&#39; : &#39;Error al crear la accion&#39;;
}

function 
delete_action($name) {
$query mysql_query("ALTER TABLE `ranks` DROP `".$name."`");
return (
$query==true) ? &#39;Accion eliminada con exito&#39; : &#39;Error al eliminar la accion&#39;;
}

function 
new_rank($name$enable=1) {
if(!
mysql_num_rows(mysql_query("SELECT name FROM `ranks` WHERE `name`=&#39;".$name."&#39;;"))) { $query mysql_query("INSERT INTO `ranks` (`name`, `enable`) VALUES (&#39;".$name."&#39;, &#39;".$enable."&#39;);");
} else return &
#39;El rango ya existe&#39;;
return ($query==true) ? &#39;Rango creado con exito&#39; : &#39;Error al crear el rango&#39;;
}

function 
delete_rank($name) {
if(
mysql_num_rows(mysql_query("SELECT name FROM `ranks` WHERE `name`=&#39;".$name."&#39;;"))) { $query mysql_query("DELETE FROM `ranks` WHERE `name`=&#39;".$name."&#39;;");
} else return &
#39;El rango no existe&#39;;
return ($query==true) ? &#39;Rango eliminado con exito&#39; : &#39;Error al eliminar el rango&#39;;
}

function 
edit_action($rank$action$t) {
$query mysql_query("UPDATE `ranks` SET `".$action."` = &#39;".$t."&#39; WHERE `name` = &#39;".$rank."&#39;;");
return (
$query==true) ? &#39;Accion editada con exito&#39; : &#39;Error al editar la accion&#39;;
}

function 
allowed($rank$actions) {
$explode explode(","$actions);
unset(
$actions);
for(
$i=0;$i<=count($explode)-1;$i++) {
$actions .= ($i!=(count($explode)-1)) ? "`".$explode[$i]."`".&#39;,&#39; : "`".$explode[$i]."`";
$where .= ($i!=(count($explode)-1)) ? "`".$explode[$i]."`=1 AND" "`".$explode[$i]."`=1";
}
$sql mysql_query("SELECT ".$actions.",`enable` FROM ranks WHERE `name`=&#39;".$rank."&#39; AND `enable`=1 AND ".$where.";");
return 
mysql_num_rows($sql);
}

}


Codigo SQL para ejecutarlo en nuestra base de datos:
Citar
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?  :D Si teneis alguna sugerencia, publicarla mas abajo.
Un saludo.  :)
« Última modificación: 22 de Abril de 2010, 21:13:13 pm por marco811 »

Comunidad PHPeros

Clase para rangos
« en: 22 de Abril de 2010, 17:34:20 pm »

Desconectado javipilo

  • PHPero Experto
  • *****
  • Mensajes: 975
  • Karma: 31
  • Sexo: Masculino
    • Ver Perfil
Re:Clase para rangos
« Respuesta #1 en: 22 de Abril de 2010, 19:37:52 pm »
Muy bueno te ganaste un +10000 pero como solo puedo darte +1 xD luego te doy otro más cuando pase la hora.

PD: Me sirvió bastante

Saludos ;)

Desconectado chihue

  • PHPero Master
  • ******
  • Mensajes: 1.118
  • Karma: 43
  • Sexo: Masculino
  • 8 dias
    • Ver Perfil
    • Minichat con todo incluido
Re:Clase para rangos
« Respuesta #2 en: 22 de Abril de 2010, 19:47:32 pm »
Muy bueno te ganas +1

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Clase para rangos
« Respuesta #3 en: 22 de Abril de 2010, 19:53:17 pm »
jejej, lo que hace el aburrimiento en la oficina  :P
Gracias por los karmas  :)

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:Clase para rangos
« Respuesta #4 en: 22 de Abril de 2010, 21:00:24 pm »
Buen aporte pero actualizate a PHP 5, en php 5 se utiliza public en vez de var.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Clase para rangos
« Respuesta #5 en: 22 de Abril de 2010, 21:05:38 pm »
Buen aporte pero actualizate a PHP 5, en php 5 se utiliza public en vez de var.
:D :D estoy usando   php5 y me funciona a la perfecion

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:Clase para rangos
« Respuesta #6 en: 22 de Abril de 2010, 21:07:27 pm »
:D :D estoy usando   php5 y me funciona a la perfecion
Te puedo ir bien ahora pero luego en PHP 6 seguro que no te funcionara. Var es obsoleto, en php 5 no sé usa var sino public.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado marco811

  • PHPero Avanzado
  • ****
  • Mensajes: 306
  • Karma: 16
  • Sexo: Masculino
  • ¡¡Hola mundo!!
    • Ver Perfil
    • Personalidad Web
Re:Clase para rangos
« Respuesta #7 en: 22 de Abril de 2010, 21:12:34 pm »
ok, ya lo cambiare  ;)