Проблема:
В HostCMS 6.5.1 редакции «халява» вдруг обнаружилась проблема, а именно перестали транслителироваться урлы в информационных системах. В итоге вместо вкусного пути мы видим следующее:

Не могу, да и не имею достаточно времени, чтоб проверить на других версиях и установках, поэтому просто зафиксирую решение.
Задача:
На лету осуществлять транслитерацию урла из заголовка в информационной группе и в информационном элементе.
Решение:
Первым делом попробовал несколько раз пересохранить туда-сюда элементы и группы, проблема не исчезла. Если оставить пустым путь, то урл становится съедобным, но не ЧПУ. Например /services/12/137/. Меня это не устроило.
Дальше старая школа костылей дала о себе знать и я небольшим запросом в базе решил поставленную задачу на раз-два, но при этом новые элементы получают все тот же некрасивый урл.
И, наконец-таки, пришло в голову изящное и простое решение: использовать хуки. В сухом остатке информации хватило этой и вот этой.
Результат:
В файл bootstrap.php в корне сайта пишем вызов наших хуков.
Core_Event::attach('informationsystem_item.onBeforeUpdate', array('Informationsystem_Item_Observer', 'onBeforeUpdate'));
Core_Event::attach('informationsystem_item.onBeforeCreate', array('Informationsystem_Item_Observer', 'onBeforeCreate'));
Core_Event::attach('informationsystem_group.onBeforeUpdate', array('Informationsystem_Group_Observer', 'onBeforeUpdate'));
Core_Event::attach('informationsystem_group.onBeforeCreate', array('Informationsystem_Group_Observer', 'onBeforeCreate'));
В файл /modules/informationsystem/item/observer.php (если его нет, создаем) пишем:
class Informationsystem_Item_Observer
{
static public function onBeforeUpdate($object, $args)
{
$object->path = Core_Str::transliteration($object -> name);
}
static public function onBeforeCreate($object, $args)
{
$object->path = Core_Str::transliteration($object -> name);
}
}
В файл /modules/informationsystem/group/observer.php (если его нет, создаем) пишем:
class Informationsystem_Group_Observer
{
static public function onBeforeUpdate($object, $args)
{
$object->path = Core_Str::transliteration($object -> name);
}
static public function onBeforeCreate($object, $args)
{
$object->path = Core_Str::transliteration($object -> name);
}
}
Про вот эту штуку поглядел в модели интернет-магазина.
Core_Str::transliteration
Как ни странно, там все работает нормально.
В итоге при создании и обновлении элемента url генерируется снова.
Проблемы:
- Как подключить хуки без модификации файлов движка?
- Как сделать умную транслитерацию, т.е. не каждый раз при сохранении заменять урл, а только тогда, когда это необходимо — иначе SEO просядет...