2014-10-29 78 views
1

我需要根据它的displayname来获取特定项目,我该怎么做?根据sitename中的displayname获取项目

例如我想要得到这个项目/ sitecore/content/mysite /约 但在网站上翻译成多种语言,可能是类似于www.site.com/om(在Sitecore中它会是/ sitecore/content/mysite/om)

+0

嗨..当你说你想要得到一个项目,你的意思是使用API​​,在C#中? – RobertoBr 2014-10-29 12:34:14

+0

是的,它来自c# – RangerChris 2014-10-29 13:21:00

回答

3

您可以采取几种方法。效率最高的是利用内容搜索API,但挑战在于显示名称默认情况下会从索引中排除。一个简单的补丁文件可以解决此问题:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
    <contentSearch> 
     <indexConfigurations> 
     <defaultLuceneIndexConfiguration> 
      <exclude> 
      <__display_name> 
       <patch:delete /> 
      </__display_name> 
      </exclude> 
     </defaultLuceneIndexConfiguration> 
     </indexConfigurations> 
    </contentSearch> 
    </sitecore> 
</configuration> 

那么你的代码将是这样的:

public Item GetItemByDisplayName(string displayName) 
{ 
    var searchIndex = ContentSearchManager.GetIndex("sitecore_master_index"); // sub your index name 
    using (var context = searchIndex.CreateSearchContext()) 
    { 
     var searchResultItems = 
      context.GetQueryable<SearchResultItem>().Where(i => i["Display Name"].Equals(displayName)).FirstOrDefault(); 


     return searchResultItems == null ? null : searchResultItems.GetItem(); 
    } 
} 

这一切都是假设你是在Sitecore的7.如果你在Sitecore的6,你的选择如果内容树很大,则可能不会很好地发挥作用。尽管如此,你的函数可能看起来像:

public Item GetItemByDisplayName(string displayName) 
{ 
    var query = string.Format("fast:/sitecore/content//*[@__Display Name='{0}']", displayName); 

    var item = Sitecore.Context.Database.SelectSingleItem(query); 

    return item; 
} 

请注意,这将是可怕的,因为inefficent在幕后,这是基本上走的内容树。

+0

无论如何,我们可以包含模板名称以使其更加精致吗? – 2016-11-23 14:28:20

1

通常情况下,您不需要。 LinkManager(负责生成所有项目URL)可以选择将显示名称上的URL而不是Item.Name。

 var d = LinkManager.GetDefaultUrlOptions(); 
     d.UseDisplayName = true; 

这也可以在配置中进行配置。查找和修改在你的web.config这一部分(或修补它通过包括文件):

<linkManager defaultProvider="sitecore"> 
    <providers> 
    <clear /> 
    <add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" 
     addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" 
     languageEmbedding="never" languageLocation="filePath" lowercaseUrls="true" 
     shortenUrls="true" useDisplayName="false" /> 
    </providers> 
</linkManager> 

要真正做的正是你问的是一个相当复杂的过程。如果您将DotPeek指向Sitecore.Pipelines.HttpRequest.ItemResolver,则可以遍历ResolveUsingDisplayName()方法。它本质上是循环通过子项目,将URL部分与“__Display Name”字段进行比较。你将不得不做出类似的东西。

+0

是的,这正是我所做的,基于显示名称生成网址。 它变得更加棘手,因为它是一个在页面上调用的web服务,它不知道Sitecore,只知道它被调用的url(带有显示名称的sitecore项目),所以我不得不根据url来回溯到特定的项目。 但是,由于输入,我会尽力找出一些东西。 – RangerChris 2014-10-29 13:20:38