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

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



Качать тут

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

Спасибо за внимание.
0
Реклама Реклама #
+3
EVV EVV 8 лет назад #
по ссылке загружается файл создание статей с отложенной публикацией 1-10.rar
0
Олег Васильевич я Олег Васильевич я 8 лет назад #
на этот момент пост имеет 10+ (оценили - 10). В очерередной раз убеждаюсь: стадом мы (люди) были, стадом и останемся =)))
0
Олег Васильевич я Олег Васильевич я 8 лет назад #
упс, пока писал стало 13 (нашего полку прибыло laugh )
-1
letsgo letsgo 8 лет назад #
Причем тут стадо и оценки вообще? Странная логика.
+1
Роман Роман 8 лет назад #
Весна. Обострение :))
0
Сергей Петрович Сергей Петрович 8 лет назад #
))) Прошу прощения - не в тот файл ткнул, когда ссылку делал.
Всё поправил.
+1
Май Май 8 лет назад #
Ленивый, огромное спасибо, очень ждал этого хака. Потестил, все работает как надо. Очень сильно порадовали, для моего сайта это решение проблемы, уже накопилось множество дублей никнеймов, пользователи были не довольны этим. Теперь с этим будет порядок.
+3
Роман Роман 8 лет назад #
Осталось внести только в релиз
0
Май Май 8 лет назад #
Нашел серьезный баг. При попытке отредактировать профиль, оставляя никнейм без изменений, например изменить телефон или какую либо другую информацию - срабатывает блокировка, система проверяет никнейм находит его в базе и не дает сохранить изменения.

Ленивый, нид хелп!
+2
Сергей Петрович Сергей Петрович 8 лет назад #
Ух ты!! Прикольный косяк!!
Пришлось в com_users_edit_profile.tpl добавить скрытое поле со старым ником и делать проверку, только в случае, если ник был отредактирован.

Архив поправил, перезалил.
+1
lokanaft lokanaft 8 лет назад #
Он был настолько ленивым...
+1
Май Май 8 лет назад #
Спасибо. Теперь все работает правильно.
0
ded-pikto ded-pikto 8 лет назад #
Плюс, конечно! Но ведь нет предела совершенству)))
Задавал уже вопрос в теме 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 ?
0
ded-pikto ded-pikto 8 лет назад #
Извиняюсь, файл \www\components\registration\model.php
+1
Сергей Петрович Сергей Петрович 8 лет назад #
Мысль понял. Добавлю. В субботу.
0
Сергей Петрович Сергей Петрович 8 лет назад #
..и ещё, кажется Вы же задавали вопрос по поводу логинзы? Что она, зараза, может делать дубли никнеймов??
0
ded-pikto ded-pikto 8 лет назад #
Да, я - это был он.
Но логинза - такая скользкая штучка. Многие с ней намучились. Для её приживления без дублей и сопутствующих косяков в систему поди с десяток файлов лопатить понадобится?.. Вот зашёл в первый раз по логинзе в Вебмани и теперь я - ПочтовыйЯщик Батькович Фамильев))) Претензии администрацией не принимаются - сам дурак. Знаю, что дурак. "Но опыт есть!")))
+1
EVV EVV 8 лет назад #
Ленивый, хорошо было бы, если расписать, что в каких файлах заменено (добавлено). А то у меня (да думаю не только у меня) эти файлы модифицировались, поэтому заливать так невозможно.
0
ded-pikto ded-pikto 8 лет назад #
EVV, неленивый товарищ по движку мог бы сравнить мигратором или файловым менеджером хак и дефолтные файлы...
0
Тимофей Тимофей 8 лет назад #
Тоже озадачился этим вопросом, но тут все просто. Нашел в нете бесплатную программу которая сравнивает два файла.
""
WinMerge.
0
PolarOne PolarOne 8 лет назад #
расписал crazy
0
EVV EVV 8 лет назад #
При изменении данных в профиле они не сохраняются! У меня у одного так?
0
Тимофей Тимофей 8 лет назад #
Присоеденяюсь. Тоже самое. Пишет Никнейм ,,,,,, уже занят! И ничего не сохраняет.
0
Тимофей Тимофей 8 лет назад #
Сам спросил, сам разобрался и сам ответил)) Для тех кто скачал старый архив как я, достаточно скачать новый и заменить файлы /components/users/frontend.php и /templates/ваш_шаблон/components/com_users_edit_profile.tpl и все должно заработать.
+1
Май Май 8 лет назад #
Да. Надо было почитать коменты выше
0
EVV EVV 8 лет назад #
Скачал, заменил, но профиль все равно не сохраняется, причем проблем с никнеймом не было
0
Май Май 8 лет назад #
Подробнее опишите проблему, что значит не сохраняется? О каких проблемах с никнеймом вы говорите? Первоначально баг был в том, что производилась блокировка если в поле был тот же ник что и раньше, сейчас это пофиксили, и все работает правильно, изменения в профиле сохраняются. У меня работает корректно.
0
EVV EVV 8 лет назад #
Не сохраняется, когда изменяешь какие-нибудь параметры в настройках профиля
0
EVV EVV 8 лет назад #
Нашел у себя проблему. Конфликтовало с хаком "Обрезка аватара во время загрузки".
Удалил, теперь все работает.
0
ValeraK ValeraK 7 лет назад #
А можно лир исправить так что б конфликта с этим хаком Обрезка аватара не было? Нужно и обрезка аватара и проверка уникальности никнейма.
0
PolarOne PolarOne 8 лет назад #
Мне к сожалению не годилось - скачать и перезалить. Перелопачивать в ручную.
(У меня уже стояла проверка на уникальность логина, то ли базовая, то ли добавленная, не помню и измененная капча)
Сделал копии файлов на всякий случай) Но все. тьху тьху работает после правок.

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

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

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

Огромное спасибо за труд!
0
mullo mullo 7 лет назад #
2.\components\registration\js\check.js Заменил полностью
У меня ироглифы показывает из этого файла при проверке
0
mullo mullo 7 лет назад #
и не чего не появляеться при проверке ника
0
Ivan84 Ivan84 7 лет назад #
Огромное спасибо за труд
0
Ivan84 Ivan84 7 лет назад #
У меня после обновления с 1.10.1 до 10.3 и наката хака не работает проверка на уникальность. при переходе на страницу регистрации вылетает белая - пустая страница и тоже самое с профилем пользователя. У кого нибудь есть соображение.
0
mashen&ka mashen&ka 6 лет назад #
Спасибо PolarOne и propit. Всё получилось, только вот не большая проблемка, теперь в профиле ничего не меняется. Я захожу в профиль меняю город, нажимаю "сохранить" он пишет "такой логин уже есть" и не сохраняет даже изменение города... или даты рождения... ну или еще чего-нибудь в профиле.
0
mashen&ka mashen&ka 6 лет назад #
Тут кто-нибудь есть?
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.