【问题标题】:How to prevent Silverstripe from changing URLSegment field value to lower case?如何防止 Silverstripe 将 URLSegment 字段值更改为小写?
【发布时间】:2014-12-23 10:13:21
【问题描述】:

我的 Silverstripe CMS 中有一个 URLSegment 字段,我想在其中有一个大写的链接。但保存后,Silverstripe 将其更改为小写字符串。我找不到触发此行为的位置。有谁知道,如何预防?

【问题讨论】:

标签: validation silverstripe


【解决方案1】:

URLSegmentFilteris responsible for the lower case conversion of the URLSegment,它调用mb_strtotlowerURLSegmentFilterSiteTreeURLSegmentField 中通过Sitetree's generateURLSegment function 调用。

重要的是,generateURLSegment 函数实际上调用了 Silverstripe 的扩展系统,所以如果你对 SiteTree 进行数据扩展,你只需要指定一个名为 updateURLSegment 的函数并自己做在 Silverstripe 的基础上进行处理。

从我上面链接的代码中,传递给 updateURLSegement 函数的第一个参数将是 URL 的过滤(和小写)版本,第二个参数将是未触及的值。

执行此操作时,我会小心确保您重新实现所有其他过滤代码,如 URLSegmentFilter 所做的(减去小写调用),否则它可能会使用无效字符破坏系统。

对此的一个旁注,我会对实际进行此更改持谨慎态度。在 URL 中使用不同的大小写对任何人都没有帮助,一些用户会认为 URL 区分大小写,而对于某些系统来说这很容易。不过,我不知道 Silverstripe 是否会遇到这个问题,在我参与过或帮助过的各种项目中,我没有遇到过这个问题。

更快速的事情是,还有另一种方法可以使用 Silverstripe 的 Object::useCustomClass function 实现类似的更改并完全覆盖 URLSegmentFilter,尽管仅将其用作最后的手段。

【讨论】:

  • 感谢您快速且内容丰富的回答。我尝试了扩展SiteTree的解决方案,但这没有帮助,因为URLSegmentFilterfilter函数(带有mb_strtolower函数)也在onBeforeWrite()SiteTree中被调用,所以在 CMS 中编辑 URLSegment 字段时,我的 updateURLSegment 函数没有被触发。这就是为什么我必须在我的新类中使用 Object::useCustomClass 并扩展 URLSegmentFilter 并覆盖 filter 函数。
  • 嗯嗯好的,很高兴你成功了。了解它在onBeforeWrite 中也被调用是很有用的,我自己没有拿起它:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多