2010-09-24 39 views
1

我有一個多語言網站結構如下:在C#(語言切換)路徑獲取一把umbraco節點

siteroot 
- en 
-- home 
-- login 
-- etc. 
- de 
-- home 
-- login 
-- etc. 

語言節點下方的內容不一定是相同的。 切換語言時,我想測試一個並行語言節點是否存在。

目前我做了以下內容:

  • 獲取當前路徑
  • 替代路徑 例如語言部分替換/ en /登錄到/ de /登錄
  • 我發現測試頁面的最接近的存在是: XPathNodeIterator i = umbraco.library.GetXmlDocumentByUrl(「http://localhost/de/login」);

調試此顯示,umbraco實際上命中數據庫。這不是測試頁面存在的最佳方式。

任何人手邊有一個更好的方法?

回答

1

通過您的使用cms.businesslogic.web命名空間中的文檔類的聲音。這個類用於修改/發佈umbraco內部的節點。

嘗試使用駐留在umbraco.presentation.nodeFactory節點類。這隻會與內存中的XML緩存進行交互。

Node.GetCurrent() //static method - will give you the current loaded page. 
Node.Parent //class property - will give parent method 

與節點類的問題,它不能採取XPath查詢(不會給性能)

我已經寫了可以用來查詢XML一把umbraco一個動態的LINQ提供程序結構使用編譯的xslt表達式。我將在下週左右出版。讓我知道如果你有興趣...

+0

我使用了業務邏輯,完全是因爲它不需要xpath查詢。你的鏈接提供商聽起來很有趣! – AyKarsi 2010-10-04 07:02:03

+0

你有沒有發佈過這個?我真的想通過路徑獲取節點,因爲我有一個需要來自某個與當前頁面無關的任意路徑的數據的控件。 – jimplode 2010-11-30 14:07:32

0

我們有我們需要做同樣的事情來建立我們的hreflang標記一個多語種的網站。可能有更好的方法,但我決定構建一些Xpath來查找其他語言是否存在匹配節點。我們使用的是umbraco 7,如果可能的話,我會避免使用NodeFactory。它被折舊。使用一把umbraco助手將無法訪問數據庫,並且是查詢到一把umbraco發佈的內容或媒體一把umbraco 7

public static IPublishedContent GetLocalizedVersionOfPage(this IPublishedContent node, string regionName) 
{ 
    var umbracoHelper = new UmbracoHelper(UmbracoContext.Current); 
    var ancestorNames = node.AncestorsOrSelf() 
          .Where(n => n.Level > 1) 
          .OrderBy(n => n.Level) 
          .Select(n => n.Name).ToList(); 

    var xpath = new StringBuilder(); 
    xpath.AppendFormat("/root/HomePage[@nodeName='{0}']", regionName); 
    foreach (var ancestorName in ancestorNames) 
    { 
     xpath.AppendFormat("/*[@nodeName='{0}']", ancestorName); 
    } 

    var matchingNode = umbracoHelper.TypedContentAtXPath(xpath.ToString()).FirstOrDefault(); 
    return matchingNode; 
} 

以上方法對IPublishedContent擴展方法的最佳途徑之一。它允許您傳入該區域,並檢查指定區域中是否存在具有由節點名稱確定的相同路徑的節點。我想過使用urlname而不是節點名稱。你可以做到這一點,以及,甚至使這種更快的通過跳過一段代碼,做了.AncestorsOrSelf()。這取決於你希望如何工作。就我而言,我希望它查找基於即使URL路徑是不同的節點名稱匹配,所以我不得不做.AncestorsOrSelf()。希望這可以幫助。

要考慮的另一件事是如何調用此方法。如果你使用這樣一個循環:

@foreach (var region in Umbraco.TypedContentAtRoot().Where(n => n.IsDocumentType("HomePage"))) 
{ 
    var localizedVersion = currentPage.GetLocalizedVersionOfPage(region.Name); 
    if (localizedVersion != null) 
    { 
     <link rel="alternate" href="@localizedVersion.UrlAbsolute()" hreflang="@LocalizeUtils.GetCulture(region.Name)" /> 
    } 
} 

你最終將獲得當前節點的祖先遍地一次爲每個區域,因爲它調用.AncestorsOrSelf()每次調用GetLocalizedVersionOfPage()時間。重構GetLocalizedVersionOfPage方法可能很有意義,因此您只需撥打.AncestorsOrSelf一次。如果你多次做這類事情,它開始影響性能(特別是如果你的網站是非常嵌套的話)。