Ver Mensaje Individual
  #5 (permalink)  
Antiguo 27/08/2009, 09:43
Avatar de Webstudio
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