Red Spirit

Блог Алексея Таянчина

RSS 2.0

Пользовательское ЧПУ в MODx Revolution

Иногда, а точнее, весьма часто на сайтах требуется сделать красивые URL для указания на разный динамический контент. Например надо сделать страничку для просмотра профилей юзеров сайта – самый распространенный пример. Чтобы сделать это на MODx используя только стандартные компоненты, то надо сделать следующий действия:

1. Создать ресурс (например, Пользователь) и присвоить алиас (например, user)
2. Передать параметр для страницы с ID пользователя, тогда будет выглядеть как-то так: /user&id=123
3. В сниппете, который вызывается на этой странице произвести обработку параметра ($_GET['id']) и далее вывести инфу о юзерах

Все норм, но ссылка не красивая, хотелось бы видеть что-то типа: /user/123 – показать инфу для юзера с ID=123. Как это сделать? Есть два пути решения:

ПУТЬ 1 – через правила внутреннего редиректа на самом сервере (modRewrite для Апача), там с помощью регулярного выражения смотрится проверяется запрос и если он подходит под шаблон то заменяется на строку с параметрами:

Пример, который можно вставить в .htaccess:
RewriteRule ^user\/(.*)$ index.php?q=user&id=$1 [L]

В данном случае при наборе адреса /user/123 MODx запустит ресурс с алиасом user и передаст параметр id.

ПУТЬ 2 – не вмешиваться в настройки сервера а сделать все на самом MODx-е, поможет в этом случае использование самописного плагина настроенного на вызов системного события OnHandleRequest.

Схема такая:
1. Происходит запрос
2. MODx запускает событие OnHandleRequest
3. срабатывает наш плагин, который прослушивает это событие
4. код в плагине смотрит на запрос, сверяет его с регулярным выражением
5. если там наш запрос, то обработчик разбирает его на кусочки и дальше передает то что надо для вызова нужного ресурса и передачи ему нужных параметров

Код плагина:

Я нашел это решение в архивах на Серче и несколько переделал под себя. Тут у нас в строке:
$params = array(‘users’, ‘album’, ‘avatar’);
указан список алиасов с ресурсами, который будут срабатывать, например если указать /album/myhome то сработает ресурс album и передаст GET параметр album=myhome который можно как угодно использовать потом в сниппете.

Чтобы добавить этот плагин нужно:
1. создать пустой плагин в админке, дать ему любое имя (например myURL)
2. добавить вышеуказанный код со своими изменениями по вкусу
3. на вкладке “Системные события” отметить галочку напротив OnHandleRequest
4. сохранить

Все, можно проверять работу. Идея понятна, используя регулярки можно обрабатывать урлы любого вида так как это нужно именно вам.

Кстати, возможно в репозитории Модекса уже есть подобные дополнения, я как-то не нашел, что странно.

Categories: Modx Revo Тэги:

  • Ruslan Bladerunner

    Спасибо за полезную статью :) Используя путь 2 реализовал ЧПУ для страниц, у которых один get параметр. Но не выходит сделать по аналогии для страниц с несколькими get параметрами, например ссылка вида: url_site/param1/paramvalue1/param2/paramvalue2. Подскажите, пожалуйста, как можно такое сделать.