2010-09-24 63 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一次。如果你多次做这类事情,它开始影响性能(特别是如果你的网站是非常嵌套的话)。