Widgets con PHP
by P-los on Sep.01, 2009, under Funciones, Técnicas
En este post voy a exponer un método para crear widgets. Como mencionaba al principio de este blog, parte de mi objetivo al escribir aqui es obtener retroalimentación de su parte con tal de que todos mejoremos en los desarrollos que hacemos.
Lo que estoy haciendo con esto utiliza una base de datos para gestionar que widgets estan disponibles, que paneles tenemos disponibles para mostrarlos y los parámetros que se utilizarán para cada instancia de los widgets. Las tablas tienen la siguiente estructura:
Widgets: Aqui se almacenan los widgets que tenemos disponibles
- IdWidget – Int – PK – Identificador del widget
- Nombre – varchar(30) – Nombre del Widget
- Archivo – varchar(30) – Nombre del archivo que contiene el widget. Incluir la extensión del archivo
- Clase – varchar(30) – Nombre de la clase que representará el widget. Se separa del nombre del archivo para el caso de que haya 2 o más widgets dentro de un mismo archivo de PHP
Paneles: Representa cada una de las zonas capaz de mostrar los widgets, por ejemplo, las columnas derecha e izquierda, un bloque al pie de la página, etc.
- IdPanel – Int – PK – Identificador del panel
- Nombre – varchar(30) – Nombre que tiene el panel
PanelWidget: Indica que widgets se muestran en cada panel
- IdPanelWidget – Int – PK – Identifica a cada uno de los widgets que se mostrarán
- IdPanel – Int – Id del panel al que se hace referencia
- IdWidget – Int – Id del tipo de widget que se utilizará
- Orden – Int – Indica el orden en que se mostrarán los widgets
ParametrosWidget: En caso de que los widgets que tengamos requieran algún tipo de parámetro, aqui es donde se almacenarán
- IdParametro – Int – PK – Identificador del parámetro
- IdPanelWidget – Int – Identifica la instancia del widget para el que se aplicará este parámetro
- NombreParametro – varchar(30) – El nombre del parámetro
- Valor – varchar(100) – El valor del parámetro
En todas estas tablas es posible agregar campos según sean requeridos para nuestra aplicación.
Ya estando en nuestra aplicación de PHP, crearemos una clase abstracta que nos servirá de molde para crear nuestros widgets que estará en un archivo llamado “absWidget.php”:
<?php
abstract class absWidget {
public $params;
public $idPanelWidget = 0;
function ObtenerParametros(){
global $mySql;
$this->params = new ArrayObject();
if($this->idPanelWidget!=0)
{
$res=$mySql->consulta("select NombreParametro, Valor from ParametrosWidget where IdPanelWidget= ".$this->idPanelWidget);
while($arr=$mySql->fetch_assoc($res)){
$this->params[$arr['NombreParametro']]=$arr['Valor'];
}
}
}
abstract function MostrarWidget();
}
?>
En esta clase se está utilizando una variable global llamada $mySql, esta es la clase para conextarse a MySql que expuse tiempo atras, y se crea desde antes, ya sea en el index, o donde se instancía el framework que estemos utilizando / creando).
A continuación sigue la creación del widget propiamente dicho. Como podran imaginarse, ésta hereda de la clase abstracta absWidget. He aquí un ejemplo sencillo:
<?php
require_once ('Framework/modulos/absModulos.php');
class modBuscar extends absModulos {
function MostrarModulo() {
?>
<h1>Buscar</h1>
<form id="modBusqueda" method="get" action="index.php" >
Buscar:<br />
<input type="text" name="busqueda" /><br />
<input type="submit" value="Buscar" />
</form>
<?php
}
}
?>
Este ejemplo lo que hace es solicitar una búsqueda. Ya depende de cada aplicación que se esté haciendo si se utiliza el método POST o el método GET para procesar la llamada al servidor, así como el nombre de las variables. Estos temas no son materia del presente post, así que no los tocaré por el momento.
Lo único que hacemos es crear una función que implemente a MostrarWidget() y lo que hace es, como su nombre lo indica, mostrar el widget que se está creando. Si recuerdan, cada ocasión que se muestra un widget puede tener diferentes parámetros. Para obtener estos parámetros de la base de datos, hay que hacer una llamada a $this->ObtenerParametros(). Una vez hecho esto, los parámetros los tendremos en el array asociativo $this->params[] y podremos utilizarlo a nuestro gusto.
Por último, nos queda llamar desde nuestra plantilla cada uno de los páneles que queremos. Para esto, he aquí una funcion (mal hecho, pero yo la tengo como una función global o estatica) para buscar en la base de datos cuales son los widgets que se mostraran en un panel y mostrarlos:
function MostrarPanel($nombrePanel)
{
global $mySql;
//Obtener los modulos correspondientes a este panel
$res=$mySql->consulta("SELECT idPanelWidget, archivo, clase
FROM paneles
INNER JOIN panelWidget ON paneles.idpanel = panelWidget.idpanel
inner join Widgets on panelWidget.idWidget = Widgets.idWidget
where descripcion = '$nombrePanel'
order by orden");
while($arr=$mySql->fetch_assoc($res))
{
//Instanciar las clases adecuadas
require_once("Framework/Widgets/".$arr['archivo']);
$widget = new $arr['clase']();
$widget->idPanelWidget = $arr['idPanelWidget'];
//Mostrar el contenido del módulo
$modulo->MostrarWidget();
}
}
Una vez teniendo esta, ya podemos llamarla mandandole como parámetro el nombre del panel que vamos a mostrar, por ejemplo:
MostrarPanel('IZQUIERDO');
Esto ya pudiera ser dentro de nuestra plantilla.
Lo único que quedaría pendiente, y lo dejo para cada quien, es un pequeño panel de control para administrar que widgets mostrar en cada panel, en que orden mostrarlos, y que parametros utilizará cada uno de ellos.
November 24th, 2009 on 11:52 am
Hola, interesante de nuevo. Me parece acertada la arquitectura de clases, aunque yo creo que deberías separar las capas de acceso a datos, lógica y vista, de tal forma que cada widget además de tener una clase tiene una (o varias) plantillas asociadas. Con respecto al acceso a datos, en lugar de introducir consultas SQL directamente en las clases recomendaría construir un DAO.
Volviendo al tema de las plantillas, una aplicación con widgets como esta sería compleja de construir con Smarty. Este es uno de los problemas principales por los que defiendo no usar Smarty, sino plantillas en PHP puro.
Un saludo.
November 24th, 2009 on 12:18 pm
Agradezco mucho tus comentarios Isra, y precisamente esta es una de las finalidades por las que he creado este blog, tener retroalimentación productiva.
Saludos!