Sitecore 为项DisplayName属性生成验证规则
我正在Sitecore中开发一个多语言解决方案,希望使用项目的DisplayName属性来表示URL,以允许使用特定于语言的URL 我已将Sitecore 为项DisplayName属性生成验证规则,sitecore,Sitecore,我正在Sitecore中开发一个多语言解决方案,希望使用项目的DisplayName属性来表示URL,以允许使用特定于语言的URL 我已将useDisplayNameweb.config属性设置为true,如下所示 <linkManager defaultProvider="sitecore"> <providers> <clear /> <add name="sitecore" alwaysIncludeServ
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>
一切都很好,除了当用户在上面的设置打开时在DisplayName中输入连字符时Sitecore会中断。。。。如果我关闭上述设置,那么我必须确保用户为DisplayName输入漂亮的连字符分隔值,否则我们会在URL中再次看到讨厌的%20
s
那么,有没有一种方法可以验证DisplayName属性以禁止或允许使用连字符
或者,更好的是,当encodeNameReplacements事件发生时,有没有一种方法可以钩住执行的任何代码?这将非常理想,因为我可以允许用户为DisplayName输入他们喜欢的任何内容,然后动态清理该值。如果您在.net reflector(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("-", " ");
}
这只是事件的一个简单示例,有一个解决方案,但它需要一些编码,而且相当复杂。 我以前在很多项目中使用过这种解决方案,我知道这是解决这个问题的唯一方法 在保存项目时,您不希望真正用连字符替换空格,因为它对用户不友好。 我的解决方案在运行时工作 首先去掉您添加的
规则
然后创建自己的LinkProvider
(从Sitecore的默认提供程序继承)。
在LinkProvider中,创建一个方法来“规范化”项的显示名(例如,用连字符替换空格),我们将此方法称为NormalizeDisplayName()
。让它公开和静态,因为你以后会需要它
因此,现在您已经设法让Sitecore用连字符替换链接中的所有空格。其余部分仍然可以使用默认的提供程序选项(addAspxExtension=“false”useDisplayName=“true”等)进行配置
接下来是itemsolver
:Sitecore的默认itemsolver将不再识别项目路径,因此您将添加自己的itemsolver来解决此问题
创建一个从Sitecore.Pipelines.HttpRequest.HttpRequestProcessor
继承的类,并将其配置为在默认项解析器之后的
管道中使用
现在,在处理itemresolver时,您将首先拆分请求的itempath(假设请求了“/category name/subitem name”)。
从siteroot开始(可以从Sitecore.Context.Site
)循环所有子项,同时使用前面创建的NormalizeDisplayName()
方法对其项名称进行规范化,直到找到与项路径部分匹配的项
因此,在本例中,循环遍历主项的子项,直到找到一个与规范化的displayname“category name”匹配的项。然后对该项的子项执行相同的操作,直到找到具有规范化displayname“SubItemName”的项
通过这种方式,您可以解析请求的项目,如果原始显示名已包含连字符,则该项也将起作用
很抱歉,我不能给你完整的代码示例,因为它非常复杂,不限于上述内容。如果URL格式不正确,您还需要考虑重定向,并为master/core数据库设置例外以防止Sitecore中断
希望这对你有帮助 您好,我也在考虑类似的问题,但希望在运行时应用一个解决方案,而不是依赖于保存事件-用户可能会觉得有点奇怪,他们的CMS会自动更改他们为某些内容设置的名称。我也在想同样的问题,并试图想出一个解决方案。但是Sitecore中有很多地方可以设置显示名称。自定义命令、项目生成等,您无法编写钩子,以验证inputHi。感谢您的回答。我喜欢在运行中做所有事情,尤其是在用户保存后不重命名东西。像这样通过内容树进行递归是否会对性能造成一点影响?这可能是一个性能问题是的,但前提是您的站点结构中有很多项目(比如超过200个)的文件夹,无论发生什么情况,这些文件夹总是被强烈劝阻的。如果你有一个巨大的站点结构,你可以在ItemResolver中实现缓存。此实现已用于多个高流量网站,但没有造成任何性能问题!
public void OnItemSaving(object sender, EventArgs args)
{
Item item = Event.ExtractParameter(args, 0) as Item;
item.Appearance.DisplayName = item.Appearance.DisplayName.Replace("-", " ");
}