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

Alguna manera elegante para metadata de Usuarios?? Zend Framework.

Estas en el tema de Alguna manera elegante para metadata de Usuarios?? Zend Framework. en el foro de Zend en Foros del Web. A ver aquellas personas que utilicen más seguido Zend Framework, que ando con un problema más filosófico y conceptual, que otra cosa. Les cuento lo ...
  #1 (permalink)  
Antiguo 25/08/2009, 13:31
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Alguna manera elegante para metadata de Usuarios?? Zend Framework.

A ver aquellas personas que utilicen más seguido Zend Framework, que ando con un problema más filosófico y conceptual, que otra cosa.

Les cuento lo más breve posible para que entiendan la "disyuntiva". En otra aplicación, que no usaba frameworks, tenía dos tablas para guardar metadata. Una era para la metadata (o configuración) del sitio, y otra tabla para guardar metadata de usuarios.

Tabla opciones_sitio
id, nombre_variable, valor.

Tabla usuarios_metadata
id, id_usuario, nombre_variable, valor.

Tenía esta forma, ya que aquí los requerimientos cambiaban constantemente, y era más simple a la hora de guardar distintos valores para los usuarios, que no contemplábamos en un inicio, emulando un poco el mismo concepto que utilizan en Wordpress. Una llamada a getUserOption('nombre_variable') alcanzaba para recuperar el valor.

Ahora quiero emular la misma sencilles de uso, dentro de Zend Framework, tanto para recuperar opciones del sitio dentro de los Controllers, así como las opciones de los usuarios. Para los datos de Config de la aplicación creo que tengo una solución que me cierra, creando por un lado un Modelo para las opciones un plugin para accederlos.

Código PHP:
Ver original
  1. class App_Model_DbTable_SiteOptions extends Zend_Db_Table {}
  2. // Y por otro lado
  3. class App_Plugin_SiteOptions extends Zend_Controller_Plugin_Abstract {}
  4.  
  5. // así puedo utilizar, dentro de un controller
  6. public function fooAction() {
  7.     $from = $this->_helper->siteOptions('from_email');
  8. }

Pero ahora quiero encontrar una solución así de elegante, pero para las opciones de los usuarios. Estas opciones generalmente se accederán desde el Controller o desde las Vistas. Para esto, uno diría que lo lógico es tener un objeto que modele al usuario y agregarle un método para obtener esta metadata. Y aquí es donde tengo el problema. Yo tengo actualmente, una clase que modela a mis Usuarios:

Código PHP:
Ver original
  1. class App_Model_DbTable_Usuarios extends Zend_Db_Table_Abstract {}
  2. //Ejemplo
  3. $users = new App_Model_DbTable_Usuarios();
  4. $singleUser = $users->find(123);

Esta clase, está muy atada a Zend_Db_Table, por lo que no creo que sería del todo correcto que yo implemente un método $metadata = $users->getMetadata('photos'); ya que estaría teniendo que instanciar otro objeto Zend_Db_Table_Abstract adentro del anterior, y se me hace como que queda todo muy feo.

Cómo recomendarían que pueda implementar una manera simple y elegante para recuperar la metadata de estos usuarios? Utilizando un Objeto User y un Gateway que incorpore todos los Zend_Db_Tables que necesite? Alguna otra solución?
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #2 (permalink)  
Antiguo 25/08/2009, 15:57
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: Alguna manera elegante para metadata de Usuarios?? Zend Framework.

Creo que podrias hacer un plugin para el Controller que a su vez vea el objeto user (extendiendolo de Zend_Db_Table_Row) (guardandolo en el registro), y a su vez también hacer un view helper que te brinde la posibilidad de leer los datos también desde el mismo objeto.

Saludos.
  #3 (permalink)  
Antiguo 26/08/2009, 09:53
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Respuesta: Alguna manera elegante para metadata de Usuarios?? Zend Framework.

Me gusta tu propuesta, salvo que en vez de crear un View_Helper, me parece que voy a crear un Action_Helper que pida los datos, y luego injecte en la vista cuando yo se lo indique.

Igualmente, voy a investigar un poco más el modelado de Objetos sin extender directamente de Zend_Db_Table_Abstract para poder tener Gateways distintos. Me parece que la cosa va un poco más por ese lado.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #4 (permalink)  
Antiguo 26/08/2009, 09:55
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: Alguna manera elegante para metadata de Usuarios?? Zend Framework.

Ese es precisamente el nuevo modelo el usar un Data Mapper, que te permite separar la parte del almacenamiento de datos y hacer una capa de logica más robusta.

A lo que yo iba era a extender el tipo de objeto que te devuelve, que tengas un objeto User como tal, que tenga esos métodos y que estos sepan como comunicarse con la base de datos.

Saludos.
  #5 (permalink)  
Antiguo 27/08/2009, 09:43
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Respuesta: Alguna manera elegante para metadata de Usuarios?? Zend Framework.

Al final me decidí...
Para este proyecto en particular, solo voy a implementar los atributos variables para el sitio web (parámetros del sitio) y todo lo que sea datos del usuario, iré modelándolo dentro de Zend_Db_Tables con relaciones, para cargarlas cuando sean necesario.

Les dejo acá la implementación que hice al final de solo los parámetros, por si a alguien le sirve, o si quieren contarme que existe algo más simple para hacer. Primero, el Modelo donde voy a estar guardando y recuperando las opciones desde la base de datos:

Código PHP:
Ver original
  1. <?php
  2. class Banca_Model_DbTable_SiteOptions extends Zend_Db_Table_Abstract
  3. {
  4.         protected $_name = 'Parametros';
  5.         protected $_primary = array('grupo', 'clave');
  6.         protected $_cache = array();
  7.        
  8.         public function get($name, $group = 'default')
  9.         {
  10.             if(!isset($this->_cache[$group])) {
  11.                 $this->_cache[$group] = array();
  12.             }
  13.            
  14.             if(!array_key_exists($name, $this->_cache[$group])) {
  15.                 $this->_cache[$group][$name] = $this->_get($name, $group);
  16.             }
  17.            
  18.             return $this->_cache[$group][$name];
  19.         }
  20.        
  21.         public function set($name, $value, $group = 'default')
  22.         {
  23.             if(!isset($this->_cache[$group])) {
  24.                 $this->_cache[$group] = array();
  25.             }
  26.            
  27.             $this->_set($name, $value, $group);
  28.             $this->_cache[$group][$name] = $value;
  29.         }
  30.        
  31.         private function _get($name, $group)
  32.         {
  33.             $row = $this->find($group, $name)->current();
  34.            
  35.             if(null == $row) {
  36.                 require_once 'Zend/Exception.php';
  37.                 throw new Exception("La clave $group.$name no es un Parametro valido.");
  38.                 return null;
  39.             }
  40.             // Si lo que traemos es un array serializado, lo convertimos.
  41.             if (substr($row->valor, 0, 2) == 'a:') {
  42.                 $row->valor = unserialize($row->valor);
  43.             }
  44.            
  45.             return $row->valor;
  46.         }
  47.        
  48.         private function _set($name, $value, $group)
  49.         {
  50.             //si nos piden guardar un array, lo serializamos primero.
  51.             if(is_array($value)) {
  52.                 $value = serialize($value);
  53.             }
  54.            
  55.             $row = $this->find($group, $name)->current();
  56.  
  57.             if(!$row) {
  58.                 $row = $this->createRow(array(
  59.                     'grupo' => $group,
  60.                     'clave' => $name,
  61.                     'valor' => $value
  62.                 ));
  63.             } else {
  64.                 $row->valor = $value;
  65.             }
  66.  
  67.             $row->save();
  68.         }
  69. }

Y por otro lado, el Action_Helper que creé, para poder utilizar este modelo desde cualquier Action Controller:

Código PHP:
Ver original
  1. <?php
  2. class Banca_Action_Helper_SiteOptions extends Zend_Controller_Action_Helper_Abstract
  3. {
  4.     protected $_model = NULL;
  5.    
  6.     public function getModel()
  7.     {
  8.         if(null == $this->_model) {
  9.             $this->_model = new Banca_Model_DbTable_SiteOptions();
  10.         }
  11.         return $this->_model;
  12.     }
  13.    
  14.     public function direct($nombre, $valor = NULL, $grupo = 'default')
  15.     {
  16.         if(null != $valor) {
  17.             // Guardamos el valor en la base
  18.             return $this->set($nombre, $valor, $grupo);
  19.         } else {
  20.             // Pedimos el valor de la base
  21.             return $this->get($nombre, $grupo);
  22.         }
  23.     }
  24.    
  25.     public function get($nombre, $grupo = 'default') {
  26.         return $this->getModel()->get($nombre);
  27.     }
  28.    
  29.     public function set($nombre, $valor, $grupo = 'default') {
  30.         return $this->getModel()->set($nombre, $valor, $grupo);
  31.     }
  32. }

Entonces, si queremos acceder a algún tipo de parámetro de nuestro sitio, desde un Action Controller, tenemos que hacer lo siguiente:

Código PHP:
Ver original
  1. // En algún lugar del Bootstrap, donde configuren el sitio
  2. // hay que agregar el Action_Helper
  3. Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH.'/plugins/helpers',
  4.                                              'Banca_Action_Helper');
  5. // O también se puede hacer
  6. Zend_Controller_Action_HelperBroker::addHelper(new Banca_Action_Helper_SiteOptions());
  7.  
  8. // Y despues dentro de un Action cualquiera, podemos llamar asi:
  9. public function indexAction() {
  10.     // Obtenemos un valor
  11.     $from = $this->_helper->siteOptions('from_email');
  12.    
  13.     //Guardamos un valor
  14.     $this->_helper->siteOptions('defaultColor', '#ff00cc');
  15. }

Espero que les sirva y cualquier comentario al respecto, me encantaría oirlo.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
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:31.