2015-11-20 8 views
5

FreeMarker include statement docs के अनुसार, आप header- कर सकते हैं और इतने तरह अवगत टेम्पलेट्स footer-:फ्रीमार्कर लेआउट?

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

लेकिन अगर अपने वेब ऐप्लिकेशन के पृष्ठों/विचारों के सैकड़ों है, इस निरर्थक प्रतिलिपि पास्ता का एक बहुत है।

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

और फिर प्रत्येक दृश्य/पेज के लिए अलग से खाका बनाने: यह अगर वहाँ FreeMarker, में एक "लेआउट" अवधारणा मैं कहाँ कह सकते हैं "अरे, यहाँ एक लेआउट है" की तरह था बहुत अच्छा होगा (index.ftl, contactUs.ftl, आदि) और फिर फ्रीमार्कर्स को बताएं जो एफटीएल फाइलें लेआउट का उपयोग करती हैं। इस तरह मुझे प्रत्येक टेम्पलेट फ़ाइल में हेडर/फ़ूटर निर्दिष्ट करना नहीं होगा।

क्या फ्रीमार्कर इस तरह की अवधारणा का समर्थन करता है?

उत्तर

7

यह नहीं है, हालांकि आपको केवल एक पाद लेख या हेडर की आवश्यकता है, तो इसे TemplateLoader हैक (जहां TemplateLoader के साथ हल किया जा सकता है, जहां हेडर और पाद लेख स्निपेट्स शामिल हैं, जैसे कि टेम्पलेट फ़ाइल में था)। लेकिन FreeMarker में हमेशा की तरह समाधान प्रत्येक खाके से स्पष्ट रूप से लेआउट कोड बुला रहा है, लेकिन सीधे दो #include -s साथ नहीं है, लेकिन जैसे:

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

जहां my एक स्वत: आयात है (Configuration.addAutoImport देखें)।

अद्यतन: एक और दृष्टिकोण है कि आप एक layout.ftl की तरह:

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

और फिर जावा से आप हमेशा layout.ftl फोन, लेकिन यह भी bodyTemplate चर का उपयोग कर शरीर टेम्पलेट नाम में पारित:

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

धन्यवाद @ddekany (+1) - उनके जावाडॉक्स से, यह ['addAutoImport'] (http://freemarker.incubator.apache.org/docs/api/freemarker/template/Configuration.html#addAutoImport-java.lang। स्ट्रिंग-जावा। Lang.String-) विधि: "* एक अदृश्य # आयात टेम्पलेट जोड़ता है सभी टेम्पलेट्स की शुरुआत में नामस्थान के रूप में प्लेटनाम। आयात का आदेश उसी विधि के समान होगा जिसमें उन्हें इस विधि के साथ जोड़ा गया था। * "** हालांकि **, मैं अभी भी इसके सटीक उपयोग को समझ नहीं रहा हूं: ऐसा लगता है कि यह केवल एक टेम्पलेट आयात करेगा (या तो हेडर या पाद लेख, लेकिन दोनों नहीं) – smeeb

+0

** किसी भी मौके पर आप एक त्वरित कोड उदाहरण के साथ अपना उत्तर अपडेट करने के इच्छुक होंगे, इस समाधान का उपयोग करके 2 अलग-अलग पेज दिखा रहे हैं? ** आदर्श रूप में, मैं जावा कोड देख सकता हूं जहां ' addAutoImport' कहा जाता है, साथ ही 2 एफटीएल फाइलें किस तरह दिखती हैं (इसलिए मैं देख सकता हूं कि 'addAutoImport' उन्हें अनावश्यक रूप से कैसे रोकता है - हेडर/फ़ूटर '# शामिल' बयानों की आवश्यकता होती है)। धन्यवाद फिर से! – smeeb

+0

ऑटो-आयात है केवल 'my' को परिभाषित करने के लिए उपयोग किया जाता है, वास्तव में कुछ भी डालने के लिए नहीं। यह प्रत्येक फ़ाइल की शुरुआत में' <#import '/lib/myutils.ftl' को मेरे> के रूप में छोड़ना है, क्योंकि आप बॉयलरप्लेट कोड से अधिक से बचना चाहते थे जितना संभव हो। – ddekany

संबंधित मुद्दे