Как заменить username на id

Есть такой плагин, который отвечает за переадресацию на страницу пользователя

Одним словом, страница с пользователями на сайте реализована так же как на modx.pro

Сейчас есть страница типа /user
И с нее мы можем перейти на страницу самого пользователя user/username

Нужна помощь, как реализовать вместо username — id пользователя
Чтобы вместо вида /user/username был вид ссылок /user/id

<?php
if ($modx->event->name != 'OnPageNotFound') return;

$users_page_id = $modx->getOption('users_page_id', $scriptProperties, '');
$redirect_to_username = $modx->getOption('redirect_to_username', $scriptProperties, 1);
$strict_urls = $modx->getOption('strict_urls', $scriptProperties, 1);

if ($page = $modx->getObject('modResource',intval($users_page_id))) {
    $req = $modx->context->getOption('request_param_alias', null, 'q');
    $url = $_REQUEST[$req];
    $cont_type = $modx->getObject('modContentType',array('name' => 'HTML'));
    $cont_ext = $cont_type->get('file_extensions');
    $cont_isfolder = $page->get('isfolder');
    $page_url = $modx->makeUrl(intval($users_page_id));
    $cont_suf = $modx->getOption('container_suffix', null, '/');
    $url_explode = explode($page_url, $url, 2);

    $position = strpos($url, $page_url);
    if ($position !== false && $position == 0 && count($url_explode) == 2) {
        if (!empty($cont_ext) && $cont_ext != '/') {
            $tmp = explode($cont_ext,$url_explode[1]);
            $url_explode[1] = $tmp[0];
        }
        if (substr($url_explode[1],-1) == '/') $url_explode[1] = substr($url_explode[1],0,-1);
        if (substr($url_explode[1],0,1) == '/') $url_explode[1] = substr($url_explode[1],1);
        

        if ($redirect_to_username && is_numeric($url_explode[1]) && $user = $modx->getObject('modUser', intval($url_explode[1]))) {
            if ($cont_isfolder == 1 && $cont_suf == "/") {
                $page_url = substr($page_url,0,-1);
            }
            $modx->sendRedirect($page_url.'/'.$user->get('username').$cont_type->get('file_extensions'));
        }
        
        if ($strict_urls) {
            $redirect = false;
            if (!empty($cont_ext)) {
                if ($cont_ext == '/' && substr($url,-1) != '/') $redirect = $url.$cont_ext;
                elseif (strpos($url, $cont_ext) === false) $redirect = $url.$cont_ext;
            }
            elseif (substr($url,-1) == '/') $redirect = substr($url,0,-1);
            if ($redirect) $modx->sendRedirect($redirect);
        }
        
        
        if ($user = $modx->getObject('modUser', array('username' => $url_explode[1]))) {
            $modx->setPlaceholders($user->Profile->toArray());
            $modx->setPlaceholders($user->toArray());
            $modx->sendForward($users_page_id);
        }
    }
}
return;
Андрей
30 марта 2020, 21:18
modx.pro
592
0

Комментарии: 6

Андрей
30 марта 2020, 21:20
0
В добавок напишу, что в плагине есть еще параметр отдельный

redirect_to_username
Да/Нет
Да
    Андрей
    30 марта 2020, 22:18
    0
    Неужели никто не сможет помочь?
      Павел Голубев
      30 марта 2020, 22:33
      0
      Так весь ответ в этой строчке
      $page = $modx->getObject('modResource',intval($users_page_id)
      У тебя страницы пользователя на которые происходит редирект — это обычные Modx ресурсы.
      Возьми и проставь в поле псевдоним в id ресурса и будет то, что просишь.

      Другое дело если пользователей пару тысяч.
      iWatchYouFromAfar
      30 марта 2020, 22:39
      0
      Для этих целей я писал немного другой плагин. С использованием метода sendForward перенаправлял запрос на нужную страницу, куда подставлял username пользователя. Собственно что username, что id — разницы особо нет. Немного изменить плагин и ресурс на который переадресовывать. По такой схеме я выводил статьи и комментарии пользователя.

      В ваш плагин я не вникал, но внешне похоже на не очень хороший код. Если кратко, разбиваете ссылку на составляющие через /. И в зависимости от того, из чего состоит текущая ссылка, делает sendForward на нужную страницу. Можете сделать и по username и по id страницы пользователей.
        Андрей
        30 марта 2020, 22:41
        0
        Подскажите пожалуйста, остался ли у вас еще этот плагин? Не могли бы поделиться?
          iWatchYouFromAfar
          30 марта 2020, 22:44
          0
          Клиентский сайт работает на этом плагине, в открытом доступе его нету. Вы можете изучить немного этот вопрос и написать плагин самостоятельно, как сделал в свое время и я.

          Я вам прямо написал логику. Разбиваете url — смотрите текущий и (if else или switch) с помощью sendForward кидаете пользователя на нужный ресурс. Все остальное это пару-тройка проверок и установка плейсхолдеров, исходя из вашего плагина выше — вы сможете это все сделать.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6