为项DisplayName属性构建验证规则

时间:2012-04-19 16:40:02

标签: sitecore

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

我已将useDisplayName web.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以提供漂亮干净的网址 - 对于那些感兴趣的人,这可以通过以下方式完成:< / p>

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

一切都很好,除非如果用户在上面的设置打开的情况下在DisplayName中输入连字符,Sitecore就会中断....如果我关闭上面的设置,那么我必须确保用户输入漂亮的连字符分隔值对于DisplayName,否则我们会再次在URL中看到令人讨厌的%20 ...

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

或者,更好的是,当encodeNameReplacements事件发生时,有没有办法挂钩执行的任何代码?这是理想的,因为我可以允许用户输入他们喜欢的DisplayName,然后只是动态清理这个值。

2 个答案:

答案 0 :(得分:2)

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

在保存项目时,您不希望真正用连字符替换空格,因为它不是用户友好的。 我的解决方案在运行时工作。

首先删除您添加的<replace>规则。

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

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

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

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

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

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

通过这种方式,您可以解析所请求的项目,如果原始显示名称已包含连字符,也可以使用

对不起,我不能给你完整的代码示例,因为它非常复杂,并不仅限于上述内容。如果URL格式不正确,您还需要考虑重定向,并为主/核数据库设置例外,以防止Sitecore破坏。

希望这能帮到你!

答案 1 :(得分:0)

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

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

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

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

只是事件的一个简单例子