como hacer un log de usuario en linea

edited julio 2008 in FAQ
el proposito es generar una tabla
con el id del usuario y fecha hora de inicio y termino.

para esto lo vamos hacer con una clase.
version: Kumbia 0.47
paso 1
tener una variable de session con el id del usuario, para esto se puede obtener del login.
// $this->Usuarios->id  obtiengo el id de la Tabla usuarios
Session::set_data('usuarios_id', $this->Usuarios->id);
paso 2
crear la siguiente tabla:
CREATE TABLE `logs` (                                   
          `id` int(4) NOT NULL auto_increment,                  
          `usuarios_id` int(4) default NULL,                    
          `fecha_at` datetime default NULL,                     
          `fecha_in` datetime default NULL,                     
          `ip` varchar(16) default NULL,                        
          PRIMARY KEY  (`id`)                                   
        )  
Paso 3
crear una carpeta en lib/
llamada Fidelio
y una archivo llamado online.php
lib/Fidelio/online.php
y en el archivo
forms\config\core.ini
agregar la libreria
; Cargar los modulos de Kumbia en lib
[modules]
extensions = kumbia.tags, kumbia.logger, kumbia.utils, fpdf.main, excel.main, Fidelio.online

[kumbia]
dbdate = YYYY-MM-DD
controller_dir = controllers
models_dir = models
views_dir = views


paso 4
online.php
<?php
class Online{
	public function __construct(){
		
	}
	public function saveUser($id){
		$lastid				=	Session::get("logs_id");
		$rec				=	new Logs();
		$rec->find($lastid);
		$rec->usuarios_id	    =	$id;
		$rec->ip		       =	$_SERVER['REMOTE_ADDR'];
		$rec->save();
		if($rec->select_one("LAST_INSERT_ID()")!=0)
			Session::set("logs_id", $rec->select_one("LAST_INSERT_ID()"));
	}
}
?>

ahora en todas las paginas colocar el sigte codigo:
Online::saveUser(Session::get("usuarios_id"));
ej:
function index(){
  Online::saveUser(Session::get("usuarios_id"));
/* codigo */
}
function insert(){
  Online::saveUser(Session::get("usuarios_id"));
/* codigo */
}
function before_insert(){
  Online::saveUser(Session::get("usuarios_id"));
/* codigo */
}
function delete(){
  Online::saveUser(Session::get("usuarios_id"));
/* codigo */
}
function buscar(){
  Online::saveUser(Session::get("usuarios_id"));
/* codigo */
}
function etc(){
  Online::saveUser(Session::get("usuarios_id"));
/* codigo */
}
paso 5
visualizar el reporte:

craer un ApplicationController
logs_controller.php
<?php
class LogsController extends ApplicationController  {
	//static public $force = true;
	public $scaffold = true;
	public $template = "menu";
	function __construct(){

	}
	function index(){
		$this->fecha	=	fentrada($this->request("fecha"));
		if($this->fecha!="//"){
			$this->items	=	$this->Logs->find("fecha_in BETWEEN '$this->fecha 00:00:00' AND '$this->fecha 23:59:59'", "order: id desc");
		}else{
			$this->fecha	=	date("Y/m/d");
			$this->items	=	$this->Logs->find("fecha_in BETWEEN '$this->fecha 00:00:00' AND '$this->fecha 23:59:59'", "order: id desc");
		}
	}
}
?>

vista
view/index.phtml
<span class="label"><?= date("d/m/Y H:m:s")?></span>


<?= form_tag("logs") ?>
<div align="center">
<? $fecha	= fsalida($fecha); ?>
	<?= text_field_tag("fecha", "class: label", "size: 10", "value: $fecha") ?>
	<?= submit_tag("Ir")?>
</div>
<?= end_form_tag() ?>
<p>
</p>
<table align="center" width="80%">
<tr class="tabla_grupos">
	<th>Usuario</th>
	<th>Fec. y hora de inicio</th>
	<th>Fec. y hora de término</th>
</tr>
<? 
$class		=	"browse_primary";
foreach ($items as $item): 
$aTmp_1		=	explode(" ",$item->fecha_at);
$aTmp_2		=	explode(" ",$item->fecha_in);
$fecha_ini	=	fsalida($aTmp_1[0])." ".$aTmp_1[1];
$fecha_fin	=	fsalida($aTmp_2[0])." ".$aTmp_2[1];
$usuarios	=	$Usuarios->find($item->usuarios_id);
?>
<tr class="<?= $class ?>">
	<td><?= $usuarios->nombre ?></td>
	<td align="center"><?= $fecha_ini ?></td>
	<td align="center"><?= $fecha_fin ?></td>
</tr>
<? 
if($class=="browse_primary")
	$class = "browse_secondary";
else 
	$class	=	"browse_primary";
endforeach; ?>
</table>

Comentarios

  • edited 6:32
    se me olvidaba.
    en las librerias de kumbia agrege como cambiar el formato de las fechas.

    ej:
    fsalida($cad) = fecha de salida (como debe ser vista por el usuaro
    "d/m/Y)

    fentrada($cad2) = fecha de entrada (como debe la fecha para la base de datos mysql "Y/m/d")

    copiar y agregar en el archivo

    lib/kumbia/utils.php
    function fentrada($cad){
    	$uno=substr($cad, 0, 2);
    	$dos=substr($cad, 3, 2);
    	$tres=substr($cad, 6, 4);
    	$cad2 = ($tres."/".$dos."/".$uno);
    	return $cad2;
    }
    function fsalida($cad2){
    	$tres=substr($cad2, 0, 4);
    	$dos=substr($cad2, 5, 2);
    	$uno=substr($cad2, 8, 2);
    	$cad = ($uno."/".$dos."/".$tres);
    	return $cad;
    }
    
  • Buena FiDeLio, te invito a que descargues la versión 0.5-RC1 para que pruebes las nuevas funcionalidades que ofrecen mayor flexibilidad por ejemplo todo este procedimiento lo puedes cargar como un helpers...

    Gracias...
  • edited 6:32
    la descarge me parece perfecta, pero todavia estoy esperando la documentacion.

    Ya que en estos momentos estoy haciendo una app con la version 0.47 y es bastante robusta, he aprendido y hecho varias cosas interesantes y las estaré pubicando en el FAQ.
  • edited 6:32
    Sería interesante que en el título de cada post indicaras a qué versión de Kumbia pertenece.

    Otra cosa, aclaro que no soy un experto de POO en php, pero veo que usas esto:
    Online::saveUser(Session::get("usuarios_id"));

    ¿No deberías declarar el método como static para usarlo así? Tal como lo tienes ahora, el acceso al método debería ser así:
    Online.saveUser(Session::get("usuarios_id"));
  • edited 6:32
    me parece buena tu idea, yo tambien estoy aprendiendo.
    lo voy a cambiar a static, pero lo utilizo con :: por que el ide con el que trabajo me autocompleta (zend studio).
Sign In or Register to comment.