Foros del Web » Programando para Internet » PHP » Zend »

Seguimiento de usuarios

Estas en el tema de Seguimiento de usuarios en el foro de Zend en Foros del Web. Buen dia. Estoy intentando hacer un seguimiento de usuarios para guardar el ip de usuario, la fecha, las urls que visitan y que formularios envia ...
  #1 (permalink)  
Antiguo 13/06/2011, 09:34
 
Fecha de Ingreso: marzo-2010
Mensajes: 71
Antigüedad: 14 años
Puntos: 24
Seguimiento de usuarios

Buen dia.

Estoy intentando hacer un seguimiento de usuarios para guardar el ip de usuario, la fecha, las urls que visitan y que formularios envia (solo saber si envia, no guardo los datos).

Como deseo que guarde estos datos con cada pagina, cree un plugin para esto. En la funcion preDispatch añadi el codigo para guardar los datos en la base de datos. El problema es que al parecer este preDispatch se repite varias veces creando 5 registros por cada pagina. Tambien intente con las demas alternativas (dispatchLoopStartup(), dispatchLoopShutdown() etc etc) pero siempre me genera mas de un 1 registro.

Como puedo guardar estos datos una sola vez con cada pagina que se cargue? estoy bien al usar un plugin?

Gracias
  #2 (permalink)  
Antiguo 13/06/2011, 10:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Seguimiento de usuarios

Puedes tener un flag en el plugin para indicar si ya guardo el registro, ej:
Código PHP:
Ver original
  1. class My_Plugin {
  2.        private $_stored = false;
  3.  
  4.       public function preDispatch($Request) {
  5.             if ($this->_stored !== false)  {
  6.                     // Guardas
  7.                     $this->_stored = true;
  8.             }
  9.       }
  10. }

Saludos.
  #3 (permalink)  
Antiguo 13/06/2011, 10:28
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Seguimiento de usuarios

Si bien con lo que te comenta GatorV debería funcionar, también debería funcionar con dispatchLoopStartup o dispatchLoopShutdown, seguro que no estas tirando un request de mas o tengas algún broken reference ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 13/06/2011, 14:54
 
Fecha de Ingreso: marzo-2010
Mensajes: 71
Antigüedad: 14 años
Puntos: 24
Respuesta: Seguimiento de usuarios

Ya habia intentado con lo del flag. Igual crea 3 registros. Con algunas funciones como dispatchLoopStartup() me tira un error:
Strict Standards: Declaration of Application_Plugin_CheckUser::dispatchLoopStartup( ) should be compatible with that of Zend_Controller_Plugin_Abstract::dispatchLoopStart up() in [...ruta del archivo...]
No se bien que significa el error, aunque igual guarda los registros.

Es raro, incluso si hago un echo 'algun string'; sale solo una vez(incluso dentro de la funcion del modelo).

Dejo el codigo:
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Application_Plugin_UserLogs extends Zend_Controller_Plugin_Abstract
  4. {
  5.  
  6.     //Instancia del Zend_Auth
  7.     private $_auth;
  8.     //guardar
  9.     private $_saved = false;
  10.  
  11.     public function __construct()
  12.     {
  13.         $this->_auth = Zend_Auth::getInstance();
  14.     }
  15.  
  16.     public function dispatchLoopShutdown()
  17.     {
  18.         if(!$this->_saved)
  19.         {
  20.             $userLog = array(
  21.                 // DATA
  22.             );
  23.  
  24.             $userLogsTable = new Application_Model_DbTable_UserLogs();
  25.             $userLogsTable->save($userLog);
  26.            
  27.             $this->_saved = true;
  28.         }
  29.     }
  30.  
  31. }
Modelo
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Application_Model_DbTable_UserLogs extends Zend_Db_Table_Abstract
  4. {
  5.  
  6.     protected $_name = 'user_logs';
  7.     protected $_primary = 'log_id';
  8.  
  9.     public function save($data)
  10.     {
  11.         $this->insert($data);
  12.     }
  13. }

Lo hice bien simple para probar. No conosco otra manera de hacerlo, alguna idea?

Cita:
seguro que no estas tirando un request de mas o tengas algún broken reference ?
Como verifico eso?

Gracias
  #5 (permalink)  
Antiguo 13/06/2011, 15:06
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Seguimiento de usuarios

El error te esta diciendo que la declaración del método no es igual a la del parent

esto:

Código PHP:
Ver original
  1. public function dispatchLoopStartup()

debería ser esto:

Código PHP:
Ver original
  1. public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)

Y para comprobar que no haya request de mas, elimina todo código en el controller y vista, para hacer lo mismo con algun broken reference, deja en blanco el layout y los phtml's, esto último se da cuando pones mal una ruta de alguna imagen, css o js.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 14/06/2011, 05:08
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Seguimiento de usuarios

Agrego que se me paso, también puedes tener un broken reference en las rutas a imágenes dentro del css y como nota una buena opción para evitar utilizar un flag en el plugin es: Zend_Controller_Front::unregisterPlugin

Código PHP:
Ver original
  1. public function dispatchLoopShutdown()
  2. {
  3.     $data = array(
  4.         // DATA
  5.     );
  6.  
  7.     $logger = new Application_Model_DbTable_UserLogs();
  8.     $logger->save($data);
  9.  
  10.     $fc = Zend_Controller_Front::getInstance();
  11.     $fc->unregisterPlugin($this);
  12. }
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 14/06/2011, 07:21
 
Fecha de Ingreso: marzo-2010
Mensajes: 71
Antigüedad: 14 años
Puntos: 24
Respuesta: Seguimiento de usuarios

Ahi acabo de probar eliminando el contenido del layaout, controller, y view.
Y wow, funciono muy bien! Ahora me tengo que recorrer todo el codigo para ver que es lo que esta apuntando mal.

Pasa esto porque cual querer abrir un archivo que no existe zend manda un 404 y por eso es el request extra, asi funciona?

Muchas gracias masterpuppet
  #8 (permalink)  
Antiguo 14/06/2011, 07:40
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Seguimiento de usuarios

Cita:
Iniciado por RatoN7 Ver Mensaje
Pasa esto porque cual querer abrir un archivo que no existe zend manda un 404 y por eso es el request extra, asi funciona?
Es por el .htaccess, se redirige todo aquello que no sea un fichero o un directorio si en el .htaccess filtraras ademas por extensión(css, js, jpg, etc), no tendrías este problema.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 14/06/2011, 09:11
 
Fecha de Ingreso: marzo-2010
Mensajes: 71
Antigüedad: 14 años
Puntos: 24
Respuesta: Seguimiento de usuarios

Claro, ahi ya acomode las rutas y ademas modifique el .htaccess para que no vuelva a pasar.

Dejo por si a alguien le sirve:
Código htaccess:
Ver original
  1. SetEnv APPLICATION_ENV development
  2.  
  3. RewriteEngine On
  4.  
  5. #Añadido para identificar extensiones
  6. RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|swf|php|ico|txt|pdf|xml)$ [OR]
  7.  
  8. RewriteCond %{REQUEST_FILENAME} -s [OR]
  9. RewriteCond %{REQUEST_FILENAME} -l [OR]
  10. RewriteCond %{REQUEST_FILENAME} -d
  11. RewriteRule ^.*$ - [NC,L]
  12. RewriteRule ^.*$ index.php [NC,L]

Tema solucionado, gracias masterpuppet

Etiquetas: frameworks-y-php-orientado-a-objetos, seguimiento, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:50.