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

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

  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. Как в аштиацессе запретить такие к индексации? Спасибо.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Before you submit form:
Human test by Not Captcha