我需要根據它的displayname來獲取特定項目,我該怎麼做?根據sitename中的displayname獲取項目
例如我想要得到這個項目/ sitecore/content/mysite /約 但在網站上翻譯成多種語言,可能是類似於www.site.com/om(在Sitecore中它會是/ sitecore/content/mysite/om)
我需要根據它的displayname來獲取特定項目,我該怎麼做?根據sitename中的displayname獲取項目
例如我想要得到這個項目/ sitecore/content/mysite /約 但在網站上翻譯成多種語言,可能是類似於www.site.com/om(在Sitecore中它會是/ sitecore/content/mysite/om)
您可以採取幾種方法。效率最高的是利用內容搜索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在幕後,這是基本上走的內容樹。
無論如何,我們可以包含模板名稱以使其更加精緻嗎? – 2016-11-23 14:28:20
通常情況下,您不需要。 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」字段進行比較。你將不得不做出類似的東西。
是的,這正是我所做的,基於顯示名稱生成網址。 它變得更加棘手,因爲它是一個在頁面上調用的web服務,它不知道Sitecore,只知道它被調用的url(帶有顯示名稱的sitecore項目),所以我不得不根據url來回溯到特定的項目。 但是,由於輸入,我會盡力找出一些東西。 – RangerChris 2014-10-29 13:20:38
嗨..當你說你想要得到一個項目,你的意思是使用API,在C#中? – RobertoBr 2014-10-29 12:34:14
是的,它來自c# – RangerChris 2014-10-29 13:21:00