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<?php
class Banca_Model_DbTable_SiteOptions extends Zend_Db_Table_Abstract
{
protected $_name = 'Parametros';
protected $_primary = array('grupo', 'clave'); protected $_cache = array();
public function get($name, $group = 'default')
{
if(!isset($this->_cache
[$group])) { $this->_cache
[$group] = array(); }
$this->_cache[$group][$name] = $this->_get($name, $group);
}
return $this->_cache[$group][$name];
}
public function set($name, $value, $group = 'default')
{
if(!isset($this->_cache
[$group])) { $this->_cache
[$group] = array(); }
$this->_set($name, $value, $group);
$this->_cache[$group][$name] = $value;
}
private function _get($name, $group)
{
$row = $this->find($group, $name)->current();
if(null == $row) {
require_once 'Zend/Exception.php';
throw new Exception("La clave $group.$name no es un Parametro valido.");
return null;
}
// Si lo que traemos es un array serializado, lo convertimos.
if (substr($row->valor, 0, 2) == 'a:') { }
return $row->valor;
}
private function _set($name, $value, $group)
{
//si nos piden guardar un array, lo serializamos primero.
}
$row = $this->find($group, $name)->current();
if(!$row) {
$row = $this->createRow(array( 'grupo' => $group,
'clave' => $name,
'valor' => $value
));
} else {
$row->valor = $value;
}
$row->save();
}
}
Y por otro lado, el Action_Helper que creé, para poder utilizar este modelo desde cualquier Action Controller:
Código PHP:
Ver original<?php
class Banca_Action_Helper_SiteOptions extends Zend_Controller_Action_Helper_Abstract
{
protected $_model = NULL;
public function getModel()
{
if(null == $this->_model) {
$this->_model = new Banca_Model_DbTable_SiteOptions();
}
return $this->_model;
}
public function direct($nombre, $valor = NULL, $grupo = 'default')
{
if(null != $valor) {
// Guardamos el valor en la base
return $this->set($nombre, $valor, $grupo);
} else {
// Pedimos el valor de la base
return $this->get($nombre, $grupo);
}
}
public function get($nombre, $grupo = 'default') {
return $this->getModel()->get($nombre);
}
public function set($nombre, $valor, $grupo = 'default') {
return $this->getModel()->set($nombre, $valor, $grupo);
}
}
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// En algún lugar del Bootstrap, donde configuren el sitio
// hay que agregar el Action_Helper
Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH.'/plugins/helpers',
'Banca_Action_Helper');
// O también se puede hacer
Zend_Controller_Action_HelperBroker::addHelper(new Banca_Action_Helper_SiteOptions());
// Y despues dentro de un Action cualquiera, podemos llamar asi:
public function indexAction() {
// Obtenemos un valor
$from = $this->_helper->siteOptions('from_email');
//Guardamos un valor
$this->_helper->siteOptions('defaultColor', '#ff00cc');
}
Espero que les sirva y cualquier comentario al respecto, me encantaría oirlo.