MODx ЧПУ в utf-8. Делаем ЧПУ еще более понятным

Долгое время меня терзало отсутствие поддержки UTF-8 в ссылках MODx. Это довольно напрягало, так как в у себя в блоге(wordpress) все ссылочки на русском и я привык к приятной индексации поисковиков)) MODx хоть и приколен но с UTF-8 еще есть траблы.
Вообщем седня уделил немножко времени и сделал таки русские буковки в ссылках))

Итак по порядку.
В папочке /manager/processors есть файлик save_content.processor.php он отвечает за сохранение наших страничек, где собсно и коверкается наш ЧПУ. Вообщем лезим в него.

Первое что делаем это добавляем следующий код(он будет чистить наш ЧПУ после ввода):

setlocale(LC_ALL, "ru_RU.UTF-8");
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');

function StripAliasMod($data) {
$data=trim($data);
$data=eregi_replace("[][,.?&\"#\{\(\_\\\@)\=\+\,\?\.;\/:\!%\*\(\)|}\]+", "", $data);
$data=eregi_replace("[[:space:][:blank:]]+", "-", $data);
$data=mb_strtolower($data);
return $data;
}

Далее находим следующие строчки strtolower($modx->stripAlias(trim($pagetitle))) и $modx->stripAlias($alias)

И меняем их на StripAliasMod($pagetitle) и StripAliasMod($alias) соответственно.

ЗЫ: Не забудьте оставить бекап файлика. Скрипт рабочий, но все же всегда нужно перестраховываться.

Update! Как выяснилось в некоторых системах нужно добавить код приведенный ниже в файл manager/includes/document.parser.class.inc.php (Вставлять с самого начала страницы)

setlocale(LC_ALL, “ru_RU.UTF-8″);
mb_internal_encoding(’UTF-8′);
mb_regex_encoding(’UTF-8′);

Источник: creotiv.in.ua

MODx ЧПУ в utf-8. Делаем ЧПУ еще более понятным: 19 комментариев

  1. Крутая статья, да и сам сайт я смотрю очень даже не плох. Попал сюда по поиску из Яндекса, занес в закладки 🙂

  2. Когда добавляю в файл manager/includes/document.parser.class.inc.php код который выше, аот такая ошибка… Подскажите что не так сделал. Буду очень благодарен.

    Parse error: syntax error, unexpected ‘`’ in /home/users/s/spatial/domains/spatial.jino.ru/manager/includes/document.parser.class.inc.php on line 8

  3. Извиняюсь, вот такая —
    Parse error: syntax error, unexpected T_STRING in /home/users/s/spatial/domains/spatial.jino.ru/manager/includes/document.parser.class.inc.php on line 8

    (предыдущую исправил)

  4. Судя по всему Вы и сами прекрасно разобрались;)
    «/blog/» и «/2/» показывают одну и туже страницу.

  5. Простите, но я не понял Ваш ответ =(
    Впрошлий раз я запятые просто не те поставил а сейчас код правильно вписал в файл по адресу
    manager/includes/document.parser.class.inc.php
    но ошибка только с такой — unexpected ‘`’ на — unexpected T_STRING превратилась.

    Что здесь я уже догадаться не могу… Подскажите пожалуйста, буду очень благодарен. Заранее спасибо.

    ПС. если чесно, у меня даже мысль не проскакивала что в МОДе можно такое сделать (Тоесть удивлен что можна). Спасибо Вам!

  6. Все сделал как написано — вместо русских букв в ссылке вот такие символы ���. Понимаю что проблема в кодировке. Но где и как исправить я не знаю… Подскажете?

  7. Не рабочий этот рецепт =(
    Не только я один пробовал…

  8. Вопрос до сих пор актуальный, раз я искать ответ начал. Собственно у меня проблема оказалась в мускуле — по какой то причине при запросе вида SELECT IF(a!=»,a,b)…. если «a» содержит русские — они заменяются на �
    лечится следующим образом (evolution v. 1.0.4)
    Файл manager/processors/cache_sync.class.processor.php
    строка примерно 34 меняем
    $sql = «SELECT id, IF(alias=», id, alias) AS alias, parent FROM «.$modx->getFullTableName(‘site_content’);
    на
    $sql = «SELECT id, alias, parent FROM «.$modx->getFullTableName(‘site_content’);

    здесь же (~37 строка) после
    while ($row = $modx->db->getRow($qh)) {
    добавляем:
    if($row[‘alias’]==»)$row[‘alias’]=$row[‘id’];

    строка примерно 123 меняем
    $sql = ‘SELECT IF(alias=\’\’, id, alias) AS alias, id, contentType, parent FROM ‘.$modx->getFullTableName(‘site_content’).’ WHERE deleted=0 ORDER BY parent, menuindex’;
    на
    $sql = ‘SELECT id, alias, contentType, parent FROM ‘.$modx->getFullTableName(‘site_content’).’ WHERE deleted=0 ORDER BY parent, menuindex’;

    здесь же (~127 строка) после
    $tmp1 = $modx->db->getRow($rs);
    добавляем
    if($tmp1[‘alias’]==»)$tmp1[‘alias’]=$tmp1[‘id’];

    у меня заработало:)

    пс.. что за гадость с выставлением иконок вертикально?? издевательство!!! 🙂

  9. Мда… заковычило код — но смысл ясен — нужно проверку IF из мускла перенести в php

  10. За решении спасибо — думаю пригодится не мне одному. Издевательство с вертикальными иконками пришлось поставить так как спамеров развелось слишком много.

  11. у меня вот такая ошибка при сохранении русских слов имени шаблона:
    Fatal error: Call to undefined function: mb_strtolower() in /home/postman/xn--80aa2aox.xn--p1ai/docs/manager/processors/save_content.processor.php on line 713

  12. также еще и такая
    Fatal error: Call to undefined function: mb_internal_encoding() in /home/postman/xn--80aa2aox.xn--p1ai/docs/manager/includes/document.parser.class.inc.php on line 4

  13. получается функции не найдены, что делать подскажите?

  14. Александр, у вас на сервере не включена библиотека mbstring. Эта библиотека предназначена для корректной работы с кодировкой UTF8.

  15. А как это исправить? Мой сайт размещен на хостинге NIC.

  16. Александр, у них в панели это можно настроить. http://hosting.nic.ru/faq/php.shtml#q4 Модуль уже установлен но видимо не включен по умолчанию. Поищите в меню «управлениями модулями» или что-то подобное со списком модулей и возможностью вкл/выкл.

  17. Скажите, столкнулся с такой проблемой.
    После установки ЧПУ всё заработало отлично. Но в индексе Яндекса появились страницы с урлами вида index.php?id=135. Как в аштиацессе запретить такие к индексации? Спасибо.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *