2011-10-06 25 views
5

क्या साइटसॉर क्वेरी होने के लिए डेटास्रोत स्थान (डेटासेट नहीं) सेट करना संभव है?डेटासोर्स स्थान में साइटकोर क्वेरी का उपयोग कैसे करें? (गतिशील डेटासौस)

मैं जो करने का प्रयास कर रहा हूं वह है कि sublayout ने अपने डेटास्रोत स्थान को उस आइटम के नीचे फ़ोल्डर (वर्तमान आइटम) में सेट किया है।

sublayout डेटासोर्स स्थान वर्तमान आइटम के नीचे एक फ़ोल्डर को इंगित करना चाहिए। इसलिए मैंने डेटास्रोत स्थान को query:./Items/* पर सेट करने का प्रयास किया लेकिन यह काम नहीं किया।

कोई सुझाव?

उत्तर

10

आपको क्वेरी की आवश्यकता नहीं है - sublayout डेटासोर्स स्थान बस एक सापेक्ष पथ का उपयोग कर सकते हैं। जैसे

./Items 

जाहिर है, उस फ़ोल्डर को पहले से मौजूद होना चाहिए। मैं इस कोड को ब्लॉग करने का अर्थ रहा हूं, और यह अधिक हो सकता है लेकिन मैं यहां पोस्ट करूंगा क्योंकि यह आपकी मदद कर सकता है। getRenderingDatasource पाइपलाइन में निम्नलिखित सापेक्ष पथ डेटासेट स्थान बनाने के लिए निम्नलिखित को जोड़ा जा सकता है यदि यह पहले से मौजूद नहीं है। इसे GetDatasourceLocation प्रोसेसर से पहले जोड़ें।

sublayout पर, आप बनाए गए आइटम के टेम्पलेट को निर्दिष्ट करने के लिए contentFolderTemplate=[GUID] पैरामीटर जोड़ना चाहेंगे।

public class CreateContentFolder 
{ 
    protected const string CONTENT_FOLDER_TEMPLATE_PARAM = "contentFolderTemplate"; 

    public void Process(GetRenderingDatasourceArgs args) 
    { 
     Assert.IsNotNull(args, "args"); 
     Sitecore.Data.Items.RenderingItem rendering = new Sitecore.Data.Items.RenderingItem(args.RenderingItem); 
     UrlString urlString = new UrlString(rendering.Parameters); 
     var contentFolder = urlString.Parameters[CONTENT_FOLDER_TEMPLATE_PARAM]; 
     if (string.IsNullOrEmpty(contentFolder)) 
     { 
      return; 
     } 
     if (!ID.IsID(contentFolder)) 
     { 
      Log.Warn(string.Format("{0} for Rendering {1} contains improperly formatted ID: {2}", CONTENT_FOLDER_TEMPLATE_PARAM, args.RenderingItem.Name, contentFolder), this); 
      return; 
     } 

     string text = args.RenderingItem["Datasource Location"]; 
     if (!string.IsNullOrEmpty(text)) 
     { 
      if (text.StartsWith("./") && !string.IsNullOrEmpty(args.ContextItemPath)) 
      { 
       var itemPath = args.ContextItemPath + text.Remove(0, 1); 
       var item = args.ContentDatabase.GetItem(itemPath); 
       var contextItem = args.ContentDatabase.GetItem(args.ContextItemPath); 
       if (item == null && contextItem != null) 
       { 
        string itemName = text.Remove(0, 2); 
        //if we create an item in the current site context, the WebEditRibbonForm will see an ItemSaved event and think it needs to reload the page 
        using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("system"))) 
        { 
         contextItem.Add(itemName, new TemplateID(ID.Parse(contentFolder))); 
        } 
       } 
      } 
     } 
    } 
} 
+0

यही वह है जो मैं देख रहा था, विस्तृत उत्तर के लिए धन्यवाद। –

+0

@ techphoria414 सब्बाउट डेटासॉर पर सापेक्ष पथ का समर्थन करने के लिए आप साइटकोर का किस संस्करण का उपयोग कर रहे थे? यह कुछ ऐसा है जो मैं कुछ परियोजनाओं के लिए करना चाहता हूं ... –

+0

6.4.1, हालांकि यह sublayout के डेटास्रोत स्थान पर है, जिसका उपयोग पृष्ठ संपादक द्वारा किया जाता है। आइटम का चयन करने के बाद, यह अभी भी एक पूर्ण पथ है (जिसे हम किसी आइटम में GUID में बदलते हैं: हैंडलर सहेजना)। यदि आप सामान्य रूप से डेटासोर्स में सापेक्ष पथ का समर्थन करना चाहते हैं, तो आप GetItem के बजाय साइटकोर क्वेरी करने के लिए SublayoutParamHelper उपयोगिता वर्ग (या इसके संस्करण) को कस्टमाइज़ कर सकते हैं। – techphoria414