【发布时间】:2014-12-23 10:13:21
【问题描述】:
我的 Silverstripe CMS 中有一个 URLSegment 字段,我想在其中有一个大写的链接。但保存后,Silverstripe 将其更改为小写字符串。我找不到触发此行为的位置。有谁知道,如何预防?
【问题讨论】:
-
确定您了解 url 中大写字母的含义吗? wiredimpact.com/blog/never-use-capital-letters-urls
我的 Silverstripe CMS 中有一个 URLSegment 字段,我想在其中有一个大写的链接。但保存后,Silverstripe 将其更改为小写字符串。我找不到触发此行为的位置。有谁知道,如何预防?
【问题讨论】:
类URLSegmentFilteris responsible for the lower case conversion of the URLSegment,它调用mb_strtotlower。 URLSegmentFilter 在SiteTreeURLSegmentField 中通过Sitetree's generateURLSegment function 调用。
重要的是,generateURLSegment 函数实际上调用了 Silverstripe 的扩展系统,所以如果你对 SiteTree 进行数据扩展,你只需要指定一个名为 updateURLSegment 的函数并自己做在 Silverstripe 的基础上进行处理。
从我上面链接的代码中,传递给 updateURLSegement 函数的第一个参数将是 URL 的过滤(和小写)版本,第二个参数将是未触及的值。
执行此操作时,我会小心确保您重新实现所有其他过滤代码,如 URLSegmentFilter 所做的(减去小写调用),否则它可能会使用无效字符破坏系统。
对此的一个旁注,我会对实际进行此更改持谨慎态度。在 URL 中使用不同的大小写对任何人都没有帮助,一些用户会认为 URL 区分大小写,而对于某些系统来说这很容易。不过,我不知道 Silverstripe 是否会遇到这个问题,在我参与过或帮助过的各种项目中,我没有遇到过这个问题。
更快速的事情是,还有另一种方法可以使用 Silverstripe 的 Object::useCustomClass function 实现类似的更改并完全覆盖 URLSegmentFilter,尽管仅将其用作最后的手段。
【讨论】:
SiteTree的解决方案,但这没有帮助,因为URLSegmentFilter的filter函数(带有mb_strtolower函数)也在onBeforeWrite()的SiteTree中被调用,所以在 CMS 中编辑 URLSegment 字段时,我的 updateURLSegment 函数没有被触发。这就是为什么我必须在我的新类中使用 Object::useCustomClass 并扩展 URLSegmentFilter 并覆盖 filter 函数。
onBeforeWrite 中也被调用是很有用的,我自己没有拿起它:)