Долгое время меня терзало отсутствие поддержки 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
Крутая статья, да и сам сайт я смотрю очень даже не плох. Попал сюда по поиску из Яндекса, занес в закладки 🙂
Когда добавляю в файл 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
Извиняюсь, вот такая —
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
(предыдущую исправил)
Судя по всему Вы и сами прекрасно разобрались;)
«/blog/» и «/2/» показывают одну и туже страницу.
Простите, но я не понял Ваш ответ =(
Впрошлий раз я запятые просто не те поставил а сейчас код правильно вписал в файл по адресу
manager/includes/document.parser.class.inc.php
но ошибка только с такой — unexpected ‘`’ на — unexpected T_STRING превратилась.
Что здесь я уже догадаться не могу… Подскажите пожалуйста, буду очень благодарен. Заранее спасибо.
ПС. если чесно, у меня даже мысль не проскакивала что в МОДе можно такое сделать (Тоесть удивлен что можна). Спасибо Вам!
Все сделал как написано — вместо русских букв в ссылке вот такие символы ���. Понимаю что проблема в кодировке. Но где и как исправить я не знаю… Подскажете?
Не рабочий этот рецепт =(
Не только я один пробовал…
Вопрос до сих пор актуальный, раз я искать ответ начал. Собственно у меня проблема оказалась в мускуле — по какой то причине при запросе вида 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’];
у меня заработало:)
пс.. что за гадость с выставлением иконок вертикально?? издевательство!!! 🙂
Мда… заковычило код — но смысл ясен — нужно проверку IF из мускла перенести в php
За решении спасибо — думаю пригодится не мне одному. Издевательство с вертикальными иконками пришлось поставить так как спамеров развелось слишком много.
у меня вот такая ошибка при сохранении русских слов имени шаблона:
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
также еще и такая
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
получается функции не найдены, что делать подскажите?
Александр, у вас на сервере не включена библиотека mbstring. Эта библиотека предназначена для корректной работы с кодировкой UTF8.
А как это исправить? Мой сайт размещен на хостинге NIC.
Александр, у них в панели это можно настроить. http://hosting.nic.ru/faq/php.shtml#q4 Модуль уже установлен но видимо не включен по умолчанию. Поищите в меню «управлениями модулями» или что-то подобное со списком модулей и возможностью вкл/выкл.
Спасибо, все заработало)))
Скажите, столкнулся с такой проблемой.
После установки ЧПУ всё заработало отлично. Но в индексе Яндекса появились страницы с урлами вида index.php?id=135. Как в аштиацессе запретить такие к индексации? Спасибо.
я вот такой вариант придумал http://www.jepper.ru/2012/05/%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE-%D0%BE-%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B5-%D1%80%D1%84-%D0%B8-%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D1%87%D0%BF%D1%83-modx/