Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

estrategias para implementar un motor de plantillas

Estas en el tema de estrategias para implementar un motor de plantillas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, Espero generar aquí una buena discusión de la que todos aprendamos algo. Llevo unos días haciendo un experimento[1] para implementar un motor ...

  #1 (permalink)  
Antiguo 08/09/2003, 13:00
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Sonrisa estrategias para implementar un motor de plantillas

Hola a todos,
Espero generar aquí una buena discusión de la que todos aprendamos algo. Llevo unos días haciendo un experimento[1] para implementar un motor de plantillas a partir de un intérprete SAX de XML. (Que quede claro, que sólo es un proyecto personal, no pretendo hacerle sombra a otros motores).
Y así poder generar la vista de un pequeño CMS basado en la arquitectura Modelo-Vista-Controlador, de la cual se ha hablado en otro hilo.
Bien, después de tener algo más de 100 líneas de código, he decidido que el experimento ya ha concluido y es hora de implementarlo como dios manda.
Según he investigado en otros foros[2] se puede utilizar o bien un intérprete SAX, o la extensión PHPDOM o implementar una máquina de estados[3] para procesar un archivo HTML con etiquetas especiales que representen la (poca) lógica de cada plantilla. (Digo poca, porque la idea NO es crear un lenguaje nuevo, sólo separar la lógica del negocio de la persentación, además, tampoco es necesario sobrecargarla)
Personalmente implementar una máquina de estados me parece un poco bestia, aunque en los foros de sitepoint[3] dara buenos resultados en cuanto a rendimiento sobre todo.
Usar PHPDOM sería ideal, pero no me gusta nada que sea una extensión experimental, así que yo por lo menos descarto su uso.
Tragándome código de otros motores de plantillas, veo que hacen mucho uso de expresiones regulares para localizar bloques, variables,... un enfoque que todavía no me queda claro para el modelo de plantillas que uso (más abajo hay un ejemplo de plantilla, no obstante en mi página[1] hay ejemplos).
Una muy interesante, que Harry Fuecks hizo con SimpleT [4], como PHP en sí mismo es un motor de plantillas, utilizarlo como tal, pero teniendo en mente la separación de lógica del negocio, modelo de datos y presentación. Interesante sí, pero yo me he "emperrado" en usar un lenguaje para las pantilllas basado en XML. :)
Y por último usar un intérprete SAX, como hago actualmente, lo que se me plantean problemas para organizar bien el código o diseñar bien la aplicación. Además, ¿hasta qué punto es eficiente usar un SAX "parser"?
A parte que el intérprete ignora los comentarios y las declaraciones DOCTYPE, un fallo feo y peludo. cómo solucionar eso?
¿Qué estrategía seguiríais? ¿Cómo?

Siendo este el modelo de una plantilla bastante simple:
Código:
<html>
<head><title>${titulo}</title></head>
<body>
<list name="amiguetes" as="amiguete">
<a href="${amiguete.url}">${amiguete.nombre}</a><br/>
</list>
</body>
</html>
Y correspondiéndole el siguiente código en PHP:
Código PHP:
$view =& new Template('plantilla.html');
$view -> expose('titulo''PHPMarker Test');
$lista[0] = array( 'url' => '...''nombre' => 'pepito');
...
//añadimos más registros a la lista
...
$view -> expose('amiguetes'$lista );
$view -> process(); //muestra la plantilla 
La etiqueta <list> lista los elementos de la lista $lista, eso parece que salta a la vista, y mediante el método expose() de la clase Template (que contiene una instancia del Parser, mirad el código completo en [1]) añadimos los valores de las variables de cada plantilla.
Sabiendo esto último, había pensado delegar el trabajo de cada etiqueta especial -al estilo de las Custom Tags de las JavaServerPages pero no tan complejas- (porque habrá alguna etiqueta más como transformaciones de texto y un bloque condicional) en clases para así conseguir una aplicación flexible, que no sea extremadamente complicado y engorroso añadirle funcionalidad y mantener en otra clase el modelo de cada plantilla (las listas y variables que se añaden con el expose() ). Pero teniendo en cuenta la naturaleza de PHP (es intepretado), no me parece buena idea tener muchas clases/archivos implicados en generar una sola página. (no es lógico no?) Así que en cuanto a "repartir el trabajo" no sé cómo hacerlo.

Entonces, cómo lo vemos señores? Qué ideas tenéis? Qué os parece lo que os planteo?
Siento el pedazo ladrillo que he escrito al final, espero impaciente nuevos puntos de vista :D

Aquí los links:
[1] http://people.javahispano.org/vitxo/phpmarker/
[2] http://www.sitepointforums.com/forum...hp?forumid=147
[3] http://www.sitepointforums.com/showt...ighlight=state
[4] http://simplet.sf.net/
  #2 (permalink)  
Antiguo 08/09/2003, 13:19
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Brillante exposicion. Una pena que ultimamente no me meta en asuntos tan interesantes (el trabajo es lo primero y hay poco tiempo para experimentar, soy un vago).

Pero hay una cosa de tu mensaje que me ha llamado la atencion. Tu plantilla. Me recuerda enormemente a un ejemplo de XSL que vi en www.w3schools.com , el ejemplo del for-each. Si los datos en lugar de meterlos con funciones, simplementes generas el XML y aplicas el XSL, ya tendrias la salida. Eso si, no se como resultaria a nivel de rendimiento aplicar el XSL al XML generado dinamicamente y hacerlo en el servidor.

Bueno, siento no haber aportado nada. Sigue con el proyecto y buena suerte. Nunca se sabe. Quizas creas la "siguiente gran cosa" del mundo de las templates.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 08/09/2003, 17:06
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola Josemi,
las plantillas están inspiradas en las de Freemarker (http://www.freemarker.org/), un motor de plantillas opensource desarrollado en Java, bastante majo.
Había pensado realizar las transformaciones con XSLT, pero las deseché por la misma razón que no uso el propio PHP como motor. Además, en un futuro cercano o lejano me gustaría poder transformar el texto asi por ejemplo:
Código:
<transform name="cut" lenght="300">texto muy laaaaaargo</transform>
Y que sacara los primeros 300 caracteres más unos puntos suspensivos por ejemplo, pero para eso tengo que plantear bien el tema de las clases que se encargan del trabajo "sucio" de cada etiqueta.
He estado leyendo sobre cómo funciona el sistema de etiquetas de las JavaServerPages, y sería viable implementarlo en PHP (algo muy parecido, sobre todo sin llegar a definir archivos XML para mapear las librerías de etiquetas, aunque serían interesante igualmente).
Pero bueno, por hoy me he calentado bastante la sesera ya.

buenas noches, nos leemos.
  #4 (permalink)  
Antiguo 10/09/2003, 08:01
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
He estado rumiando el tema de implementar algo parecido a las custom tags de las páginas JSP, para delegar el trabajo de cada etiqueta especial de la plantilla en una clase, llamada TagHandler, cuyo prototipo esbozo a continuación:
Código PHP:
<?php
if ( defined('ABSTRACT_TAG') ) { return; }
define('ASBTRACT_TAG'true );
define('EVAL_BODY'0);
define('SKIP_BODY'1);
define('EVAL_PAGE'2);
class 
AbstractTag {
    var 
$body;
    
    function 
doStartTag($attributes, &$model){}
    function 
setBodyContent($body){
        
$this->body body;
    }
    function 
doInitBody(&$model){}
    function 
doAfterBody(&$model){}
    function 
doEndTag(&$model){}
}
?>
Todos los TagHandlers heredarían de esta clase abstracta, pero a partir de aquí todo se empieza a volver bastante engorroso y complicado... alguien conoce alguna otra alternativa para ganar flexibilidad?
  #5 (permalink)  
Antiguo 10/09/2003, 16:50
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
No es por monopolizar el hilo y tal, pero en este hilo también se está hablando de este tema: estrategias orientadas a objetos para abordar un motor de plantillas.
  #6 (permalink)  
Antiguo 12/09/2003, 10:42
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Bueno, me consuela ver que por lo menos hay lectores de este hilo... no escriben, pero leen :)

He optado por seguir usando el intérprete SAX y ahora cada etiqueta especial de la plantilla (como la que uso para recorrer arrays) se corresponde con una clase que se encarga de su trabajo sucio, así que ahora lo tengo bastante más fácil para extender el comportamiento de cada plantilla, porque sólo hay que implementar clases hijas de ésta:
Código PHP:
class AbstractTagHandler {
    
    var 
$body;
    
    function 
setBodyContent$body ){  $this->body $body; }    
    function 
process( &$model ){}
    function 
addProperty$key$value ){}

El 'núcleo' de la aplicación ya no lo tengo q modificar, al menos, para extender las funcionaliades.
Cuando termine de poner en orden la página del proyecto y se me resuelva el lío que tengo con la clave pública subiré el código al CVS público. Avisaré.
  #7 (permalink)  
Antiguo 14/09/2003, 07:12
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Bien, debería haber caido antes en lo que me ocurre ahora, pero bueno cuando hay prisas por medio, ocurren estas cosas.

Bien, ahora que he conseguido poder implementar nuevas etiquetas de forma bastante simple, me planteo ¿cómo manejar etiquetas anidadas?
Aquí un par de etiquetas anidadas:
Código:
<if expression="isError">
  <p align="justify">Han ocurrido algunos errores mientras procesábamos el formulario...
  <ul>
  <list name="errorList" as="error">
    <li>${error}</li>
  </list>
  </ul>
  Por favor corríjalos y vuelva a intentarlo.
  </p>
</if>
Debería poder relacionar las dos etiquetas entre sí, como etiqueta padre y etiquetas hijas... para lo cual PHPDOM es ideal! pero ya digo que no lo quiero usar porque es experimental.
Así que podríamos tener una instancia de la etiqueta padre con una pila interna con todas las instancias a las etiquetas hijas. Pero joder, ahora la cosa se complica un poco más porque cada etiqueta debería contener su propio modelo de datos y el de la etiqueta hija(s). bufff... se pone peludo eh??

alguien tiene alguna idea? Huelo mal? Escribo mal? Soy aburrido? Nadie contesta? BUAAAAAA

Por cierto, cual sería la expresión regular que me encaje con la declaración <!DOCTYPE html PUBLIC "..." "...">?

un saludo.

Última edición por vitxo; 14/09/2003 a las 07:15
  #8 (permalink)  
Antiguo 14/09/2003, 13:26
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

Supongo que el motivo de tan pocas respuestas sea que la mayoria de nosotros nos dedicamos a cosas mas "terrenales" con PHP.

Cada vez que leo este mensaje, cada vez me recuerda mas a las clases de Compiladores en la uni: que si pila, que si maquina de estados finitos, .... Y es que realmente es lo que estas haciendo: un compilador de lenguaje de plantilla a HTML.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #9 (permalink)  
Antiguo 14/09/2003, 13:59
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Sí tienes razón, tendré que cogerme este año de teoría de autómatas y lenguajes formales. :)
Pero antes de que empiecen las clases seguiré "chapuceando un poco", porque podría mantener árboles de acciones y cada llamada al método process() de una acción padre llamaría también a sus acciones hijas (las etiquetas anidadas). Aunque también se complican un poco más las cosas...
Ya subí el código al CVS del proyecto: http://www.sourceforge.net/projects/phpmarker

nos leemos, vitxo.
  #10 (permalink)  
Antiguo 14/09/2003, 14:12
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Ah, TALF, las gramaticas, que tiempos aquellos, ...

Aunque ahora que me doy cuenta, mas que un compilador seria un interprete, ya que en este caso del if seria simplemente ignorar su "cuerpo" si no se cumple la condicion. Eso si, puedes exigir un parseo previo para verificar la valided de la sintaxis.

Y como todo en la ciencia, la bas ees la paciencia y experimentar, y un poco de suerte para encontrar la respuesta pronto

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #11 (permalink)  
Antiguo 03/10/2003, 05:59
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Quizá pueda utilizar este documento como base para desarrollar un intérprete del lenguaje de las plantillas de forma más o menos decente :)

http://www.dina.dk/~sestoft/programm...arsernotes.pdf
  #12 (permalink)  
Antiguo 11/01/2004, 07:18
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola de nuevo, después de tanto tiempo offline!
Sigo con mi proyectillo de motor de plantillas, hace tiempo que no lo toco pero ya funciona.
Estoy pensando en pasar de intérprete SAX para tratar el XHTML de cada plantilla y usar DOM, de esta manera puedo tratar más fácilmente con las etiquetas especiales.
Mi pregunta es: estoy desarrollando bajo PHP4.X, la extensión DOMXML es experimental y todavía queda un rato para que PHP5 sea "estable" (por llamarlo de alguna manera), así que alguien ha probado a implementar su propio DOM? Vale la pena? Hay alguna librería de terceros que tenga más garantías que el módulo oficial?

un saludete.
  #13 (permalink)  
Antiguo 12/01/2004, 04:53
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Sí sí, soy un pesao. jeje
En este hilo (http://www.sitepointforums.com/showt...94#post1065194) se habla de otra forma de aplicar el intérprete SAX y añadirle filtros, se asemeja bastante a lo que tengo hecho solo que parece más serio, porque ahora mismo mi parser hace un poco lo que quiere cuando quiere (el código fuente está en el cvs del proyecto: http://www.sourceforge.net/projects/phpmarker).
Había pensado tb usar la funcion xml_parse_into_struct(...), que devuelve dos arrays que puedes recorrer como si de un árbol se tratara, pero no me termina de convencer.
De hecho, con SAX y una pila puedo controlar el tema de las etiquetas anidadas, la verdad que podría haber caido antes, algo parecido me entró en un examen de algoritmos y estructuras de datos hace 3 años.
Otra cosa bastante interesante es "compilar" las plantillas HTML a PHP (traducir las variables, bucles y condiciones a código PHP) para ganar rapidez y almacenar así una copia en "caché", de tal manera que no tengo que interpretar siempre la plantilla, sólo cuando cambie. Pero claro, a partir de ahi ya todo son pajas mentales, estamos en enero; tengo que dejar de hablar solo en los foros y ponerme a estudiar en serio :)
  #14 (permalink)  
Antiguo 12/01/2004, 05:19
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 9 meses
Puntos: 16
Hola,

No eres un pesado, simplemente que te apasiona lo que haces. Es uno de los problemas de la programacion.
Cita:
De hecho, con SAX y una pila puedo controlar el tema de las etiquetas anidadas
No estoy familiarizado con SAX, pero las etiquetas anidadas me suena a recursividad. Y hay si viene bien una pila.

Y lo de compilar la plantilla deberia ser obligatorio. En programacion siempre se dice que para que vas a hacer las cosas muchas veces, cuando solo necesitas hacerla una (por ejemplo, si puedes calcular un valor antes del bucle, para que lo vas a calcular dentro de el x veces). Por muy rapido que sea el motor de plantillas, parsear la plantilla sera mucho mas lento (normalmente) que ejecutar la version compilada. La compilacion puede ser un proceso costoso, pero solo lo tienes que hacer una vez (cada vez que cambie la plantilla).

Personalmente, uso como motor de plantilla el propio PHP. Me siento mas comodo con el codigo fuente (soy programador, no diseñador).

Suerte.

PD: ¿Por que no publicas la documentacion de desarrollo? Ya sabes, diagramas UML o cosas por el estilo. Seria interesante para ver la "evolucion" en el desarrollo de un proyecto complejo. O incluso un weblog, "Diario de un desarrollo (o como programar un motor de plantillas sin morir en el intento)".
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #15 (permalink)  
Antiguo 12/01/2004, 06:08
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Usar PHP para la representar la lógica de la presentación es lógico, valga la reduncancia, de hecho Harry Fuecks ( http://www.phppatterns.com/) ha hecho un motor de plantillas super simple, potente y versátil (de hecho se llama SimpleTemplate hehe http://simplet.sf.net/)

Con respecto a la documentación y demás: estoy escribiendo un articulillo o manual (todavía no sé cómo llamarlo) sobre cómo no morir en el intento, pero me lo tomo con relativa tranquilidad, de hecho, desde octubre hasta diciembre el desarrollo estuvo completamente parado (mira la estadísticas del proyecto en SF.net jeje)
Y tener un weblog, podría tener uno tranquilamente, pero por lo pronto me conformo con mi página personal que hace las suyas de weblog (a través de SSH pero bueno jeje).

Cuando tenga noticias las dejaré caer por aquí.

nos leemos!
  #16 (permalink)  
Antiguo 16/01/2004, 17:07
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
He estado chapuceando esta tarde, otra vez. Estos últimos dias en los foros de SitePoint ha habido movimiento bastante productivo y he solucionado el problema de las etiquetas anidadas según postearon en este hilo (http://www.sitepoint.com/forums/show...7&postcount=35).
Bien, eso está bien, a excepción que tal y como está ahora no puedo iterar sobre una matriz, pero sí puedo realizar iteraciones anidadas de listas independientes.

Claro que, en mi lista de To-Do tengo apuntado "compilar"(más bien traducir) mi lenguaje XML de la plantilla a PHP y guardar una copia "compilada".
Entonces digo yo: no me tengo que preocupar más que de traducir ese código XML a PHP! noo?? Joer, perdón por la expresión, por lo menos suena más fácil que crear todo un intérprete para un lenguaje nuevo. (ya no tendría que preocuparme de distinguir entre variables escalares, de tipo array asociativo, de tipo array multidimensional, de tipo objeto, de arrays de objetos, de arrays de ...)
Aunque bueno, visto así ya ha perdido parte de su gracia... pero de paso me ahorro unos cuantos dolores de cabeza!
Por lo menos, puedo reutilizar el intérprete SAX para recorrer la plantilla por primera vez y "compilarla", y si necesito etiquetas que no tengan su operación correspondiente en PHP (como el if/else, foreach) puedo aplicar la idea de un TagHandler por etiqueta especial.

cómo lo ves josemi? :)

Última edición por vitxo; 16/01/2004 a las 17:44
  #17 (permalink)  
Antiguo 16/01/2004, 20:07
Avatar de polecat  
Fecha de Ingreso: diciembre-2003
Ubicación: Argentina
Mensajes: 391
Antigüedad: 20 años, 3 meses
Puntos: 0
Cómo me gustaría saber tanto como uds.!!
__________________
Juan Manuel
Diseño web/Gráfico & Ilustración
E-mail: [email protected] / Skype: jmbosi
Portfolio: www.facebook.com/hacelobiendesign
  #18 (permalink)  
Antiguo 16/01/2004, 23:29
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 4 meses
Puntos: 69
VixTo, te he leido tanto aqui como en SitePoint y la verdad, temo que estés reinventando una rueda ya creada por Harry Fuecks con su sistema de Templates basado en Componentes, que lo que hace es exactamente eso: compila de un sistema declarativo con XML ( utilizando XML_HTMLSax - también nacido en SitePointForums como el parser de estados que interpreta XML mal formado ) y los convierte en código PHP directamente, generando un "árbol" de componentes en runtime, basandose en el Composite Design Pattern.
Te diria que le heches un vistazo ( será uno largo, porque es un sistema por demás complejo de implementar, para que sea sencillo de utilizar y extender ).

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #19 (permalink)  
Antiguo 17/01/2004, 06:02
Colaborador
 
Fecha de Ingreso: julio-2002
Ubicación: Buenos Aires
Mensajes: 699
Antigüedad: 21 años, 8 meses
Puntos: 1
holas.........
bue.......anduve leyendo lo de arriba (no todo)........y la verdad, que no entendi absolutamente NADA......simplemente decirles...."mierda que saben!!!".

muchachos, los admiro a distancia (no se quienes son ni donde viven, por eso a distancia)..........por todo lo q saben (ojala llege a eso....calculenlen para el año 5263)...

Salu2 y suerte con el proyecto.

PD: NO ES QUE QUIERA MOLESTAR CON ESTE MENSAJE, PERO QUEDE IMPACTADO CON LO QUE LEI.
  #20 (permalink)  
Antiguo 17/01/2004, 07:16
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Corteh, yo soy vitxo, vivo en Valencia, España. (Sí, de donde es el Mr. President Ansar jeje)

Webstudio, en el primer post de Sitepoint lo digo tranquilamente: estoy reinventando la rueda, no soy original. No es más que un reto personal, frase que también menciono en la página del proyecto.

De todas formas, creo que ya voy viendo el camino(aunq lo q he hecho hasta ahora no ha dado malos resultados!), estaba dando palos de ciego desarrollando un nuevo intérprete de lenguaje. Y no tengo que llegar a tanto, no es necesario. Pero eso será otra batalla que librar, por lo pronto me conformo con estudiar Señales y Sistemas que dentro de "ná" empiezo los exámenes

lo dicho, cuando tenga más noticias aviso :)
  #21 (permalink)  
Antiguo 17/01/2004, 15:38
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Oye, supongamos que tengo la siguiente variable con el consiguiente contenido:
Código PHP:
$contents = ' <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
<head>
  <title><?php echo $title?></title>

</head>
<body>

        <?php foreach ($lista as $item) { ?>
            <?php echo $item?>
        <?php ?>
        
    </body>

</html>
'
La movida es que ya puedo "compilar" esas plantillas a PHP! La verdad que no ha sido dificil, he reutilizado todo el trabajo anterior que tenia: el intérprete SAX y las clases para cada etiqueta (TagHandlers).
En el tutorial correspondiente de Sitepoint 8Beyond the tempate engine ejecutan plantillas con código PHP incrustado, pero como no uso la funcion include() el objeto Template escupe el código sin interpertar.
  #22 (permalink)  
Antiguo 17/01/2004, 15:47
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
bufff, me auto respondo! Rescatando de los comentarios de http://www.php.net/eval este truco:
Código PHP:
eval("?".chr(62).$contens.chr(60)."?"); 
Qué buen rollo, la pena es que justo por épocas de exámenes es cuando mejor me salen las cosas y cuando más ideas tengo!

jeje, nos leemos!
  #23 (permalink)  
Antiguo 18/01/2004, 10:34
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Por lo pronto todo esto funciona, a ver si luego en un ratín lo pongo online. La condición de cada bloque IF acepta cualquier forma de condición de PHP :)
Código de una plantilla:
Código:
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" >
  <head>
    <title>${title}</title>
  </head>
  <body>
    <if condition="error">
      <p>Ha ocurrido un error, o al menos eso indica ${error}</p>
    </if>

    <if condition="1 < 2">
	<p>1 es menor que 2, siempre!</p>
    </if>
    <if condition="(14%2) == 0">
	<p>El 14 es par</p>
    </if>
   <if condition=" ( 14 % 7) == 0">
	<p>Adems, el 14 es mltiplo de 7</p>
   </if>
	<table id="month" cellspacing="0" cellpadding="0" border="1">	
		<thead>
			<tr>				
				<th>L</th>
				<th>M</th>
				<th>X</th>
				<th>J</th>
				<th>V</th>
				<th>S</th>
				<th>D</th>
			</tr>
		</thead>
		<list name="mes" as="semana">
		<tr>
			<list name="semana" as="dia">
				<td>${dia}</td>
			</list>
		</tr>
		</list>
	
	</table>
	</body>
</html>

Última edición por vitxo; 18/01/2004 a las 10:39
  #24 (permalink)  
Antiguo 15/03/2004, 12:21
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Hola a todos! -otra vez-

con el motivo de que estoy preparando la documentación del proyectillo (phpmarker) se me ha ocurrido una posible mejora -sustancial- en cuanto al intérprete de XML.

Hasta ahora estoy cogiendo todo el contenido de la plantilla HTML y se lo paso directamente al parser. De forma que ignora el DOCTYPE, los comentarios y me complica un poco la vida porque el intérprete del lenguaje de mis plantillas no debería preocuparse de la sintaxis del documento xHTML.

Camino a seguir(??): detectar "bloques de código" en la plantilla mediante expresiones regulares y "pasear" (en realidad intrepretar) sólo esos trozos?
Suena bien, pero no sé si al meter expresiones regulares por medio el rendimiento que gano optimizando el SAXParser lo pierdo analizando todo el documento en busca de bloques como:
Código:
....
<p> lalalala ...
   <ul>
   <list name="lista" as="elemento">
      <li>${elemento.propiedad}</li>
    </list>
...
Espero dejar claro que el bloque es sólo lo marcado en negrita.

cómo lo ven? Lo terminaré implementando igual
  #25 (permalink)  
Antiguo 15/03/2004, 12:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
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.

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 ..

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.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #26 (permalink)  
Antiguo 15/03/2004, 13:08
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 4 meses
Puntos: 69
Bueno, yo soy de los que piensa de que mientras que se gane velocidad, que importa el metodo que se use. En el caso de un parser de TEmplates, lo que más importa a la hora de trabajar, es la velocidad con la que se reconozcan los los tags y se reemplacen. Por eso, cuando vie un Parser Sax-like hecho ENTERAMENTE En PHP y utilizando la complejísima función strpos() () no pude más que aplaudir.

El tema es que no hay que quedarse ahi. Entonces, cuál es el siguiente paso ? Bueno, que los tags estáticos se cambien por algún componente dinámico, y no sea necesario volver a utilizar el parser, hasta que el contenido de los templates no cambie nuevamente. Y nos quedamos alli ? Tampoco, también se puede cachear el contenido de un template y guardarlo en un archivo estático. Y más? Bueno, si podríamos poner un servidor Dual Xeón con 8 Gigas de Ram y no hacer uso del disco rígido, pero eso ya es irse a los extremos, no?

Entonces, sería lo siguiente :

Tags predefinidos -> Código PHP Dinámico -> contenido estático.

De esta manera, se podría ganar realmente mucha velocidad en el trabajo con templates. El método por el que trabaje el parser, es lo de menos, lo importante es que el parser trabaje lo menos posible.

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #27 (permalink)  
Antiguo 15/03/2004, 13:30
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
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
  #28 (permalink)  
Antiguo 15/03/2004, 13:34
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Por cierto, enlazando con lo de WebStudio. El motor sólo interpreta la plantilla una sóla vez, a no ser que cambies el contenido del archivo. Si no ha cambiado, todo se limita a hacer un
Código PHP:
include('cache/plantilla.cacheada.md5sumdelarchivo.php'); 
Aunque tendré que pensar algún método para poder purgar la caché.
  #29 (permalink)  
Antiguo 15/03/2004, 14:20
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Bueno vitxo el concepto de "bloque" que tenía aplicado a la plantilla lo tenía visto como:

Cita:
bloques.xxx

<inicio bloque nombre="tal">

</fin bloque>

<inicio bloque nombre="pascual">

</fin bloque>
etc ..

Es decir .. no lo "veía" como "plantillas" independientes como "archivos" fisicos y de ahí llamarlos con el controlador que usas según corresponda "reusar" dicho bloque. (más que nada por qué no he usado ese tipo de patrones de los que comentan a lo largo de este mensaje).


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #30 (permalink)  
Antiguo 16/03/2004, 14:05
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 6 meses
Puntos: 0
Como ya dije al principio de este hilo (hace unos mesecillos ya!) estoy escribiendo algo de documentación.
Ahora estoy metido con la especificación del problema, diseño e implementación. Es un borrador y está incompleto, pero ya hay bastante chicha para opinar. Además, necesito beta-readers o como se diga

Bajaros el documento
PDF comprimido con ZIP o
PDF comprimido con TAR y BZIP2

espero feedback,
nos leemos!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 05:59.