Cita: No creo que sea el más indicado para dar mi opinión (de hecho no he aportado nada en este tema por qué mi fuerte no es ni OOP, ni XML ni teoría sobre modelo de datos). Pero bueno .. ahí vá para lo que pueda servir.
Como todo esto es software libre, sí eres el más indicado para dar tu opinión.
Cita: Creo que al meter el pre-procesador de expresiones regulares ya va a bajar considerablemente el rendimiento de tu sistema de plantillas y casi se va a semejar a cualquier otro común que se basan simplemente en un buen motor de expresiones regulares (las compatibles con Perl). Todo lo que ganastes con tu "SAXparser" lo vas a perder al meter expresiones regulares ..
Pues tendré que buscar otro sistema, quizá usando el HTMLParser de HarryF.
porque interpretar sólo cuando sea necesario es importante.
Cita: Pero, si tu sistema de "templates" no dispone de la funcionalidad para definir bloques .. mmm no serviría de mucho a nivel práctico, no crees?. Es decir .. yo como "usuario" de sistema de templates lo que les pido es que me deje crear bloques y "parsear" las variables de forma más o menos cómoda como hasta el momento parece que lo es tu sistema de templates.
Es que no creo que sea necesario, porque -si entiendo como tú el concepto de bloque- cada objeto de la clase Template representa un bloque en sí mismo...
En cristiano, en mis aplicaciones yo tengo mis plantillas organizadas de esta manera:
Código:
plantillas/layout.html
plantillas/foros/lista.html
plantillas/foros/hilo.html
plantillas/foros/hilos.html
plantillas/foros/ultimos_hilos.html
Y un objeto Template/Plantilla para cada una, a su vez cada uno contendría el modelo de datos de cada de plantilla (valor de las variables).
Es que desde mi punto de vista, de esta forma encaja de una forma más "estricta" en el patrón MVC (o el requetereinventado jeje).
Un ejemplo siempre lo aclara todo, o casi:
Podríamos tener este index.php con la llamada al controlador, URL podría contener los parámetros:
Código:
index.php?mod=foros&accion=listar
Código PHP:
//index.php
...
<?php
$controlador =& new Controlador();
$controlador -> getVista();
?>
/*
*Controlador.class.php
un objeto por cada "bloque"
más un objeto como "bloque principal" el
que define el layout.
*/
class Controlador {
...
function getVista(){
...
//de algún modo construyo una clase Vista
//en función de los dos parámetros de la URL.
//$vista es el objeto que generaría la lista de foros
//o esto, o se construye normalmente
//invocando al constructor, es =
$mgr =& TemplateManager::getInstance();
$main =& $mgr -> getTemplate('plantillas/layout');
$main -> expose('vista', $vista );
//a lo mejor le queremos añadir más datos
//a la plantilla ppal, (y en consecuencia a
//todas las vistas "hijas")
//tópafuera.
$main -> process();
}
}
Y otro punto donde se usan las plantillas como bloques, los objetos vista que sobreescriben el mismo método (para llamarlos sin preocuparte exactamente qué vista estás mostrando):
Código PHP:
class VistaForos {
//el objeto datos contiene a $_POST y variables del estilo
function imprimir( $datos ){
//recupero el array de objetos
//$listaDeForos de la petición.
//doy por supuesto que la he creado en
//"otro lado"
//idem que arriba
$mgr =& new TemplateManager();
$plantilla =& $mgr -> geTemplate('plantillas/foros/lista.html');
$plantilla -> expose('lista', $listaDeForos );
//tópafuera!!
$plantilla -> process();
}
}
Bien, se me está quedando un poco ladrillo, pero ya acabo con lo más importante. En el controlador yo le paso un objeto vista a la plantilla que contiene el layout. Desde la plantilla (desde la lógica de la presentación) llamo a la(s) vista(s) para que generen la presentación. El código de abajo lo aclara todo, creo.
De todas formas, lo dicho es aplicable a casi cualquier sistema de plantillas, tanto si usan PHP como lógica de presentación, XML, comentarios o sabe dios qué.
En mi caso, XML incrustado, necesito implementar una nueva etiqueta del estilo de éstas:
Código:
<incluir-vista nombre="vista_ppal"/>
En el otro caso,
Código PHP:
$vista -> imprimir( $datos );
Código PHP:
//la plantilla contiene
<html><body>
<div id="cabecera">
...
</div>
<div id="vista">
<incluir-vista nombre="principal"/>
</div>
<div id="columnaIzquerda">
...
</div>
</body></html>
todo esto para que luego pensemos en diferentes conceptos de bloques