2013-06-24 11 views
6

में लेआउट टेम्पलेट बदलना कोहाना (PHP ढांचे) में लेआउट टेम्पलेट_Controller के माध्यम से कार्यान्वित किया जाता है जो $ टेम्पलेट नामक एक सदस्य चर को निरंतर रखता है, जो लेआउट व्यू के रूप में कार्य करता है। फिर कार्रवाई विधि में आप अधिक उप-विचारों के साथ $ टेम्पलेट को पॉप्युलेट कर सकते हैं, आमतौर पर सामग्री दृश्य। (http://forum.kohanaframework.org/discussion/3612/kohana-layout-system/p1)रनटाइम

यह मुझे रनटाइम में लेआउट "थीम" बदलने की अनुमति देता है। यह बहुउद्देश्यीय प्रणाली के लिए उपयोगी है, जहां एक किरायेदार अपनी थीम (दो कॉल, तीन कॉल इत्यादि) का चयन कर सकता है

स्कैला टेम्पलेट इंजन के साथ प्लेफ्रेमवर्क 2 स्कैला में मैं इसे कैसे प्राप्त कर सकता हूं? दूसरे शब्दों में, मैं कई लेआउट टेम्पलेट्स रखना चाहता हूं जिसमें किरायेदार चुन सकता है। नियंत्रक तब लेआउट टेम्पलेट और कार्रवाई विशिष्ट सामग्री टेम्पलेट प्रस्तुत करता है।

कुछ की तरह (नियंत्रक कार्रवाई स्यूडोकोड):

  1. उपयोगकर्ता के आधार पर, लेआउट विषय को पुनः प्राप्त (एक नाम एक डेटाबेस में स्ट्रिंग में संग्रहीत है, और मानचित्रण दृश्य फ़ाइल इसी गया है)।
  2. कार्रवाई विशिष्ट सामग्री दृश्य प्रस्तुत करें।
  3. (2) के साथ (1) से प्राप्त लेआउट व्यू प्रस्तुत करें।

नोट: प्रत्येक कार्रवाई के लिए, लेआउट थीम प्रति उपयोगकर्ता बदल सकती है लेकिन सामग्री दृश्य समान रहता है।

इसमें प्रलेखन है (http://www.playframework.com/documentation/2.1.1/ScalaTemplateUseCases)
सामग्री टेम्पलेट, कहते हैं, index.scala.html, मुख्य जो main.scala.html में परिभाषित किया गया है के लिए एक कॉल, लेआउट टेम्पलेट भी शामिल है। दूसरे शब्दों में, यह कठिन कोडित है, इस प्रकार index.scala.html कसकर main.scala.html के साथ मिलकर है।

हालांकि मैं प्रतिबिंब का उपयोग करके नियंत्रक से मुख्य को कॉल करने और फिर सामग्री को पार करने के बारे में बताता हूं।

एक वैकल्पिक स्केलेट जैसे व्याख्या किए गए टेम्पलेट इंजन का उपयोग करना होगा।

कोई सुझाव?

उत्तर

2

मुझे आपके द्वारा किए जाने वाले कार्यों को पूरा करने के लिए 2 विकल्प दिखाई देते हैं। सबसे पहले आपके टेम्पलेट्स पर एक थीम पैरामीटर पारित करना होगा (यानी कहने वाले टेम्पलेट को कहने के लिए कुछ थीम/लेआउट कहने के लिए) और उस पैरामीटर को सशर्त रूप से लेआउट टेम्पलेट को कॉल करने के लिए उपयोग करें। दूसरा चयनित विषय के आधार पर उपयुक्त दृश्य लौटकर नियंत्रक के अंदर की स्थिति को संभालना होगा।

विकल्प 1

अपनी कार्रवाई में आप जो विषय का उपयोग करने के इंगित करने के लिए आपके खाके में कुछ मूल्य पारित करने के लिए चाहते हैं।

def index = Action { 
    Ok(views.html.index("two-col")) 
} 

फिर अपनी index.scala.html आप कुछ इस तरह करना होगा:

@(theme: String) 

@content = { 
    <h1>Action Specific Content</h1> 
} 

@if("two-col" eq theme) { 
    @twoCol("title")(content) 
} else { 
    @main("title")(content) 
} 

यह वहाँ उम्मीद करेंगे के रूप में एक twoCol.scala.html टेम्पलेट, होना करने के लिए:

@(title: String)(content: Html) 
<!DOCTYPE html> 
<html> 
    ... 
    <body> 
    <h1>Two Column</h1> 
    @content 
    </body> 
</html> 

ध्यान दें: आप भी कर सकते हैं एक अंतर्निहित पैरामीटर का उपयोग कर विषय पास करें, यह SO question देखें। यह प्रत्येक रेंडर पर टेम्पलेट को स्पष्ट रूप से पास करने की आवश्यकता को कम करेगा।

विकल्प 2

यह आपके नियंत्रक में निम्नलिखित के रूप में सरल हो सकता है, लेकिन शायद बहुत कुछ दृश्य टेम्पलेट्स में कोड दोहराया की आवश्यकता होगी।

def index = Action { 
    var theme = ... 
    ... 
    if (theme eq 'tow-col') { 
    Ok(views.html.twocol.index("two-col")) 
    } else { 
    Ok(views.html.default.index()) 
} 

इसमें यह माना जाता /app/views में एक twocol और default पैकेज है कि एक index.scala.html है वहाँ है।

अतिरिक्त टिप्पणियाँ

आप विकल्प 1 से बता सकते हैं, index.scala.html कसकर main.scala.html के साथ मिलकर नहीं है। आप किसी भी अन्य टेम्पलेट, या यहां तक ​​कि कोई टेम्पलेट तक कॉल के साथ कॉल को मुख्य स्थान पर बदल सकते हैं।

एफडब्ल्यूआईडब्ल्यू, मैं विकल्प 1 के साथ जाऊंगा और यह संभवतः एक बेहतर समाधान में विकसित होगा।