2014-10-29 75 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