2008-10-17 7 views
7

Supponiamo di avere un modello standard con modelli di intestazioni, body, footer inclusi (analizzati) inclusi.Velocity #parse ma assegnarlo a una variabile

Nel modello di corpo viene definita una variabile come $ subject e si desidera che venga visualizzata anche nel modello di intestazione.

In alcuni altri linguaggi di template come HTML :: Mason (basato su perl) dovresti prima valutare il modello di corpo per raccogliere la variabile $ subject ma memorizzarla temporaneamente in una variabile in modo che il tuo output finale possa finire nella corretta ordine (intestazione, corpo, piè di pagina)

di velocità che sarebbe simile a

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

parse ("header.vm")

$ {corpo}

parse ("footer.vm")

Questo però non sembra funzionare, qualche idea su come fare questo?

risposta

3

È possibile farlo utilizzando VelocityLayoutServlet che fa parte di VelocityTools.

Questo permette di definire un layout per la vostra applicazione - chiamiamolo application.vm - in cui è possibile analizzare in intestazioni, piè di pagina, ecc e dichiarare in cui il contenuto del corpo principale si trova con la dichiarazione screen_content, ad esempio:

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

VelocityLayoutServlet sarà evalulate i modelli (e, quindi, variabili) prima del rendering, che permette di impostare una variabile $subject nel modello del corpo, ad esempio:

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

Più de informazioni tailed possono essere trovate in the Velocity documentation.

0

Se ho capito bene, si desidera avere una variabile Velocity denominata $subject interpolata nei modelli header.vm e body.vm. Al momento, la variabile è definita nel modello body.vm, quindi non è possibile fare riferimento ad essa nel modello precedente header.vm.

Perché non estrai la definizione di $ subject nel relativo frammento di modello, chiamato globals.vm, quindi includilo nel modello di livello superiore. Quindi avresti:

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

Una delle due soluzioni sopra funzionerebbe. La soluzione VelocityLayoutServlet richiede un pacchetto aggiuntivo (anche da Velocity) chiamato Velocity Tools. Sono parziale a questo approccio (e alle varianti) me stesso.

Un terzo metodo è semplicemente quello di mettere il #parse tra virgolette:

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

All'interno di un #SET, qualsiasi cosa tra virgolette viene valutata. Le stringhe tra virgolette singole vengono passate letteralmente.

Problemi correlati