【问题标题】:Get item based on displayname in sitecore根据 sitecore 中的显示名称获取项目
【发布时间】:2014-10-29 21:44:11
【问题描述】:

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

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

【问题讨论】:

  • 嗨.. 当你说你想得到一个项目时,你的意思是在 C# 中使用 API?

标签: sitecore


【解决方案1】:

您可以采取几种方法。最有效的是利用内容搜索 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;
}

请注意,这将非常低效,因为这基本上是在遍历内容树。

【讨论】:

  • 无论如何我们可以包含模板名称以使其更精致吗?
  • 如果我的显示名称带有空格怎么办?不能用作搜索关键字。
【解决方案2】:

通常,您不需要这样做。 LinkManager(负责生成您的所有项目 URL)可以选择基于显示名称而不是 Item.Name 的 URL。

        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”字段进行比较。您将不得不烹制类似的东西。

【讨论】:

  • 是的,这正是我所做的,根据显示名称生成 url。它变得更加棘手,因为它是在页面上调用的 Web 服务,它对 Sitecore 一无所知,只知道调用它的 url(带有显示名称的 sitecore 项目),所以我必须根据 url 回溯到特定项目。但感谢您的意见,我会尽力解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多