Проверка уникальности никнейма для 1.10.x

1621
Проверка уникальности никнейма при регистрации и редактировании профиля.
предыстория: /forum/thread14031-1.html



Качать тут

Редактировались дефолтные файлы 1.10.1
Решил сделать "по феншую", поэтому добавил несколько строк в языковые файлы.
Не бойтесь менять core/ajax/registration.php - это не суперсистемный файл, а просто проверка логина при реге. Сейчас в него добавлена проверка никнейма.
В данном варианте никнейм может состоять из рус/анг букв, цифр, пробелов и символов _-
Если хотите добавить свои правила, нужно изменить Регулярное выражение, по которому осуществляется проверка аж в ЧЕТЫРЁХ файлах:
check.js
registration.php
/registration/frontend.php
/users/frontend.php
Это не я придумал - это так и было!

Спасибо за внимание.
Создание статей с отложенной публикацией
Комментарии (38)
EVV 27 марта 2013 в 00:29 +3
по ссылке загружается файл создание статей с отложенной публикацией 1-10.rar
Олег Васильевич я 27 марта 2013 в 01:25 0
на этот момент пост имеет 10+ (оценили - 10). В очерередной раз убеждаюсь: стадом мы (люди) были, стадом и останемся =)))
Олег Васильевич я 27 марта 2013 в 01:27 0
упс, пока писал стало 13 (нашего полку прибыло laugh )
letsgo 27 марта 2013 в 01:43 -1
Причем тут стадо и оценки вообще? Странная логика.
Роман 27 марта 2013 в 04:17 +1
Весна. Обострение :))
Ленивый 27 марта 2013 в 06:47 0
))) Прошу прощения - не в тот файл ткнул, когда ссылку делал.
Всё поправил.
Май 27 марта 2013 в 07:15 +1
Ленивый, огромное спасибо, очень ждал этого хака. Потестил, все работает как надо. Очень сильно порадовали, для моего сайта это решение проблемы, уже накопилось множество дублей никнеймов, пользователи были не довольны этим. Теперь с этим будет порядок.
Роман 27 марта 2013 в 08:58 +3
Осталось внести только в релиз
Май 27 марта 2013 в 17:07 0
Нашел серьезный баг. При попытке отредактировать профиль, оставляя никнейм без изменений, например изменить телефон или какую либо другую информацию - срабатывает блокировка, система проверяет никнейм находит его в базе и не дает сохранить изменения.

Ленивый, нид хелп!
Ленивый 27 марта 2013 в 18:51 +2
Ух ты!! Прикольный косяк!!
Пришлось в com_users_edit_profile.tpl добавить скрытое поле со старым ником и делать проверку, только в случае, если ник был отредактирован.

Архив поправил, перезалил.
lokanaft 27 марта 2013 в 19:03 +1
Он был настолько ленивым...
Май 27 марта 2013 в 20:20 +1
Спасибо. Теперь все работает правильно.
ded-pikto 27 марта 2013 в 22:58 0
Плюс, конечно! Но ведь нет предела совершенству)))
Задавал уже вопрос в теме http://instantcms.ru/forum/thread14031-2.html.
ded-pikto:
2. Запрещённые админом ники. Сообщения addSessionMessage имеются. Не хватает быстрых js сообщений под окном ввода никнейма. Ведь при данном хаке есть вероятность, что ДОпользователь сначала получит сообщение "Вы можете использовать этот никнейм", а после заполнения формы и нажатия на кнопку "Регистрация" система сообщит ему, что "Выбранный никнейм запрещен администратором!" Пока нашёл выход в том, чтобы или выводить сообщение "Вы можете использовать этот никнейм, если он не запрещён администратором", или не выводить никакого. Пробовал разными способами (см. "Мартышка и очки") вызвать проверку BadNickname из таблицы cms_components, дабы с if-else вывести сообщение о запрете ника. Но или руки))), или вложенность, или всё вместе мешают. Подскажите, как это можно сделать?
Можно ли в качестве костыля приспособить для быстрых запросов по запрещённым никам файл \www\components\registration\model.php\www\components\registration\model.php ?
ded-pikto 27 марта 2013 в 23:09 0
Извиняюсь, файл \www\components\registration\model.php
Ленивый 28 марта 2013 в 08:34 +1
Мысль понял. Добавлю. В субботу.
Ленивый 28 марта 2013 в 08:36 0
..и ещё, кажется Вы же задавали вопрос по поводу логинзы? Что она, зараза, может делать дубли никнеймов??
ded-pikto 28 марта 2013 в 14:44 0
Да, я - это был он.
Но логинза - такая скользкая штучка. Многие с ней намучились. Для её приживления без дублей и сопутствующих косяков в систему поди с десяток файлов лопатить понадобится?.. Вот зашёл в первый раз по логинзе в Вебмани и теперь я - ПочтовыйЯщик Батькович Фамильев))) Претензии администрацией не принимаются - сам дурак. Знаю, что дурак. "Но опыт есть!")))
EVV 27 марта 2013 в 23:31 +1
Ленивый, хорошо было бы, если расписать, что в каких файлах заменено (добавлено). А то у меня (да думаю не только у меня) эти файлы модифицировались, поэтому заливать так невозможно.
ded-pikto 27 марта 2013 в 23:54 0
EVV, неленивый товарищ по движку мог бы сравнить мигратором или файловым менеджером хак и дефолтные файлы...
Тимофей 29 марта 2013 в 07:25 0
Тоже озадачился этим вопросом, но тут все просто. Нашел в нете бесплатную программу которая сравнивает два файла.
""
WinMerge.
PolarOne 2 октября 2013 в 00:54 0
расписал crazy
EVV 28 марта 2013 в 23:28 0
При изменении данных в профиле они не сохраняются! У меня у одного так?
Тимофей 29 марта 2013 в 07:28 0
Присоеденяюсь. Тоже самое. Пишет Никнейм ,,,,,, уже занят! И ничего не сохраняет.
Тимофей 29 марта 2013 в 09:01 0
Сам спросил, сам разобрался и сам ответил)) Для тех кто скачал старый архив как я, достаточно скачать новый и заменить файлы /components/users/frontend.php и /templates/ваш_шаблон/components/com_users_edit_profile.tpl и все должно заработать.
Май 29 марта 2013 в 09:09 +1
Да. Надо было почитать коменты выше
EVV 29 марта 2013 в 13:55 0
Скачал, заменил, но профиль все равно не сохраняется, причем проблем с никнеймом не было
Май 29 марта 2013 в 14:21 0
Подробнее опишите проблему, что значит не сохраняется? О каких проблемах с никнеймом вы говорите? Первоначально баг был в том, что производилась блокировка если в поле был тот же ник что и раньше, сейчас это пофиксили, и все работает правильно, изменения в профиле сохраняются. У меня работает корректно.
EVV 29 марта 2013 в 20:08 0
Не сохраняется, когда изменяешь какие-нибудь параметры в настройках профиля
EVV 30 марта 2013 в 14:52 0
Нашел у себя проблему. Конфликтовало с хаком "Обрезка аватара во время загрузки".
Удалил, теперь все работает.
ValeraK 20 апреля 2014 в 14:45 0
А можно лир исправить так что б конфликта с этим хаком Обрезка аватара не было? Нужно и обрезка аватара и проверка уникальности никнейма.
PolarOne 2 октября 2013 в 00:52 0
Мне к сожалению не годилось - скачать и перезалить. Перелопачивать в ручную.
(У меня уже стояла проверка на уникальность логина, то ли базовая, то ли добавленная, не помню и измененная капча)
Сделал копии файлов на всякий случай) Но все. тьху тьху работает после правок.

1.\components\registration\frontend.php
около 150 строки заменил все // Проверяем nickname или имя и фамилию
Код PHP:
  1.  
  2. // Проверяем nickname или имя и фамилию
  3. if($model->config['name_mode']=='nickname'){
  4. if(!$item['nickname']) { cmsCore::addSessionMessage($_LANG['TYPE_NICKNAME'], 'error'); $errors = true; }
  5. } else {
  6. if(!$item['realname1']) { cmsCore::addSessionMessage($_LANG['TYPE_NAME'], 'error'); $errors = true; }
  7. if(!$item['realname2']) { cmsCore::addSessionMessage($_LANG['TYPE_SONAME'], 'error'); $errors = true; }
  8. $item['nickname'] = trim($item['realname1']) . ' ' . trim($item['realname2']);
  9. }
  10. if(mb_strlen($item['nickname'])<2 || mb_strlen($item['nickname'])>25 || !preg_match("/^([a-zA-Zа-яА-Я0-9_ -])+$/ui", $item['nickname'])) {
  11. cmsCore::addSessionMessage($_LANG['ERR_NICKNAME'], 'error'); $errors = true;
  12. }
  13. if($model->getBadNickname($item['nickname'])){ cmsCore::addSessionMessage($_LANG['ERR_NICK_EXISTS'], 'error'); $errors = true;}
  14. if($inDB->get_field('cms_users', "nickname='".$item['nickname']."'", 'id') > 0){
  15. cmsCore::addSessionMessage($_LANG['NICKNAME'].' "'.$item['nickname'].'" '.$_LANG['IS_BUSY'], 'error'); $errors = true;
  16. }
  17.  
2.\components\registration\js\check.js
Заменил полностью

3.\components\users\frontend.php
около 215 строки заменил все // Если сохраняем профиль
Код PHP:
  1.  
  2. // Если сохраняем профиль
  3. if ($opt == 'save'){
  4.  
  5. $errors = false;
  6.  
  7.  
  8. $users['nickname'] = cmsCore::request('nickname', 'str');
  9. if($users['nickname'] != cmsCore::request('nickname_old', 'str')){
  10. if(mb_strlen($users['nickname'])<2 || mb_strlen($users['nickname'])>25 || !preg_match("/^([a-zA-Zа-яА-Я0-9_ -])+$/ui", $users['nickname'])) {
  11. cmsCore::addSessionMessage($_LANG['ERR_NICKNAME'], 'error'); $errors = true;
  12. }
  13. cmsCore::loadModel('registration');
  14. $modreg = new cms_model_registration();
  15. if (!$inUser->is_admin){if($modreg->getBadNickname($users['nickname'])) { cmsCore::addSessionMessage($_LANG['ERR_NICK_EXISTS'], 'error'); $errors = true; }}
  16. if($inDB->get_field('cms_users', "nickname='".$users['nickname']."'", 'id') > 0){
  17. cmsCore::addSessionMessage($_LANG['NICKNAME'].' "'.$users['nickname'].'" '.$_LANG['IS_BUSY'], 'error'); $errors = true;
  18. }
  19. }
  20. $profiles['gender'] = cmsCore::request('gender', 'str');
  21. $profiles['city'] = cmsCore::request('city', 'str');
  22. if (mb_strlen($profiles['city'])>25) { cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error'); $errors = true; }
  23.  
  24. $users['email'] = cmsCore::request('email', 'email');
  25. if (!$users['email']) { cmsCore::addSessionMessage($_LANG['REALY_ADRESS_EMAIL'], 'error'); $errors = true; }
  26. if($usr['email'] != $users['email']){
  27. $is_set_email = $inDB->get_field('cms_users', "email='{$users['email']}'", 'id');
  28. if ($is_set_email) { cmsCore::addSessionMessage($_LANG['ADRESS_EMAIL_IS_BUSY'], 'error'); $errors = true; }
  29. }
  30.  
  31. $profiles['showmail'] = cmsCore::request('showmail', 'int');
  32. $profiles['email_newmsg'] = cmsCore::request('email_newmsg', 'int');
  33. $profiles['showbirth'] = cmsCore::request('showbirth', 'int');
  34. $profiles['description'] = cmsCore::request('description', 'str', '');
  35. $users['birthdate'] = (int)$_REQUEST['birthdate']['year'].'-'.(int)$_REQUEST['birthdate']['month'].'-'.(int)$_REQUEST['birthdate']['day'];
  36. $profiles['signature'] = $inDB->escape_string(cmsCore::request('signature', 'html', ''));
  37. $profiles['signature_html'] = $inDB->escape_string(cmsCore::parseSmiles(cmsCore::request('signature', 'html', ''), true));
  38. $profiles['allow_who'] = cmsCore::request('allow_who', 'str');
  39. if (!preg_match('/^([a-zA-Z]+)$/ui', $profiles['allow_who'])) { $errors = true; }
  40. $users['icq'] = preg_replace('/([^0-9])/ui', '', cmsCore::request('icq', 'str'));
  41. $profiles['showicq'] = cmsCore::request('showicq', 'int');
  42. $profiles['cm_subscribe'] = cmsCore::request('cm_subscribe', 'str');
  43. if (!preg_match('/^([a-zA-Z]+)$/ui', $profiles['cm_subscribe'])) { $errors = true; }
  44.  
  45.  
4.\core\ajax\registration.php
Заменил полностью

5.\languages\ru\components\users.php
Добавилась строчка (около 28)
Код PHP:
  1.  
  2. $_LANG['ERR_NICKNAME'] ='Никнейм должен состоять только из русских или латинских букв и цифр, не короче 2 и не более 25 символов!';
  3.  
6.\languages\ru\components\registration.php
Около 36 строчки добавилось следующее
Код PHP:
  1.  
  2. $_LANG['ERR_NICKNAME'] ='Никнейм должен состоять только из русских или латинских букв и цифр, не короче 2 и не более 25 символов!';
  3. $_LANG['BIG_NICKNAME'] ='Никнейм не может быть длинее 25 символов!';
  4.  
и около 53
Код PHP:
  1.  
  2. $_LANG['YOU_NICKNAME_COMPLETE'] ='Вы можете использовать этот никнейм';
  3.  
7.\templates\_default_\components\com_users_edit_profile.tpl
Не уверен что так уж оно нужно было
заменил свою строчку (около 38)
Код PHP:
  1. <input name="nickname" type="text" class="text-input" id="nickname" style="width:300px" value="{$usr.nickname|escape:'html'}"/>
на
Код PHP:
  1.  
  2. <input name="nickname" type="text" class="text-input" id="nickname" style="width:300px" value="{$usr.nickname|escape:'html'}"/>
  3. <input name="nickname_old" type="hidden" class="text-input" id="nickname_old" style="width:300px" value="{$usr.nickname}"/>
  4.  
8.\languages\ru\components\com_registration.tpl
заменил 48 строчку у себя
эту
Код PHP:
  1.  
  2. <input name="nickname" id="nickinput" class="text-input" type="text" style="width:300px" value="{$item.nickname|escape:'html'}" />
  3. <span class="regstar">*</span>
  4.  
на эту
Код PHP:
  1.  
  2. <input name="nickname" id="nickinput" class="text-input" type="text" style="width:300px" value="{$item.nickname|escape:'html'}" onchange="checkNickname()" autocomplete="off"/>
  3. <span class="regstar">*</span>
  4. <div id="nicknamecheck"></div>
  5.  
Если заметили ошибку - поправте меня авторы, ну в если кому пригодилось - не поленитесь, плюс в карму.
У меня проверка работает.
instantcms 1.10.1
propit 21 декабря 2013 в 23:24 0
Все отлично работает на 1.10.3

Единственное пришлось подправить файл
2.\components\registration\js\check.js Заменил полностью

Готовое содержимое файла в спойлере:
Спойлер

и еще одно маленькое замечание. Путь к Файлу com_registration.tpl, описанному в пункте № 8
8.\languages\ru\components\com_registration.tpl
на самом деле находится тут:
8.\templates\_default_\components\com_registration.tpl

Огромное спасибо за труд!
mullo 15 апреля 2014 в 00:51 0
2.\components\registration\js\check.js Заменил полностью
У меня ироглифы показывает из этого файла при проверке
mullo 15 апреля 2014 в 00:52 0
и не чего не появляеться при проверке ника
Ivan84 7 января 2014 в 18:24 0
Огромное спасибо за труд
Ivan84 7 июня 2014 в 00:16 0
У меня после обновления с 1.10.1 до 10.3 и наката хака не работает проверка на уникальность. при переходе на страницу регистрации вылетает белая - пустая страница и тоже самое с профилем пользователя. У кого нибудь есть соображение.
mashen&ka 27 декабря 2014 в 19:01 0
Спасибо PolarOne и propit. Всё получилось, только вот не большая проблемка, теперь в профиле ничего не меняется. Я захожу в профиль меняю город, нажимаю "сохранить" он пишет "такой логин уже есть" и не сохраняет даже изменение города... или даты рождения... ну или еще чего-нибудь в профиле.
mashen&ka 20 января 2015 в 22:47 0
Тут кто-нибудь есть?