2015-11-20 10 views
5

Secondo il FreeMarker include statement docs, è possibile effettuare header- e footer- modelli consapevoli in questo modo:Layout di FreeMarker per ridurre la ridondanza dei modelli?

<#include "/header.ftl"> 
<!-- Content of my this page --> 
<#include "/footer.ftl"> 

Ma se la mia web app ha centinaia di pagine/vista, questo è un sacco di pasta copia ridondante. Sarebbe bello se ci fosse come un concetto di "disposizione" in FreeMarker, dove ho potuto dire "Ehi, qui è un layout:"

<#include "/header.ftl"> 
<@import_FTL_Somehow> 
<#include "/footer.ftl"> 

E poi creare modelli separati per ogni visualizzazione/pagina (index.ftl, contactUs.ftl, ecc.) E quindi comunicare a FreeMarkers quali file FTL "utilizzano" il layout. In questo modo non avrei dovuto continuare a specificare l'intestazione/piè di pagina inclusi in ogni file di modello.

FreeMarker supporta questo tipo di concetto?

risposta

7

Tuttavia, se è necessario un piè di pagina o un'intestazione, è possibile risolverlo con un numero di TemplateLoader (dove lo TemplateLoader inserisce gli snippet di intestazione e piè di pagina, come se fosse presente nel file di modello). Ma la solita soluzione in FreeMarker sta chiamando il codice del layout in modo esplicito da ogni template, ma non con due #include -s direttamente, ma, come:

<@my.page> 
    <!-- Content of my this page --> 
</@my.page> 

dove my è un auto-import (vedi Configuration.addAutoImport).

Update: Un altro approccio è che si dispone di un layout.ftl come:

Heading stuff here... 
<#include bodyTemplate> 
Footer stuff here... 

E poi da Java chiami sempre layout.ftl, ma anche passare nel nome del modello corpo utilizzando la variabile bodyTemplate:

dataModel.put("bodyTemplate", "/foo.ftl"); 
cfg.getTemplate("layout.ftl").process(dataModel, out); 
+0

Grazie a @ddekany (+1) - dai loro Javadoc, questo ['addAutoImport'] (http://freemarker.incubator.apache.org/docs/api/freemarker/template/Configuration.html#addAutoImport-java.lang. Metodo string-java.lang.String-): "* Aggiunge un elemento #import invisibile plateName come namespaceVarName all'inizio di tutti i modelli. L'ordine delle importazioni sarà uguale all'ordine in cui sono stati aggiunti con questo metodo. * "** Tuttavia **, non riesco ancora a comprenderne l'utilizzo esatto: sembra che questo importerà solo un modello (o l'intestazione o il piè di pagina, ma non entrambi) – smeeb

+0

** Qualche possibilità che vorresti aggiornare la tua risposta con un esempio di codice rapido che mostra 2 pagine diverse utilizzando questa soluzione? ** Idealmente, potrei vedere il codice Java dove ' si chiama addAutoImport', e come appaiono i 2 file FTL (così posso vedere come 'addAutoImport' impedisce loro - in modo ridondante - di richiedere le istruzioni' # include' dell'intestazione/piè di pagina). Grazie ancora! – smeeb

+0

L'importazione automatica è importata è usato solo per definire 'my', non per inserire effettivamente qualcosa. È necessario per risparmiare un '<#import' /lib/myutils.ftl 'come il mio>' all'inizio di ogni file, dato che si voleva evitare il codice boilerplate tanto – ddekany

Problemi correlati