2008-10-17 4 views
7

Digamos que tiene una plantilla estándar con plantillas incluidas (analizadas) de encabezado, cuerpo y pie de página.Velocity #parse pero asígnelo a una variable

En la plantilla del cuerpo, se define una variable como $ subject y desea que también se muestre en la plantilla del encabezado.

En algunos lenguajes de plantillas como HTML :: Mason (basado en perl), primero evaluaría la plantilla de cuerpo para recoger la variable $ subject pero almacenaría su salida temporalmente en una variable para que su salida final pudiera terminar en la correcta fin (cabecera, cuerpo, pie de página)

en la velocidad que sería algo como

conjunto ($ cuerpo = # de análisis ("body.vm"))

de análisis ("header.vm")

$ {body}

de análisis ("footer.vm")

Sin embargo, esto no parece funcionar, alguna idea de cómo hacer esto?

Respuesta

3

Puede hacerlo usando VelocityLayoutServlet que es parte de VelocityTools.

Esto le permite definir un diseño para su aplicación - vamos a llamarlo application.vm - en el que se puede analizar en los encabezados, pies de página, etc., y declarar si la página principal de cuerpo se coloca mediante la declaración screen_content, por ejemplo:

<html> 
    <head> 
    <title>$subject</title> 
    </head> 
    <body> 
    #parse("header.vm") 
    $screen_content 
    #parse("footer.vm") 
    </body> 
</html> 

VelocityLayoutServlet se evalulate las plantillas (y, por lo tanto, variables) antes de la representación, que le permite establecer una variable $subject en su plantilla del cuerpo, por ejemplo:

#set($subject = "My Subject") 
<div id="content"> 
</div> 

Más de la información de la cola se puede encontrar in the Velocity documentation.

0

Si le entiendo correctamente, quiere tener una variable de velocidad llamada $subject interpolada en las plantillas header.vm y body.vm. En este momento, la variable se define en la plantilla body.vm, por lo que no puede consultarla en la plantilla anterior header.vm.

¿Por qué no abstrae la definición de $ subject en su propio fragmento de plantilla, llamado globals.vm decir, y luego incluir eso en la plantilla de nivel superior. Por lo tanto, tendría:

#parse("globals.vm") 
#parse("header.vm") 
#parse("body.vm") 
#parse("footer.vm") 
9

Cualquiera de las dos soluciones anteriores funcionaría. La solución VelocityLayoutServlet requiere un paquete adicional (también de Velocity) llamado Velocity Tools. Soy parcial a este enfoque (y variantes) yo mismo.

Un tercer método consiste simplemente en poner el #parse entre comillas:

set ($body="#parse('body.vm')") 

Dentro de un #set, se evalúa nada entre comillas dobles. Las cadenas dentro de comillas simples se pasan literalmente.