Bueno ese fue un ejemplo que me vino a la mente, yo por decir me encontre hace poco con un problema, tengo una clase que se encarga de hacer "modulos", o sea maneja las altas, bajas, modificaciones, y busquedas de una tabla, todo por una misma clase.
Esta clase implementa muchisimas otras clases, entre ellas una que es DataTable que se encarga de hacer una tabla de datos a partir de un Query SQL, esta tabla a su vez incorpora una clase Formatter que se encarga de "dibujar" cada celda y cada header de forma dinamica, (por decir si tengo idUsuario => Clave de Usuario).
El problema era como podia yo desde mi clase heredada de mi clase modulo decirle a la clase DataTable que usara otro formateador, y mi solucion fue usar metodos estaticos, asi ya podia hablar directamente con DataTable sin tener que estar asiendo "trucos".
Te pongo parte del codigo para que veas:
Código PHP:
import( "com.uscconsultores.*" );
/**
* Class porEncuestaModule
*
* Esta clase se encarga de proveer los metodos de actualizacion, edicion
* borrado, etc. de cada tabla de la base de datos.
*
* @package com.uscconsultores
* @author Christopher Valderrama <[email protected]>
* @copyright Copyright (c) 2006
* @version $Id$v1.0$26 Jul 2006
* @access public
**/
class porEncuestaModule extends GeckoModuleManager {
private $encuestaID; // @var int private Guarda el ID de Encuesta actual
private $tabla; // @var string private Guarda la Tabla actual
private $nowFields = array(); // @var array private guarda los campos a los cuales hay que darles por defecto el valor de "hoy"
/**
* Constructor
*
* Crea una instancia de nuestra clase, y establece algunos parametros nescesarios
*
* @param string $name Nombre del modulo
* @param array $settings Settings para el modulo
* @param int $encuestaID ID de la encuesta actual
* @param string $tabla Nombre de la Tabla
* @param array $nowFields Campos en los que se llena "hoy"
**/
public function __construct( $name, $settings, $encuestaID, $tabla, $nowFields ) {
$this->encuestaID = $encuestaID;
$this->tabla = $tabla;
$this->nowFields = $nowFields;
/**
* Establecemos que las tablas van a usar un formateador USC
**/
GeckoDataTable::setDefaultFormatter( new USCFormatter() );
parent::__construct( $name, $settings );
}
/**
* newRecord
*
* Este metodo es llamado una vez que se ha procesado y validado la forma Web
* agrega el campo nescesario de idEncuesta, y agrega la fecha de hoy para los
* campos que la requieran.
*
* @param array $form_fields
* @access protected
* @return mixed $id El id Auto Generado en la BD (si aplica)
* @throws Exception cuando hay un error de insercion en la BD
**/
protected function newRecord( $form_fields ) {
$form_fields['idEncuesta'] = $this->encuestaID;
if( is_array( $this->nowFields ) && ( count( $this->nowFields ) > 0 ) ) {
foreach( $this->nowFields as $field ) {
$form_fields[$field] = date( "Y-m-d" );
}
}
return parent::newRecord( $form_fields );
}
/**
* buildBrowse
*
* Este metodo construye el query para generar el Table, y obtener los
* campos de la base de datos.
*
* @access protected
* @return string El query generado limitado a datos por encuesta
**/
protected function buildBrowse() {
$fields = $this->buildQueryFields(); // Este metodo interno, selecciona los campos definidos en el XML
$query = "SELECT %s FROM %s WHERE `idEncuesta`='%s'";
$query = sprintf( $query, $fields, $this->tabla, $this->encuestaID );
return $query;
}
}