2015-07-03 56 views
1

我想更改一個佔位符的演示詳細信息中的控件順序。我使用NewsletterHeader["__Renderings"]效果,我有這樣的:Sitecore - 在C中設置控件順序#

<r xmlns:p="p" xmlns:s="s" p:p="1"> 
    <d id="{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}"> 
    <r uid="{042E3CC4-8205-4A1D-85F4-7D667622711D}" s:ds="" s:par="" s:ph="masterplaceholder" /> 
    <r uid="{B19D0460-69C9-4FEC-A882-41FFA77B582F}" p:before="r[@uid='{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/Polecane" s:id="{C3AC52FB-8F51-4B44-A3EE-55F4C2EAF83F}" s:par="" s:ph="moviesplaceholder" />    
    <r uid="{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}" p:before="r[@uid='{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/HITY" s:id="{7A80D822-8D6A-40C4-92D4-2FA22C596339}" s:par="" s:ph="moviesplaceholder" />    
    <r uid="{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}" p:before="r[@uid='{B6036949-B723-42CE-9271-64DF299450DC}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/VOD" s:id="{557800E7-953B-4830-8691-3FFB964712A8}" s:par="" s:ph="moviesplaceholder" />   
    <r uid="{B6036949-B723-42CE-9271-64DF299450DC}" p:before="r[@uid='{CC44C44C-B10C-417A-8E19-43B57AAD4C93}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/BANER" s:id="{AE048833-A8AF-4668-938A-FEBA48281620}" s:par="" s:ph="moviesplaceholder" />   
    <r uid="{CC44C44C-B10C-417A-8E19-43B57AAD4C93}" p:before="r[@uid='{F75C5CBE-60E2-4A0A-87F6-B6AB46AC2E52}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/JESZCZE-WIECEJ-HITOW" s:id="{D5FCDC02-C2A8-47A9-BCF5-99A3DF7E8A25}" s:par="" s:ph="moviesplaceholder" />    
    <r uid="{F75C5CBE-60E2-4A0A-87F6-B6AB46AC2E52}" s:id="{71B654BA-5F47-4053-8936-7199C34E55E4}" s:ph="footerplaceholder" /> 
    </d> 
</r> 

然後我嘗試使用此代碼來改變在C#中的順序:

private void SetSectionsOrder() 
{ 
    using (new SecurityDisabler()) 
    { 
     //Get the value of the __renderings field 
     string renderingXml = this.NewsletterHeader["__Renderings"]; 
     XNamespace nsS = "s"; 
     XNamespace nsP = "p"; 
     //Get order from model 
     var order = this.Newsletter.GetSectionsOrder(); 
     //Generate XDcoument from xml 
     XDocument xd = XDocument.Parse(renderingXml); 
     for (int i = 0; i < order.Count; i++) 
     { 
      var section = order[i]; 
      if (i == 0) 
      { 
       XElement sectionElement = xd.Descendants("r").FirstOrDefault(e => (e.Attribute(nsS + "ds") != null) && e.Attribute(nsS + "ds").Value.Contains(section.Item1)); 
       XElement footerElement = xd.Descendants("r").FirstOrDefault(e => (e.Attribute(nsS + "ph") != null) && e.Attribute(nsS + "ph").Value == "footerplaceholder"); 
       if (footerElement != null) 
       { 
        string footerUid = footerElement.Attribute("uid").Value; 
        if (sectionElement != null) 
         sectionElement.Attribute(nsP + "before").SetValue("r[@uid='" + footerUid + "']"); 
       } 
      } 
      else 
      { 
       var prevSection = order[i - 1]; 
       XElement sectionElement = xd.Descendants("r").FirstOrDefault(e => (e.Attribute(nsS + "ds") != null) && e.Attribute(nsS + "ds").Value.Contains(section.Item1)); 
       XElement prevSectionElement = xd.Descendants("r").FirstOrDefault(e => (e.Attribute(nsS + "ds") != null) && e.Attribute(nsS + "ds").Value.Contains(prevSection.Item1)); 
       if (prevSectionElement != null) 
       { 
        string prevSectionUid = prevSectionElement.Attribute("uid").Value; 
        if (sectionElement != null) 
         sectionElement.Attribute(nsP + "before").SetValue("r[@uid='" + prevSectionUid + "']"); 
       } 
      } 
     } 
     //Save new order 
     this.NewsletterHeader.Editing.BeginEdit(); 
     this.NewsletterHeader["__Renderings"] = xd.ToString(); 
     this.NewsletterHeader.Editing.EndEdit(); 
    } 
} 

結果我收到此XML:

<r xmlns:p="p" xmlns:s="s" p:p="1"> 
    <d id="{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}"> 
    <r uid="{042E3CC4-8205-4A1D-85F4-7D667622711D}" s:ds="" s:par="" s:ph="masterplaceholder" /> 
    <r uid="{B19D0460-69C9-4FEC-A882-41FFA77B582F}" p:before="r[@uid='{F75C5CBE-60E2-4A0A-87F6-B6AB46AC2E52}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/Polecane" s:id="{C3AC52FB-8F51-4B44-A3EE-55F4C2EAF83F}" s:par="" s:ph="moviesplaceholder" /> 
    <r uid="{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}" p:before="r[@uid='{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/HITY" s:id="{7A80D822-8D6A-40C4-92D4-2FA22C596339}" s:par="" s:ph="moviesplaceholder" /> 
    <r uid="{4D8EE7B4-E1D2-4CBF-AED7-5E969EFAA57A}" p:before="r[@uid='{B19D0460-69C9-4FEC-A882-41FFA77B582F}']" s:ds="/sitecore/content/NCPlus/Strony/emagazyn/emagazyn-cplus/VOD" s:id="{557800E7-953B-4830-8691-3FFB964712A8}" s:par="" s:ph="moviesplaceholder" /> 
    <r uid="{B6036949-B723-42CE-9271-64DF299450DC}" p:before="r[@uid='{CC44C44C-B10C-417A-8E19-43B57AAD4C93}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/BANER" s:id="{AE048833-A8AF-4668-938A-FEBA48281620}" s:par="" s:ph="moviesplaceholder" /> 
    <r uid="{CC44C44C-B10C-417A-8E19-43B57AAD4C93}" p:before="r[@uid='{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}']" s:ds="/sitecore/content/emagazyn/emagazyn-cplus/JESZCZE-WIECEJ-HITOW" s:id="{D5FCDC02-C2A8-47A9-BCF5-99A3DF7E8A25}" s:par="" s:ph="moviesplaceholder" /> 
    <r uid="{F75C5CBE-60E2-4A0A-87F6-B6AB46AC2E52}" s:id="{71B654BA-5F47-4053-8936-7199C34E55E4}" s:ph="footerplaceholder" /> 
    </d> 
</r> 

這就是我想要得到的。但是,當我在Sitecore的輸入表現的細節,還有就是爲了這樣的:

  • 瓣兒
  • JESZCZE-更多信息,HITOW
  • HITY
  • VOD
  • Polecane
  • footerplaceholder

我做錯了什麼?有沒有其他的方式來改變這個命令?

回答

6

的順序由uidp:before屬性決定的,所以結果是有意義的。

例如,BANER節點指定它應與{CC44C44C-B10C-417A-8E19-43B57AAD4C93}一個uid節點,這是之前出現JESZCZE-WIECEJ-HITOW

JESZCZE-WIECEJ-HITOW節點指定它應與{D43901A0-1B71-4C65-BEED-DDCF28FCE5A5}一個uid節點,這是之前出現HITY

沒有p:before屬性的唯一節點是footerplaceholder如預期,它最後出現。

那麼以下這些規則,他們在正確的順序所有上市。

值得一提的是有在Sitecore的一個LayoutDefinition類。所以你不需要直接處理XML。

var ld = new LayoutDefinition(); 
ld.LoadXml(this.NewsletterHeader["__Renderings"]); 

檢查使用類thse文章出來的更多信息:

+0

我想我不明白這一點。你說我做得對,但結果順序仍然是錯誤的。那麼我該怎麼做才能得到我想要得到的訂單? – petros

+0

xml中的元素順序也很重要嗎? – petros

+0

我不是說你的代碼是正確的,我希望從輸出的XML中得到輸出。如果結果不是你想要的,那麼你需要考慮操縱'uid'和'p:before'屬性或使用'LayoutDefinition'類。 –