2012-09-10 18 views
7

पर आधारित ऑर्चर्ड सीएमएस में लेआउट-रैपर में कक्षा कैसे जोड़ें पृष्ठभूमि: मैं अपने होम पेज के लिए वैकल्पिक लेआउट बनाने से बचना चाहता हूं और मैं "थीम" रखना चाहता हूं मशीन "ज़ोन और लेआउट बरकरार रखने के बगल में, और वास्तव में" थीम "शुद्ध सीएसएस का उपयोग कर सबकुछ का सबसे अधिक है। तो मुझे चुनिंदा सीएसएस को विशिष्ट "पेज", और सबसे महत्वपूर्ण रूप से, मुखपृष्ठ पर लक्षित करने की आवश्यकता है। ऐसा करने का सबसे आसान तरीका लेआउट-रैपर "div" में एक वर्ग जोड़ना होगा जो पूरे लेआउट को लपेटता है। मैं Document.cshtml फ़ाइल को ओवरराइड करके "बॉडी" तत्व में एक वर्ग जोड़ सकता हूं, लेकिन मुझे सच में लगता है कि यह लेआउट.एचएसटीएमएल फ़ाइल के अंदर काम करने के लिए क्लीनर है और मॉडल पर कैपिटल बन गया है। क्लास को आवश्यक सीएसएस कक्षाओं को जोड़ने के लिए "खोलना" टैग।वर्तमान पृष्ठ और/या मुखपृष्ठ

मैं वर्तमान में कुछ इस तरह कर रही है ':

string area = Model.DesignatedAreaField; 
Model.Classes.Add(string.IsNullOrWhiteSpace(area) ? "home" : area); 

Model.Id = "layout-wrapper"; 
var tag = Tag(Model, "div"); // using Tag so the layout div gets the classes, id and other attributes added to the Model 

मुझे पता है कि क्षेत्र में कटौती नहीं करेगा, क्योंकि होमपेज, और अन्य पृष्ठों को एक ही क्षेत्र में सभी कर रहे हैं, और Model.DesignatedAreaField वास्तव में एक खाली रिटर्न होमपेज या अन्य पृष्ठों के लिए स्ट्रिंग। तो, अंत में, कोड ऊपर हमेशा निम्न मार्कअप उत्पन्न होगा (मैं मुखपृष्ठ पर 3 tripels दिखा रहा हूँ):

<div class="home tripel-123" id="layout-wrapper"> 

मैं केवल "घर" CSS वर्ग जोड़ने में सक्षम होना चाहते हैं जब मुखपृष्ठ प्रदर्शित किया जा रहा है।

string wrapperCss = IsHomepage ? 'home' : Model.GetUrlPathOrSomethingUniqueForThePath(); 
Model.Classes.Add(wrapperCss); 

यह मेरे लिए, उदाहरण के लिए, मुख्य सामग्री हटना और सही करने के लिए तैरने लगते हैं, और इसके लिए छोड़ दिया पर tripels डाल (जो बनाने के लिए अनुमति देगा कैसे घर पृष्ठ डिजाइन: कुछ छद्म कोड का पालन किया जाएगा ऐसा दिखना चाहिए, लेकिन अगर मैं सरल, लक्षित सीएसएस के साथ ऐसा कर सकता हूं तो मैं घर के लिए एक अलग अलग लेआउट नहीं लिखना चाहता हूं)।

अद्यतन: तारों अप बर्ट्रेंड के जवाब

बर्ट्रेंड के जवाब मुझे यूआरएल के आधार पर रैपिंग div करने के लिए एक वर्ग को जोड़ने के लिए अनुमति दी। उन्होंने कहा कि यह जिक्र नहीं किया था (के बाद से ऑर्चर्ड उसे दूसरा स्वरूप है :-) लेकिन आप Layout.cshtml फ़ाइल में एक जोड़ने के शामिल करने के लिए है और बदल देंगे "मेरा" तदनुसार कोड:

@using Orchard.Utility.Extensions; 
{ 
/* omitted for brevity, everything in between is the same as in the Theme's Machine layout file */ 

string area = WorkContext.HttpContext.Request.Path.HtmlClassify(); 
area = string.IsNullOrWhiteSpace(area) ? "home" : area; 
Model.Classes.Add("url-" + area); 

यह परिणाम

1) होमपेज पर दिखाया जाता है जब:

<div class="url-orchard-local- tripel-123" id="layout-wrapper"> 

2) जब एक पृष्ठ नामित उत्पाद दिखाए जाएँ:

<div class="url-orchard-local-products" id="layout-wrapper"> 
निम्नलिखित वर्ग संलग्नित div में जोड़ा जा रहा

मेरे यूआरएल मेरी देव मशीन पर इस तरह पढ़ता है, दृश्य स्टूडियो के वेबसर्वर के अंदर चल रहा है:

http://localhost:30320/OrchardLocal/ or 
http://localhost:30320/OrchardLocal/Products 

मैं अपने जीवन दांव लगा नहीं कर रहा हूँ, लेकिन मैं दृढ़ विश्वास है कि "OrchardLocal" भाग इसे एक बार उत्पादन में बदल जाएगा प्रकाशित है, मुझे कहना है, Azure सर्वर के लिए ...इसलिए मैं preemptivelly इस के लिए कोड बदलने की है:

string area = WorkContext.HttpContext.Request.Path.HtmlClassify(); 
if (area.LastOrDefault() == '-') { 
    area = "home"; 
} 
Model.Classes.Add("url-" + area); 

कौन इस वर्ग में यह परिणाम है जब "मुखपृष्ठ" दिखाया जाता है:

<div class="url-home tripel-123" id="layout-wrapper"> 

(असल में मैं एक एक- ऊपर कोड बनाया है लैम्बर ऑपरेटर के साथ मिश्रित कुछ टर्नरी का दुरुपयोग करने वाला लाइनर :-)

मैं कह रहा हूं कि एचटीएमएल क्लासिफाइटी केवल "वर्ग" के साथ समाप्त होने वाली "कक्षा" को वापस कर देगी जब यह मुखपृष्ठ है ... या "रूट" साइट के लिए ... मैं गलत हो सकता है! :-)

(वैसे भी मैं ऑर्चर्ड कुछ भी मैं nHibernate के अलावा अन्य पिछले कुछ वर्षों से में उपयोग किया है और अधिक से अधिक प्यार कर रहा हूँ, लेकिन, हे, ऑर्चर्ड यह बहुत का उपयोग करता है! बिल्कुल सही!)

+1

मैंने पहली पंक्ति स्ट्रिंग क्षेत्र = वर्ककॉन्टेक्स्ट.एचटीपीकॉन्टेक्स्ट.रूक्वेस्ट.पैथ सब्स्ट्रिंग (1) में बदल दी है। HTML क्लासिफ़ाई(); लगता है कि इसमें इनटाइटल स्लैश शामिल हो सकता है, इसलिए यूआरएल – George

उत्तर

7

कुछ इस तरह चाल करना चाहिए:

Model.Classes.Add("url-" + WorkContext.HttpContext.Request.Path.HtmlClassify()) 
+0

हाय बर्ट्रैंड के बाद डबल डैश प्राप्त हो रहा था, यह काम किया, धन्यवाद! चूंकि मैं ऑर्चर्ड का उपयोग केवल 2 दिनों के लिए कर रहा हूं, इसलिए मुझे बहुत कम पता है इसलिए मुझे एचटीएमएल क्लासिफाइड की तलाश करने के लिए फाइलों में एक खोज करना था, जिसमें यह देखने के लिए कि कौन सा शामिल था (@using ऑर्चर्ड। उपयोगिता। एक्सटेंशन;)। इसके अलावा परिणाम यह होम पेज के लिए था: वर्ग = "यूआरएल-ऑर्चर्ड-लोकल-ट्रिपेल-123" और यह प्रोडुतोस नामक एक पृष्ठ के लिए: वर्ग = "यूआरएल-ऑर्चर्ड-लोकल-"। मेरा यूआरएल, वीएस वेबसेवर में चल रहा है/ऑर्चर्ड लॉकल ... मैं कह रहा हूं कि यह उत्पादन में बदल जाएगा, मैं अपने प्रश्न को अपडेट करूँगा ताकि मैं यह निर्धारित करने की कोशिश कर सकूं कि यह मुखपृष्ठ है या नहीं। .. – Loudenvier

+1

यही कारण है कि मैं हमेशा आपके स्थानीय सर्वर सर्वर को आपके उत्पादन सर्वर के समान विन्यास में अनुशंसा करता हूं। इसे बेस यूआरएल सेट करने वाली साइट सेटिंग का उपयोग करके चारों ओर हैक किया जा सकता है, लेकिन देव में एक अलग कॉन्फ़िगरेशन के साथ अन्य समस्याएं हैं, उदाहरण के लिए समृद्ध सामग्री में लिंक और मीडिया यूआरएल। –

+0

बस दूसरे दिन मैंने एएसपी.नेट एमवीसी का उपयोग करके बिक्री के लिए डेमो पर 22 घंटे काम किया है। यह रविवार को शुरू हुआ, और सोमवार, 3 बजे तक, साइट केवल सभी छवियों (और कुछ स्क्रिप्ट) के लिए अपलोड की गई थी ... विक्रेता (और कंपनी का मालिक) ग्राहक के सामने था जो मेरी कॉल के लिए इंतजार कर रहा था डेमो प्रस्तुत करें ... और यह उत्पादन में काम नहीं कर रहा था ... मैं इस समय तक पूरी तरह से नींद में था, और यूआरएल का उपयोग करने के लिए सबकुछ बदलने और बदलने के लिए कुछ हताश मिनट लग गए। सामग्री (यह मेरा एक था पहला एएसपी.नेट एमवीसी काम करता है ...)। उत्पादन सेटिंग्स = देव सेटिंग्स बुद्धिमान है! :-) – Loudenvier

0

यहाँ विस्तार के तरीकों के साथ यह करने के लिए एक तरीका है:

public static string GetPageCssClass(this WorkContext workContext) 
{ 
    string pageUrl = workContext.HttpContext.Request.Url.ToString(); 
    string baseUrl = workContext.CurrentSite.BaseUrl; //use BaseUrl to later get app relative page path 

    string pageClass = workContext.IsHomePage() 
     ? "home" 
     : pageUrl.Substring(baseUrl.Length).HtmlClassify(); 

    return string.Format("{0}-page", pageClass); 
} 

public static bool IsHomePage(this WorkContext workContext) 
{ 
    string pageUrl = workContext.HttpContext.Request.Url.ToString().TrimEnd('/'); 
    string baseUrl = workContext.CurrentSite.BaseUrl.TrimEnd('/'); 

    return pageUrl == baseUrl; 
} 

ध्यान दें कि इस वर्ग के नाम अपने baseurl अपनी साइट सेटिंग तो थानेदार में स्थापित करने के लिए रिश्तेदार के आधार uld स्थानीय रूप से या उत्पादन में काम करते हैं बशर्ते आपका बेसयूआरएल आपके वर्तमान पर्यावरण के लिए सेट हो।

Model.Classes.Add(WorkContext.GetPageCssClass()); 

यहाँ एक अन्य विकल्प प्रत्येक परत वर्तमान में है कि के लिए एक सीएसएस वर्ग को जोड़ने के लिए है:

फिर आप सिर्फ अपने विस्तार विधि वर्ग के नाम स्थान और उसके बाद के लिए अपने दृश्य पर एक बयान का उपयोग कर जोड़ने के लिए की आवश्यकता होगी सक्रिय निम्नलिखित क्रिया विधि आपके पृष्ठ पर {xxx} -layer css कक्षाओं की एक सूची जोड़ देगा। यहां एक और संबंधित प्रश्न है: Orchard CMS: Conditional CSS Class based on Layer

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