Skip to content

Instantly share code, notes, and snippets.

@alroniks
Last active November 13, 2018 08:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save alroniks/e94bb0b997bbb55d02f94e72bc62a64c to your computer and use it in GitHub Desktop.
Save alroniks/e94bb0b997bbb55d02f94e72bc62a64c to your computer and use it in GitHub Desktop.
<?php
// обрабатываем только события OnPageNotFound, на случай, если отметили галкой и другие в настройках плагина
if ($modx->event->name != 'OnPageNotFound') {
return false;
}
// на случай, если у нас настройки кто-то менял, получаем значение переменной, через которую передаются ссылки в modx от веб-сервера
$alias = $modx->context->getOption('request_param_alias', 'q');
// проверяем, что такая переменная есть, иначе и обрабатывать нечего
if (!isset($_REQUEST[$alias])) {
return false;
}
// наш запрос, который нужно разобрать и обработать
$request = $_REQUEST[$alias];
// разбиваем ссылку на составляющие,
// как правило, будет что-то вроде users/username, на выходе будет массив с этими значениями
$chunks = explode('/', $request);
// на всякий случай проверяем, что у нас есть корневой ресурс для пользователей, страница users
if (!$users = $modx->getObject('modResource', ['id' => 5])) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Entry point resource for users not found.');
return false;
}
// а теперь обрабатываем нам запрос.
switch ($chunks[0]) {
// сверяем первую часть ссылки с алиасом нашего ресурса для пользователей, должны совпадать
case $users->get('alias'):
// еще одна проверка существования ресурса (наверное можно удалить, взял пример из реального проекта)
if (!$usersSection = $modx->findResource($chunks[0])) {
return false;
}
// у меня ссылки генерились с html, поэтому я вырезаю расширение перед поиском самого юзера
$userAlias = str_replace('.html', '', $chunks[1]);
// еще одна проверка + убираем концевые слеши и редиректим на нормальную ссылку
if ($chunks[1] != $userAlias || (isset($chunks[2]) && $chunks[2] == '')) {
$modx->sendRedirect($chunks[0] . '/' . $userAlias);
}
// пробуем найти пользователя по username из запроса, если не нашли, то посылаем 404 заголовок
// тут важно вручную послать страницу 404, иначе, если вернем просто ошибку, то у нас опять запустится обработчик
// 404 ошибки, опять запустится наш плагин, опять тут будет ошибка и привет бесконечный круг и ААААА! Ничего не работает!!!!!
if (!$user = $modx->getObject('modUser', ['username' => $userAlias])) {
$modx->sendForward($this->getOption('error_page'), $this->getOption('error_page_header', null, 'HTTP/1.0 404 Not Found'));
}
// пользоввателя нашли, теперь подгружаем его данные (профайл, расширенные поля и тд)
/** @var modUserProfile $profile */
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
// прописываем все наши данные в плейсхолдеры, чтобы потом на странице их вывести
$modx->setPlaceholders($user, 'user.');
$modx->setPlaceholders($profile, 'user.');
$modx->setPlaceholders($extended, 'user.');
// тут у меня еще момент, что пользователь может указать, что у него профиль приватный и его никому показывать нельзя,
// поэтому в таком случае тоже 404 возвращаем. Но можно удалить
// profile private, we should return not found error
if (isset($extended['private']) && $extended['private'] == 1) {
$modx->sendForward($this->getOption('error_page'), $this->getOption('error_page_header', null, 'HTTP/1.0 404 Not Found'));
}
// ну и отправляем нашу страницу с шаблоном профиля пользователя, где уже выводим всю его подноготную
$modx->sendForward($usersSection);
break;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment