2014-12-23 3 views
0

У меня есть поле URLSegment в моей Silverstripe CMS, и я хочу иметь ссылку там с верхним регистром. Но после сохранения Silverstripe изменит его на строчную строку. Я не могу найти, где это поведение срабатывает. Кто-нибудь знает, как это предотвратить?Как предотвратить использование Silverstripe значения поля URLSegment в нижнем регистре?

+1

уверен, что вы знаете о значениях заглавных букв в URL-адресах? http://wiredimpact.com/blog/never-use-capital-letters-urls/ – schellmax

ответ

1

Класс 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 этот вопрос, но я не сталкивался с ним с разнообразными проектами, над которыми я работал, или помогал людям.

Еще одна вещь, есть другой способ реализовать аналогичные изменения с использованием Object::useCustomClass function Silverstripe и полностью переопределить URLSegmentFilter, хотя использовать это только в качестве последнего средства.

+0

Благодарим вас за быстрый и очень информативный ответ. Я попробовал решение с расширением 'SiteTree', но это не помогло, потому что функция' filter' 'URLSegmentFilter' (с функцией' mb_strtolower') также вызывается в 'onBeforeWrite()' 'SiteTree' , поэтому моя функция updateURLSegment не запускалась при редактировании поля URLSegment в CMS. Вот почему мне пришлось использовать «Object :: useCustomClass» и расширять «URLSegmentFilter» в моем новом классе с помощью функции «фильтр». – user3888130

+0

Ahhhh OK, рад, что у вас это работает. Это полезно знать о том, что он вызывается в 'onBeforeWrite' тоже, сам не забирал это :) – Turnerj

Смежные вопросы