2014-12-23 34 views
0

我在我的Silverstripe CMS中有一个URLSegment字段,并且我希望有一个大写的链接。但是在保存之后,Silverstripe会将其更改为小写字符串。我找不到,这种行为被触发。有谁知道,如何预防?如何防止Silverstripe将URLSegment字段值更改为小写?

+1

确定您知道大写字母在网址中的含义? http://wiredimpact.com/blog/never-use-capital-letters-urls/ – schellmax

回答

1

该类别URLSegmentFilteris responsible for the lower case conversion of the URLSegment,它叫mb_strtotlowerURLSegmentFilter通过Sitetree's generateURLSegment functionSiteTreeURLSegmentField中调用。

从这个就是generateURLSegment功能实际上调用Silverstripe的扩展系统,所以如果你做的SiteTree数据扩展,你只需要指定一个名为updateURLSegment功能和做的顶部自己处理带走重要的部分是什么银条纹。

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

当这样做的时候,我会小心的确保你重新实现所有其他的过滤代码,如URLSegmentFilter(不包括小写调用),否则它可能会破坏系统中的无效字符。

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

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

+0

感谢您提供快速且非常翔实的答案。我尝试了扩展'SiteTree'的解决方案,但这并没有帮助,因为'URLSegmentFilter'(带有'mb_strtolower'函数)的'filter'函数也在'SiteTree'的'onBeforeWrite()'中调用。 ,所以当编辑CMS中的URLSegment字段时,我的'updateURLSegment'函数没有被触发。这就是为什么我必须使用'Object :: useCustomClass'并在我的新类中使用'filter'功能覆盖'URLSegmentFilter'。 – user3888130

+0

Ahhhh好吧,很高兴你能工作。这对于了解它在'onBeforeWrite'中被调用是有用的,并没有自己选择:) – Turnerj

相关问题