我正在使用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,然后只是动态清理这个值。
答案 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("-", " ");
}
只是事件的一个简单例子