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

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО

Как?

#16 13 марта 2013 в 21:11
ded-pikto, спасибо за участие! Но я это все проделывал, и получал такие же результаты, и когда говорил что инструкция не работает, я имел ввиду, что функция не работает так как положено было бы работать этой функции. Рекомендательный характер не интересует, нужна проверка уникальности с учетом регистра, с блокировкой регистрации или переименования при вводе не уникального никнейма, с выводом соответствующих сообщений, и чтобы это работало как в регистрации так и в редактировании профиля. Словом, нужна полноценная функция а не полумера.
#17 13 марта 2013 в 22:41
для начала:

в /components/registration/frontend.php
стр 178
  1. if($inDB->get_field('cms_users', "nickname='".$item['nickname']."'", 'id') > 0){
  2. cmsCore::addSessionMessage("такой никнейм существует", 'error'); $errors = true;
  3. }
Должен запретить одинаковые никнеймы при Регистрации.
Если Ок, тогда пойдём Редактирование профиля править
#18 16 марта 2013 в 18:54
Ленивый, ура, спасибо, есть блокировка регистрации. Премного благодарен!
Но прежде чем переходить к "Редактированию профиля", подскажите пожалуйста как сделать вывод сообщения о том что ник можно использовать или нельзя использовать под окошком ввода, так же как выводится сообщение под логином или паролем.

Иллюстрация
#19 17 марта 2013 в 10:51
Это делают функции checkLogin() и checkPasswords() соответственно, которые находятся в /components/registration/js/check.js
смотрите как они работают и делайте по аналогии. только обратите внимание, что для вывода результата под полем ввода логина или пароля, эти функции используют
<div id="logincheck"></div>
и
<div id="passcheck"></div>
которые прописаны в com_registration.tpl

вам, для никнейма, нужно будет создать свой "пустой" див, в который функция, в случае ошибки будет выводить сообщение
#20 17 марта 2013 в 17:04
В check.js добавил в конец
  1. function checkNickname() {
  2.  
  3. var nickname = $("#nickinput").attr('value');
  4. var reg= /^[a-zA--яА-Я0-9_\-\.\"\ \@\*\si]{2,15}$/ ;
  5. if (reg.test(nickname)) {
  6. $("#nicknamecheck").load("/core/ajax/registration.php", {opt: "checknickname", data:nickname});
  7. }
  8. else {
  9. if (nickname.length < 2){
  10. $("#nicknamecheck").html('<span style="color:red">Минимальная длина = 2</span>');
  11. } else {
  12. if (userlogin.length > 15){
  13. $("#nicknamecheck").html('<span style="color:red">Максимальная длина = 15</span>');
  14. } else {
  15. $("#nicknamecheck").html('<span style="color:red">Только латинские буквы, русские буквы и цифры</span>');
  16. }
  17. }
  18. }
  19.  
  20. }
В com_registration.tpl добавил после

  1. <input name="nickname" id="nickinput" class="text-input" type="text" style="width:300px" value="{$item.nickname|escape:'html'}" />
  2. <span class="regstar">*</span>
строку
  1. <div id="nicknamecheck"></div>
Но пока не работает так как нужно еще добавить в frontend.php вывод сообщения, это где то здесь

  1. // проверяем есть ли такой пользователь
  2. $user_exist = $inDB->get_fields('cms_users', "(login LIKE '{$item['login']}' OR email LIKE '{$item['email']}') AND is_deleted = 0", 'id, login, email');
  3. if($user_exist){
  4. if($user_exist['login'] == $item['login']){
  5. cmsCore::addSessionMessage($_LANG['LOGIN'].' "'.$item['login'].'" '.$_LANG['IS_BUSY'], 'error'); $errors = true;
  6. } else {
  7. cmsCore::addSessionMessage($_LANG['EMAIL_IS_BUSY'], 'error'); $errors = true;
  8. }
  9. }
Что и куда добавить?
#22 17 марта 2013 в 19:46
Ленивый, спасибо, теперь осталось узнать что нужно вписать в /core/ajax/registration.php
Видите ли, я только пользователь icms, я не php-разработчик, поэтому не могу догадаться что там нужно дописать даже по аналогии.
#23 18 марта 2013 в 06:19
ПЕРЕД
return;

ВСТАВИТЬ:

  1. if ($opt=='checknickname'){
  2.  
  3. $sql = "SELECT id, login FROM cms_users WHERE (nickname LIKE '$data') AND (is_deleted = 0) LIMIT 1";
  4. $result = $inDB->query($sql);
  5.  
  6. if($inDB->num_rows($result)==0){
  7. echo '<span style="color:green">Вы можете использовать этот никнейм</span>';
  8. } else {
  9. echo '<span style="color:red">Выбранный никнейм занят!</span>';
  10. }
  11.  
  12. }
#24 18 марта 2013 в 06:48

ПЕРЕД
return;
ВСТАВИТЬ:

Ленивый
в /core/ajax/registration.php в версии 1.10+ нет выражения return;
В последней строке — cmsCore::halt();
Вставлял и до и после этой строки ваш код, но ничего не изменилось, сообщение не выводится.
#25 18 марта 2013 в 07:17
это без разницы.
вставлять нужно ДО

но так как ДО всё равно не работает, то видимо придётся вам все файлы, которые правили, в архив и мне.
сильно много где сделаны изменения, поэтому оч сложно отследить ошибку.
#28 18 марта 2013 в 10:17
ок, сегодня гляну. Вечером напишу
#29 18 марта 2013 в 12:32
В продолжение темы. Остаётся несколько неДОрешенных вопросов.
1. Логинза. Решения нет пока и на уровне addSessionMessage. Кто-то правит дубли логинов и ников вручную, кто-то отключает логинзу.
2. Запрещённые админом ники. Сообщения addSessionMessage имеются. Не хватает быстрых js сообщений под окном ввода никнейма.
Ведь при данном хаке есть вероятность, что ДОпользователь сначала получит сообщение "Вы можете использовать этот никнейм", а после заполнения формы и нажатия на кнопку "Регистрация" система сообщит ему, что "Выбранный никнейм запрещен администратором!" Пока нашёл выход в том, чтобы или выводить сообщение "Вы можете использовать этот никнейм, если он не запрещён администратором", или не выводить никакого.
Пробовал разными способами (см. "Мартышка и очки") вызвать проверку BadNickname из таблицы cms_components, дабы с if-else вывести сообщение о запрете ника. Но или руки))), или вложенность, или всё вместе мешают.
Подскажите, как это можно сделать?
#30 18 марта 2013 в 15:39

1. Логинза. Решения нет пока и на уровне addSessionMessage. Кто-то правит дубли логинов и ников вручную, кто-то отключает логинзу.

ded-pikto

а вот эта самая актуальнейшая тема на данный момент.


Хоть бы в 2.0 эту траблу решили
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.