根据sitecore中的displayname获取项目

时间:2014-10-29 12:00:37

标签: sitecore

我需要根据它的显示名称获取特定项目,我该怎么做?

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

2 个答案:

答案 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;领域。你必须做类似的东西。