[Хак] Уникальность никнейма (для версии 1.9)

1626
предистория
на сайте появилось два пользователя с абсолютно одинаковыми никнеймами. один из них стал оставлять комментарии, а второго засыпали вопросами по поводу этих комментариев. пошла путаница, пока не выяснилось, что это 2 разных пользователя с одинаковыми никнеймами на сайте. да и вообще не удобно, будет к примеру какое нибудь обсуждение, и мне скажут - "а вон обратись к васе, он шарит." а к какому именно васе ??? если их у меня будет 20 на сайте, поэтому поднял вопрос об уникальности никнейма на форуме, где меня тыкнули носов в тему для версии 1.5-1.6. принцип не изменился, но во первых там немного поменялись файлы, во вторых там есть некоторый недочёт, при котором я не могу сменить что либо в профиле если не поменяю хотяб один символ в своём никнейме и плюс если я админ - я не могу изменить профиль, не поменяв при этом никнейма пользователя.
и так приступаем
проверка происходит
* при регистрации
* при редактировании профиля
то есть если никнейм занят - выводится сообщение что он занят

первое - открываем /components/registration/js/check.js Вставляем в самом конце
Код PHP:
// Проверка никнейма на корректность (русские и латинские буквы, длина) и уникальность.
function checkNickname() {

	var nickname = $("#nickinput").attr('value');
	var reg= /^[a-zA-Zа-яА-Я0-9_\-\.\"\ \@\*\si]{2,15}$/ ;
	if (reg.test(nickname)) {
		$("#nicknamecheck").load("/core/ajax/registration.php", {opt: "checknickname", data:nickname});
	}
	else {
		if (nickname.length < 2){
			$("#nicknamecheck").html('<span style="color:red">Минимальная длина = 2</span>'); 
		} else {
			if (userlogin.length > 15){
				$("#nicknamecheck").html('<span style="color:red">Максимальная длина = 15</span>'); 
			} else {
				$("#nicknamecheck").html('<span style="color:red">Только латинские буквы и цифры</span>');
			}
		}
	}

}
второе - в файле /templates/ваш_шаблон/components/com_registration.tpl
(в 1.9 именно такие строки)
Код PHP:
                        <td valign="top" class="">
                            <input name="nickname" id="nickinput" class="text-input" type="text" size="30" value="{$nickname|escape:'html'}" />
                            <span class="regstar">*</span>
                        </td>
меняем на
Код PHP:
                         <td valign="top" class="">
                            <input name="nickname" id="nickinput" class="text-input" type="text" size="30" value="{$nickname|escape:'html'}" onchange="checkNickname()" autocomplete="off" />
                            <span class="regstar">*</span>
	          <div id="nicknamecheck"></div>
                        </td>
третий шаг - в файле /core/ajax/registration.php перед
Код PHP:
return;
добавить следующий код
Код PHP:
	// Проверка никнейма на уникальность (русский текст с кодировкой в БД 1251)
	if ($opt=='checknickname') {

		$sql    = "SELECT id, nickname FROM cms_users WHERE (nickname LIKE '".iconv('UTF-8', 'Windows-1251', $data)."') AND (is_deleted = 0) LIMIT 1";
		$result = $inDB->query($sql);

		if($inDB->num_rows($result)==0){
			echo '<span style="color:green">Вы можете использовать этот никнейм</span>';
		} else {
			echo '<span style="color:red">Выбранный никнейм занят!</span>';
		}

	}
с регистрацией разобрались
переходим к редактированию в профиле
в файле /components/users/frontend.php в разделе // EDIT PROFILE //
находим строку
Код PHP:
		$nickname = $inCore->request('nickname', 'str');
		if (strlen($nickname)<2) { cmsCore::addSessionMessage($_LANG['SHORT_NICKNAME'], 'error'); $errors = true; }
и вставляем после неё
Код PHP:
					// Здесь вставим проверку на уникальность никнейма 
					$sqlnik = "SELECT id, nickname FROM cms_users WHERE (nickname LIKE '$nickname') AND (is_deleted = 0) and (id != '$inUser->id') LIMIT 1";
					$resultnik = $inDB->query($sqlnik);
					if (!$inUser->is_admin) {if($inDB->num_rows($resultnik)!=0) { cmsCore::addSessionMessage($_LANG['ZANYAT_NICKNAME'], 'error'); $errors = true; } }
					// Блок проверки уникальности никнейма закончен

затем в файле /languages/ru/components/users.php после
Код PHP:
$_LANG['PROFILE_SAVED']             ='Профиль успешно сохранен.';
добавляем строку
Код PHP:
$_LANG['ZANYAT_NICKNAME']             ='Введённый никнейм занят.';
на этом всё.
при редактировании в профиле профиксено, что если вы не изменили свой ник и он остался прежним, а изменили какие либо данные профиля, данные сохраняются, если вы админ, то у вас не происходит проверка на уникальность ника, и вы можете написать любой ник незапретный на сайте - были траблы при редактировании чужого профиля админом, ничего не нашёл, как только отключить проверку на уникальность админам
модуль Дата, текущее время (идущее) и кто Вы на сайте | [Хак] вывод именинников в модуле Статистика пользователей
Комментарии (33)
krz 29 ноября 2011 в 16:45 +1
поскольку у меня стоит запрет на редактирование никнейма, то проделал только регистрацию. Для версии 1.7 работает как надо, только вместо {$nickname|escape:'html'} делаете {$nickname}, может кому понадобится, спасибо
Sergey Platonov 29 ноября 2011 в 17:10 0
в 1.8 скорей всего тоже самое будет с {$nickname} - {$nickname|escape:'html'} это уже в шабах 1.9
а где именно стоит запрет - это есть в функциях 1.7 ??? или установлен хак
krz 29 ноября 2011 в 17:21 +1
Lexa219 29 ноября 2011 в 21:17 0
Спасибо большое за данный хак , ставлю плюс..
Zau4man 29 ноября 2011 в 21:23 0
Спасибо большое.
На моих двух проектах очень пригодится!
Роман 30 ноября 2011 в 05:09 0
Отличное дополнение. Такое можно и в релиз включить, точно не навредит сайту
Sergey Platonov 30 ноября 2011 в 13:05 0
этот вопрос поднимался давно, и на сколько я понял, в одном из релизов оно присутствовало, но администрация решила его убрать и убрала из следующей версии релиза. (если я правильно понял что тут писалось на сайте) и как видите нет и в текущей версии
santi 1 декабря 2011 в 10:40 0
поддерживаю
balooo 30 ноября 2011 в 15:41 0
актуальна подобная проверка для почты, ибо бывает народ тупит, и начинает заново регится или просто ошибается в написании почты.. лучше сразу заметить ошибку...
Sergey Platonov 30 ноября 2011 в 15:44 0
вас интересует проверка при регистрации есть ли такая почта в базе ???
balooo 30 ноября 2011 в 16:10 0
да, именно я про проверку почты при регистрации. удобно тот же метод использовать для неё.
Sergey Platonov 30 ноября 2011 в 20:18 0
завтра напишу как это сделать, если не опередят, а то сейчас у меня уже глубокая ночь - четвёртый час утра (сахалин как ни как)
WALTERZ 30 ноября 2011 в 20:53 0
Решение было в блогах, поищите
Zau4man 4 декабря 2011 в 17:03 0
Не отрабатывает проверку, если ник содержит -,например на сайте у меня есть vasi-lissa
Легко регаю другой логин, но с таким же ником...
Zau4man 4 декабря 2011 в 18:07 0
Нужна помощь гуру php
добавить в регулярное выражение var reg= /^[a-zA-Zа-яА-Я0-9_]{2,15}$/ ; пробел, знак собачки, тире...
Sergey Platonov 5 декабря 2011 в 03:21 0
гугл и сайт для проверки выражений http://www.regexpr.ru/?pattern=%2F%5E%5Ba-zA-Z%E0-%FF%C0-%DF0-9_%5C-%5C.%5C%22%5C+%5C%40%5C*%5Csi%5D%7B2%2C15%7D%24%2F&subject=%F2%E5%EA%F1%F2+++%F2%E5%EA%F1%F2 сказал следующее

нужно заменить на
Код PHP:
/^[a-zA-Zа-яА-Я0-9_\-\.\"\ \@\*\si]{2,15}$/
и вроде всё, хотя не факт
moHAX 7 декабря 2011 в 18:15 0
А как дела если никнейм строится из имени и фамилии? В админке можно задавать такой метод рега.
Katerina 7 декабря 2011 в 18:28 0
У меня тоже Имена и Фамилии вместо ников. Считаю не стоит писать Марии Ивановой при регистрации, что ее имя занято, и предлагать выбрать другое smile У меня сейчас 36 Ивановых, и прекрасно уживаются друг с другом.

Так что в релиз включать не стоит, а вот за Хак, в любом случае, спасибо большое.
moHAX 8 декабря 2011 в 16:47 0
Извиняюсь - туплю. Не подумал даже про однофамильцев =))
Sergey Platonov 8 декабря 2011 в 17:58 0
про двух пупкиных которые однофамильцы реально - но чтоб было два васи пупкина - это конечно возможно но крайне редко
Sergey Platonov 8 декабря 2011 в 17:56 0
если из имени и фамилии - то проверки нет - проверка идёт только никнейма
NickSolver 9 декабря 2011 в 14:53 0
Работает не в полне корректно.. Не работает функция onchange, т.е первый раз что ввел то и проверит. перепроверки небудет. Второе я заменил регулярные выражения на свое.. В итоге оплучил что проверка не работает(точнее работать то она работает ибо прописывается в другом файле) но пишет что ник можно использовать... Подскажите как поправить7

var reg= /^[[email protected]^().-]{2,15}$|^[а-я[email protected]^().-]{2,15}$/ ;
Санечек 24 июня 2012 в 21:15 0
не пойму, не работает совсем у меня(( что такое? версия 1,9
Sergey Platonov 24 июня 2012 в 23:55 +1
только что проверил на чистой 1.9 - всё работает у меня
Санечек 25 июня 2012 в 12:26 0
от шаблона не зависит?
Sergey Platonov 25 июня 2012 в 12:31 +1
только вот
Код PHP:
/templates/ваш_шаблон/components/com_registration.tpl
именно ваш текущий шаблон и это для регистрации, а в профиле там если попытаешься поменять, нажимаешь сохранить, после перезагрузки страницы вылезет ошибка что не получилось изменить данные из-за того, что такой ник уже есть в базе (ну или как то так там будет написано)
Санечек 25 июня 2012 в 12:37 0
ну что же такое, такой полезный хак и не работает, я уже и кэш почистил =(
Sergey Platonov 25 июня 2012 в 12:39 +1
при регистрации или при смене в профиле ?
Санечек 25 июня 2012 в 12:42 0
при регистрации, я только пока для нее делаю.
Sergey Platonov 25 июня 2012 в 12:43 +1
напишите адрес сайта - я посмотрю - может скажу что не так (в личку)
ps - если щас быстрым взглядом не смогу сказать что - более подробно смогу посмотреть часа через 3-4.
Санечек 25 июня 2012 в 12:48 0
Все разобрался.
Май 12 марта 2013 в 09:17 +1
Сергей, помогите пожалуйста оптимизировать этот хак для версии 1.10, отсутствие проверки уникальности ника уже создает некоторые проблемы в моем сообществе на icms 1.10
Eesti 26 августа 2014 в 21:31 0
Так же присоединяюсь.