0

我正在研究 Sitecore 中的多语言解决方案,并希望使用项目的 DisplayName 属性来表示 URL,以允许特定语言的 URL。

我已将useDisplayNameweb.config 属性设置为 true,如下所示

<linkManager defaultProvider="sitecore">
  <providers>
    <clear />
    <add name="sitecore" 
         alwaysIncludeServerUrl="false"
         encodeNames="true"
         type="Sitecore.Links.LinkProvider, Sitecore.Kernel"
         addAspxExtension="false"
         shortenUrls="true"
         languageEmbedding="asNeeded"
         languageLocation="filePath"
         useDisplayName="true" />
  </providers>
</linkManager>

我也一直在玩<encodeNameReplacements>可以在 URL 中用连字符替换%20以提供漂亮干净的 URL 的部分 - 对于那些感兴趣的人,这是通过以下方式完成的:

<replace mode="on" find=" " replaceWith="-" />

一切都很好,除了如果用户在打开上述设置的情况下在 DisplayName 中输入连字符,Sitecore 会中断......如果我关闭上述设置,那么我必须确保用户为 DisplayName 输入很好的连字符分隔值否则我们开始%20在 URL 中再次看到 nasty s ......

那么,有没有办法验证 DisplayName 属性以禁止或允许使用连字符?

或者,更好的是,有没有办法挂钩到发生 encodeNameReplacements 事情时执行的任何代码?这将是理想的,因为我可以允许用户为 DisplayName 输入他们喜欢的任何内容,然后即时清理此值。

4

2 回答 2

2

有一个解决方案,但它需要一些编码,而且非常复杂。我以前在许多项目中都使用过这种解决方案,这是解决这个问题的唯一方法,我知道。

保存项目时,您不想真正用连字符替换空格,因为它对用户不友好。我的解决方案在运行时有效。

首先摆脱<replace>您添加的规则。

然后创建您自己的LinkProvider(继承自 Sitecore 的默认提供程序)。在 LinkProvider 内部创建一个方法来“规范化”项目的显示名称(例如,用空格替换连字符),让我们调用这个方法NormalizeDisplayName()。将其设为公开和静态,因为您稍后将需要它。

所以现在您已经设法让 Sitecore 用连字符替换链接中的所有空格。其余部分您仍然可以使用默认提供程序选项进行配置(addAspxExtension="false" useDisplayName="true" 等)

接下来是ItemResolver:Sitecore 的默认 ItemResolver 将不再识别项目路径,因此您将添加自己的 ItemResolver 来解决此问题。

创建一个继承自的类,Sitecore.Pipelines.HttpRequest.HttpRequestProcessor并将其配置为在默认 ItemResolver之后<httpRequestBegin>的管道中使用。

现在,当处理 itemresolver 时,您将首先拆分请求的 itempath(假设请求了“/category-name/subitem-name”)。从 siteroot 开始(可以从 中提取Sitecore.Context.Site),循环遍历所有子项,同时使用您NormalizeDisplayName()之前创建的方法规范他们的项目名称,直到找到与项目路径部分匹配的一个。

因此,在这种情况下,循环遍历 Home 项的子项,直到找到与标准化显示名称“类别名称”匹配的项。然后对该项目的子项执行相同的操作,直到找到具有标准化显示名称“subitem-name”的项目。

这样您就可以解析请求的项目,如果原始显示名称已经包含连字符,它也可以工作

很抱歉我不能给你完整的代码示例,因为它非常复杂并且不仅限于上述内容。如果 URL 格式不正确,您还需要考虑重定向,并对 master/core 数据库进行例外处理以防止 Sitecore 中断。

希望这对你有帮助!

于 2012-04-26T09:00:18.043 回答
0

如果您在 .net 反射器 (Sitecore.Shell.Framework.Commands.SetDisplayName) 中看到源代码,则没有运行的管道。

您可以制作一个保存事件,制作显示名称,因为您想用空格替换 hypen

public void OnItemSaving(object sender, EventArgs args)
    {
        Item item = Event.ExtractParameter(args, 0) as Item;

        item.Appearance.DisplayName = item.Appearance.DisplayName.Replace("-", " ");
    }

只是事件的一个简单示例

于 2012-04-19T17:37:45.710 回答