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

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

первое — открываем /components/registration/js/check.js Вставляем в самом конце
  1. // Проверка никнейма на корректность (русские и латинские буквы, длина) и уникальность.
  2. function checkNickname() {
  3.  
  4. var nickname = $("#nickinput").attr('value');
  5. var reg= /^[a-zA--яА-Я0-9_\-\.\"\ \@\*\si]{2,15}$/ ;
  6. if (reg.test(nickname)) {
  7. $("#nicknamecheck").load("/core/ajax/registration.php", {opt: "checknickname", data:nickname});
  8. }
  9. else {
  10. if (nickname.length < 2){
  11. $("#nicknamecheck").html('<span style="color:red">Минимальная длина = 2</span>');
  12. } else {
  13. if (userlogin.length > 15){
  14. $("#nicknamecheck").html('<span style="color:red">Максимальная длина = 15</span>');
  15. } else {
  16. $("#nicknamecheck").html('<span style="color:red">Только латинские буквы и цифры</span>');
  17. }
  18. }
  19. }
  20.  
  21. }
  22.  
второе — в файле /templates/ваш_шаблон/components/com_registration.tpl
(в 1.9 именно такие строки)
  1. <td valign="top" class="">
  2. <input name="nickname" id="nickinput" class="text-input" type="text" size="30" value="{$nickname|escape:'html'}" />
  3. <span class="regstar">*</span>
  4. </td>
  5.  
меняем на
  1.  
  2. <td valign="top" class="">
  3. <input name="nickname" id="nickinput" class="text-input" type="text" size="30" value="{$nickname|escape:'html'}" onchange="checkNickname()" autocomplete="off" />
  4. <span class="regstar">*</span>
  5. <div id="nicknamecheck"></div>
  6. </td>
  7.  
третий шаг — в файле /core/ajax/registration.php перед
  1. return;
добавить следующий код
  1.  
  2. // Проверка никнейма на уникальность (русский текст с кодировкой в БД 1251)
  3. if ($opt=='checknickname') {
  4.  
  5. $sql = "SELECT id, nickname FROM cms_users WHERE (nickname LIKE '".iconv('UTF-8', 'Windows-1251', $data)."') AND (is_deleted = 0) LIMIT 1";
  6. $result = $inDB->query($sql);
  7.  
  8. if($inDB->num_rows($result)==0){
  9. echo '<span style="color:green">Вы можете использовать этот никнейм</span>';
  10. } else {
  11. echo '<span style="color:red">Выбранный никнейм занят!</span>';
  12. }
  13.  
  14. }
  15.  
с регистрацией разобрались
переходим к редактированию в профиле
в файле /components/users/frontend.php в разделе // EDIT PROFILE //
находим строку
  1.  
  2. $nickname = $inCore->request('nickname', 'str');
  3. if (strlen($nickname)<2) { cmsCore::addSessionMessage($_LANG['SHORT_NICKNAME'], 'error'); $errors = true; }
  4.  
и вставляем после неё
  1.  
  2. // Здесь вставим проверку на уникальность никнейма
  3. $sqlnik = "SELECT id, nickname FROM cms_users WHERE (nickname LIKE '$nickname') AND (is_deleted = 0) and (id != '$inUser->id') LIMIT 1";
  4. $resultnik = $inDB->query($sqlnik);
  5. if (!$inUser->is_admin) {if($inDB->num_rows($resultnik)!=0) { cmsCore::addSessionMessage($_LANG['ZANYAT_NICKNAME'], 'error'); $errors = true; } }
  6. // Блок проверки уникальности никнейма закончен
  7.  
  8.  
затем в файле /languages/ru/components/users.php после
  1. $_LANG['PROFILE_SAVED'] ='Профиль успешно сохранен.';
  2.  
добавляем строку
  1. $_LANG['ZANYAT_NICKNAME'] ='Введённый никнейм занят.';
  2.  
на этом всё.
при редактировании в профиле профиксено, что если вы не изменили свой ник и он остался прежним, а изменили какие либо данные профиля, данные сохраняются, если вы админ, то у вас не происходит проверка на уникальность ника, и вы можете написать любой ник незапретный на сайте — были траблы при редактировании чужого профиля админом, ничего не нашёл, как только отключить проверку на уникальность админам
+1
bondar bondar 12 лет назад #
поскольку у меня стоит запрет на редактирование никнейма, то проделал только регистрацию. Для версии 1.7 работает как надо, только вместо {$nickname|escape:'html'} делаете {$nickname}, может кому понадобится, спасибо
0
Sergey Platonov Sergey Platonov 12 лет назад #
в 1.8 скорей всего тоже самое будет с {$nickname} - {$nickname|escape:'html'} это уже в шабах 1.9
а где именно стоит запрет - это есть в функциях 1.7 ??? или установлен хак
+1
0
Lexa219 Lexa219 12 лет назад #
Спасибо большое за данный хак , ставлю плюс..
0
Zau4man Zau4man 12 лет назад #
Спасибо большое.
На моих двух проектах очень пригодится!
0
Роман Роман 12 лет назад #
Отличное дополнение. Такое можно и в релиз включить, точно не навредит сайту
0
Sergey Platonov Sergey Platonov 12 лет назад #
этот вопрос поднимался давно, и на сколько я понял, в одном из релизов оно присутствовало, но администрация решила его убрать и убрала из следующей версии релиза. (если я правильно понял что тут писалось на сайте) и как видите нет и в текущей версии
0
santi santi 12 лет назад #
поддерживаю
0
balooo balooo 12 лет назад #
актуальна подобная проверка для почты, ибо бывает народ тупит, и начинает заново регится или просто ошибается в написании почты.. лучше сразу заметить ошибку...
0
Sergey Platonov Sergey Platonov 12 лет назад #
вас интересует проверка при регистрации есть ли такая почта в базе ???
0
balooo balooo 12 лет назад #
да, именно я про проверку почты при регистрации. удобно тот же метод использовать для неё.
0
Sergey Platonov Sergey Platonov 12 лет назад #
завтра напишу как это сделать, если не опередят, а то сейчас у меня уже глубокая ночь - четвёртый час утра (сахалин как ни как)
0
WALTERZ WALTERZ 12 лет назад #
Решение было в блогах, поищите
0
Zau4man Zau4man 12 лет назад #
Не отрабатывает проверку, если ник содержит -,например на сайте у меня есть vasi-lissa
Легко регаю другой логин, но с таким же ником...
0
Zau4man Zau4man 12 лет назад #
Нужна помощь гуру php
добавить в регулярное выражение var reg= /^[a-zA-Zа-яА-Я0-9_]{2,15}$/ ; пробел, знак собачки, тире...
0
Sergey Platonov Sergey Platonov 12 лет назад #
гугл и сайт для проверки выражений 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}$/
и вроде всё, хотя не факт
0
moHAX moHAX 12 лет назад #
А как дела если никнейм строится из имени и фамилии? В админке можно задавать такой метод рега.
0
Katerina Katerina 12 лет назад #
У меня тоже Имена и Фамилии вместо ников. Считаю не стоит писать Марии Ивановой при регистрации, что ее имя занято, и предлагать выбрать другое smile У меня сейчас 36 Ивановых, и прекрасно уживаются друг с другом.

Так что в релиз включать не стоит, а вот за Хак, в любом случае, спасибо большое.
0
moHAX moHAX 12 лет назад #
Извиняюсь - туплю. Не подумал даже про однофамильцев =))
0
Sergey Platonov Sergey Platonov 12 лет назад #
про двух пупкиных которые однофамильцы реально - но чтоб было два васи пупкина - это конечно возможно но крайне редко
0
Sergey Platonov Sergey Platonov 12 лет назад #
если из имени и фамилии - то проверки нет - проверка идёт только никнейма
0
NickSolver NickSolver 12 лет назад #
Работает не в полне корректно.. Не работает функция onchange, т.е первый раз что ввел то и проверит. перепроверки небудет. Второе я заменил регулярные выражения на свое.. В итоге оплучил что проверка не работает(точнее работать то она работает ибо прописывается в другом файле) но пишет что ник можно использовать... Подскажите как поправить7

var reg= /^[a-z0-9_~!@^().-]{2,15}$|^[а-я0-9_~!@^().-]{2,15}$/ ;
0
Санечек Санечек 12 лет назад #
не пойму, не работает совсем у меня(( что такое? версия 1,9
+1
Sergey Platonov Sergey Platonov 12 лет назад #
только что проверил на чистой 1.9 - всё работает у меня
0
Санечек Санечек 12 лет назад #
от шаблона не зависит?
+1
Sergey Platonov Sergey Platonov 12 лет назад #
только вот
Код PHP:
/templates/ваш_шаблон/components/com_registration.tpl
именно ваш текущий шаблон и это для регистрации, а в профиле там если попытаешься поменять, нажимаешь сохранить, после перезагрузки страницы вылезет ошибка что не получилось изменить данные из-за того, что такой ник уже есть в базе (ну или как то так там будет написано)
0
Санечек Санечек 12 лет назад #
ну что же такое, такой полезный хак и не работает, я уже и кэш почистил =(
+1
Sergey Platonov Sergey Platonov 12 лет назад #
при регистрации или при смене в профиле ?
0
Санечек Санечек 12 лет назад #
при регистрации, я только пока для нее делаю.
+1
Sergey Platonov Sergey Platonov 12 лет назад #
напишите адрес сайта - я посмотрю - может скажу что не так (в личку)
ps - если щас быстрым взглядом не смогу сказать что - более подробно смогу посмотреть часа через 3-4.
0
Санечек Санечек 12 лет назад #
Все разобрался.
+1
Май Май 11 лет назад #
Сергей, помогите пожалуйста оптимизировать этот хак для версии 1.10, отсутствие проверки уникальности ника уже создает некоторые проблемы в моем сообществе на icms 1.10
0
Eesti Eesti 10 лет назад #
Так же присоединяюсь.

Еще от автора

Модуль для бесплатной версии компонента "Попутчики" автора Олег
и так представляю вашему вниманию модуль для бесплатной версии компонента "Попутчики" написанной Олегом.
список всех Event-ов системы
решил отдохнуть минут пять от подготовки к госам - полез сюда на сайт, прочитал такую строку в комментах в одном из последних блогов пришла идея разыс
[Хак] Выйти/войти и остаться на той же странице
где то видел на форуме тему про редирект при логине \ разлогине - как остаться на той же самой странице, если у вас стоит форма входа на всех страница
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.