Как стать автором
Обновить

HostCMS и проблема с ЧПУ

Проблема:

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

image

Не могу, да и не имею достаточно времени, чтоб проверить на других версиях и установках, поэтому просто зафиксирую решение.

Задача:

На лету осуществлять транслитерацию урла из заголовка в информационной группе и в информационном элементе.

Решение:

Первым делом попробовал несколько раз пересохранить туда-сюда элементы и группы, проблема не исчезла. Если оставить пустым путь, то урл становится съедобным, но не ЧПУ. Например /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 просядет...
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.