我需要根据它的显示名称获取特定项目,我该怎么做?
例如我想得到这个项目/ sitecore / content / mysite / about 但在网站上被翻译成多种语言,可能像www.site.com/om(在Sitecore中它将是/ sitecore / content / mysite / om)
答案 0 :(得分: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;
}
请注意,这将是非常无效的,因为在封面下这基本上是走内容树。
答案 1 :(得分: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部分与&#34; __显示名称&#34;领域。你必须做类似的东西。