Страница пользователя как на modx.pro
1
1 000
Реализация страницы пользователя как на mоdx.pro (https://modx.pro/users/bezumkin/). Не используются дополнения virtualPage и userProfile\userProfile2 из-за их глючности и конфликтов с другими дополнениями. Все протестировано на рабочем проекте.
1. Создаем ресурс с алиасом user
2. Для примера добавим на созданный ресурс этот контент:
3. Создаем плагин и вешаем его на событие joxi.ru/12MYMYPI41BEQ2
Если что-то пошло не так и по этому адресу не отображается страница пользователя, смотрите какие у вас есть еще плагины. У меня был плагин для подставления в конец url слеша.
Вот этот блок
Всем удачи. Мне этот функционал долго был недоступен. Спасибо Илье Уткину modx.pro/users/ilyautkin/ за помощь.
Предложить вариант реализации страниц пользователей как на modx.pro. Без использования virtualPage и userProfile. Первый рабочий вариант (рабочий вариант, это когда я скопировал ваш код или пакет и у меня на проекте заработали страницы пользователей) получит 1000 рублей. Варианты предлагать в комментариях.
Отличие моего проекта от modx.pro (если это на что-то влияет) — страницы пользователей на поддомене (уже настроен). Примерно так — subdomain.site.ru/user_name
1. Создаем ресурс с алиасом user
2. Для примера добавим на созданный ресурс этот контент:
<h3>[[!+fullname]]</h3>
<big>Информация</big>
<table class="table">
<tbody>
<tr>
<td>Веб-сайт</td>
<td><a href="[[!+website]]" target="_blank">[[!+website]]</a></td>
</tr>
<tr>
<td>Город</td>
<td>[[!+city]]</td>
</tr>
</tbody>
</table>Плейсхолдеры названы так же, как поля у пользователя (fullname? email, city и т.д.). Вызывать некешируемыми, т.е. с восклицательным знаком [[!+fullname]] 3. Создаем плагин и вешаем его на событие joxi.ru/12MYMYPI41BEQ2
<?php
if ($modx->event->name != 'OnPageNotFound') {return false;}
$alias = $modx->context->getOption('request_param_alias', 'q');
if (!isset($_REQUEST[$alias])) {return false;}
$request = $_REQUEST[$alias];
$tmp = explode('/', $request);
// Ссылка подходит под заданный формат: user/username
if ($tmp[0] == 'user' && count($tmp) >= 2) {
// Определяем id раздела /user/.
// Конечно, можно его и руками прописать - но так гибче
if (!$section = $modx->findResource($tmp[0] . '/')) {
// Если вдруг раздел куда-то делся - выходим.
return false;
}
// Теперь очищаем имя пользователя от возможного расширения
$name = str_replace('.html', '', $tmp[1]);
// Если очищенное имя не равно запрошенному - то можно отредиректить юзера
// Также возможен вариант с косой на конце имени бренда - его тоже учитываем
// SEOшники должны оценить =)
if ($tmp[1] != $name || (isset($tmp[2]) && $tmp[2] == '')) {
$modx->sendRedirect($tmp[0] . '/' . $name);
}
// Люди с неправильной ссылкой ушли на правильную и дошли до этого момента со второго раза
// Дальше проверяем наличие запрошенного пользователя
if ($user= $modx->getObject('modUser', array('username' => $name))) {
// Круто, такой пользователь есть, получаем его id
$id = $user->get('id');
$modx->setPlaceholder('id', $id);
$modx->setPlaceholders($user->Profile->toArray());
// А теперь подсовывем юзеру страницу юзеров, а дальше сниппет на ней сам разберётся
$modx->sendForward($section);
}
}
// Иначе ничего не делаем и юзер получает 404 или его перехватывает другой плагин.4. Теперь страницы доступны по адресу site.ru/user/usernameЕсли что-то пошло не так и по этому адресу не отображается страница пользователя, смотрите какие у вас есть еще плагины. У меня был плагин для подставления в конец url слеша.
<?php
if ($modx->event->name == 'OnLoadWebDocument') {
$uri = $_SERVER['REQUEST_URI'];
if ($modx->resource->isfolder && substr($uri, -1) != '/' && !$_GET['page']) {
$modx->sendRedirect($modx->makeUrl($modx->resource->id),array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
}Поэтому пришлось изменить плагин:Вот этот блок
if ($tmp[1] != $name || (isset($tmp[2]) && $tmp[2] == '')) {
$modx->sendRedirect($tmp[0] . '/' . $name);
}Поменял на этотif ($tmp[1] != $name || (!isset($tmp[2]) || $tmp[2] != '')) {
$modx->sendRedirect($tmp[0] . '/' . $name . '/');
}И все заработало. Всем удачи. Мне этот функционал долго был недоступен. Спасибо Илье Уткину modx.pro/users/ilyautkin/ за помощь.
Отличие моего проекта от modx.pro (если это на что-то влияет) — страницы пользователей на поддомене (уже настроен). Примерно так — subdomain.site.ru/user_name
Комментарии: 56
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Создаём плагин на событие OnPageNotFound
А так — если не подходит, значит, ждем других кандидатов. =))
Наверняка, еще кто-нибудь поправит или другое решение предложит
И плейсхолдеры должны быть некешируемыми
Демо: s4432.h2.modhost.pro/ (Логин: s4432, Пароль: zNQI8Rd6rG8B)
Как заменить /user/ на /имя_пользователя/?
Вот тут на главной пост
Кликаешь на линк юзера — /user/louve Первый раз
Опять кликаешь становится так — /user/user/louve
: (
т.к. в плагине прописано
т.е. выставлен как контейнер, а на cgsleek это .html
Плагин добавляет слеш в конце url. Можешь за дополнительный бонус сделать условие, при котором они будут работать вместе?
Надо поменять на этот
Если это займет много времени — готов оплатить. Спасибо!
Целесообразно ли вешать информацию о пользователя на default значение?
Поэтому указывать $section внутри default особо нет смысла.
заменить на
P.S. Если ошибаюсь, то самому проще кое-что станет сделать. Сейчас вожусь над тем, чтобы для пользователей при регистрации автоматом создавался собственный почтовый ящик вида login@site.name. В дальнейшем как раз думал перейти к твоему вопросу.
почему-то не нравится ему return false;
Проблема: созданная страничка пользователя не может получить плейсхолдеры расширенных полей, типа [[!+extended.abcde]]. Содержание обычных полей отображает корректно. Другой чанк, работающий со сниппетами getPage и Peoples, отобраежает расширенные поля нормально — когда строит список всех пользователей таблицей. Я нуб, да, но гугл ведет в тупик. В какую сторону копать?