Транслитерация имени пользователя и знак +

Доброго вечера, возможно кто-то уже решал подобную проблему, буду благодарен за любые подсказки.

Есть плагин показывающий виртуальную страницу пользователя userPagePlugin:
<?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);
if ($tmp[0] == 'users' && count($tmp) >= 2) {
	$section = 1262;
	$name = str_replace('.html', '', $tmp[1]);
	if ($user= $modx->getObject('modUser', array('username' => $name))) {
		$user_id = $user->get('id');
		$username = $user->get('username');
		$modx->setPlaceholder('username', $username);
		$modx->setPlaceholder('user_id', $user_id);
		$modx->setPlaceholders($user->Profile->toArray());
		$modx->sendForward($section);
	}
}
Работает отлично, спасибо modx.pro именно здесь найдено решение. Но теперь нужно русские имена транслитерировать, а ещё важнее понять что делать если в имени пользователя есть знак +, так как в этом случае плагин уже не отрабатывает.

пробовал вырезать знак плюс разными способами, пробовал urldecode и htmlentities. Запретить ввод символа + не желательно и уже есть такие пользователи, которые используют имя для логина с плюсом.
vrm13
16 января 2019, 19:20
modx.pro
651
0
Поблагодарить автора Отправить деньги

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

vectorserver
18 января 2019, 11:20
+1
$modx->setPlaceholder('username', str_replace("+","&#43;",$username));
или
$modx->setPlaceholder('username', str_replace("+","&plus;",$username));
    vrm13
    18 января 2019, 11:51
    0
    Спасибо за идею, попробовал.
    Только это же плейсхолдер, до него дело не доходит, знак плюс мешает где-то выше в запросе страницы.

    пока сделал по другому:
    <?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);
    if ($tmp[0] == 'users' && count($tmp) >= 2) {
    	$section = 1262;
    	$iduser = str_replace('.html', '', $tmp[1]);
        $user = $modx->getObject('modUser', array('id' => $iduser));
    	$username = $user->get('username');
    		$modx->setPlaceholder('username', $username);
    		$modx->setPlaceholder('user_id', $iduser);
    		$modx->setPlaceholders($user->Profile->toArray());
    		$modx->sendForward($section);
    }
    теперь у меня в алиас уходит id юзера и все ссылки на юзеров через id. В целом получилось удобно для моих целей, но если найдётся способ с транслитерацией, будет здорово.
      vectorserver
      18 января 2019, 11:59
      0
      Вот сейчас вызов у тебя правильный (сверка по ID)
      $user = $modx->getObject('modUser', array('id' => $iduser));
        vrm13
        18 января 2019, 12:08
        0
        Да. Только я не могу в адресную строку потом имя передать. Если сверка по id то в строке браузера будет .../users/777. Как сделать чтобы было .../users/Гена после плагина со сверкой по id не могу придумать.

        Дело в том, что первый плагин отрабатывает ссылку вида .../users/{$username}, а второй .../users/{$user_id}
iWatchYouFromAfar
18 января 2019, 12:07
0
Тоже личные страницы есть. Проблему решаю просто, ссылка на профиль пользователя = username, который приводится в нижнем регистре и в котором запрещены все символы кроме букв и цифр. Этот момент отсекаю еще при регистрации, а сам username просто не вывожу для редактирования.
    vrm13
    18 января 2019, 12:10
    0
    Согласен, так проще, но мне нужно решить вопрос по-другому. Уже есть много пользователей с разными именами, не хочу заставлять их менять.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    7