Проверка никнейма на уникальность (instantcms 1.9)

+46
1.71K
Спасибо за работу FreeLancer. С его разрешения публикую решение проверки никнейма на уникальность, которое точно нужно в ряде проектов.

Изменению подверглись 2 файла:

1. Проверка при регистрации components/registration/frontend.php

После кода

  1.  
  2. // Проверяем nickname или имя и фамилию
  3. if($cfg['name_mode']=='nickname'){
  4. $nickname = $inCore->request('nickname', 'str', '');
  5.  
добавляем

  1.  
  2.  
  3. // UNIQUE NICKNAME
  4. $nick_ok = 0;
  5. if (preg_match ('/^[a-zA-Z0-9\]\[\._ @-]+$/is', $nickname))
  6. {
  7. $nick_ok = 1;
  8. }
  9. if (preg_match ('/^[а-яА-Я0-9\]\[\._ @-]+$/is', $nickname))
  10. {
  11. $nick_ok = 1;
  12. }
  13. if(!$nick_ok) { $msg .= 'В нике нельзя использовать одновременно Русские и Латинские символы!
  14. '; }
  15.  
  16. $is_nickname = $inDB->get_field('cms_users', "nickname = '$nickname'", 'nickname');
  17. if($is_nickname) { $msg .= 'Выбранный никнейм занят
  18. '; }
  19. // /UNIQUE NICKNAME
  20.  
  21.  
2. Проверка при изменении профиля components/users/frontend.php

В блоке EDIT PROFILE после кода

  1.  
  2. if ($opt == 'save'){
  3.  
  4. $errors = false;
  5.  
  6. $nickname = $inCore->request('nickname', 'str');
  7.  
добавить

  1.  
  2. // UNIQUE NICKNAME
  3. $nick_ok = 0;
  4. if (preg_match ('/^[a-zA-Z0-9\]\[\._ @-]+$/is', $nickname))
  5. {
  6. $nick_ok = 1;
  7. }
  8. if (preg_match ('/^[а-яА-Я0-9\]\[\._ @-]+$/is', $nickname))
  9. {
  10. $nick_ok = 1;
  11. }
  12. if(!$nick_ok) { cmsCore::addSessionMessage(" В нике нельзя использовать одновременно Русские и Латинские символы!", 'error'); $errors = true; }
  13.  
  14. $is_nickname = $inDB->get_field('cms_users', "nickname = '$nickname'", 'id');
  15. if($is_nickname && $id!=$is_nickname) { cmsCore::addSessionMessage(" Выбранный никнейм занят", 'error'); $errors = true; }
  16. // /UNIQUE NICKNAME
  17.  
Вот и все.
Или можете скачать архив и заменить файлы.
+3
Серега Серега 12 лет назад #
Спасибо, пока все отлично работает! +
0
Роман Роман 12 лет назад #
Спасибо, нужное дополнение
0
Trang Trang 12 лет назад #
спасибо за труд, всё отлично работает
0
Def Def 12 лет назад #
он сразу на аяксе шманает базу и выдает предупреждения о занятости?
0
Zau4man Zau4man 12 лет назад #
нет. после перезагрузки страницы.
0
Def Def 12 лет назад #
лучше конечно сразу чтобы проверял, а то вводишь каптчу, пароли, а он бах и выдает что занято. приходится заново. не очень)
0
Vovan Vovan 12 лет назад #
Да если с перезагрузкой это не есть гуд, было бы хорошо если проверка была бы сразу
0
spacer spacer 12 лет назад #
Присоединяюсь, в текущем виде, это архаизм.
Но, спасибо автору за начало движения в нужную сторону.
0
Zau4man Zau4man 12 лет назад #
Ситуация совпадения случается редко.
Так что не критично.
0
spacer spacer 12 лет назад #
Подскажите пожалуйста, а основная форма логина, вверху страницы доступна на аяксе без перезагрузки? Было такое решение уже? Не могу найти в блогах.
+1
FreeLancer FreeLancer 12 лет назад #
На выходных сделаю на аяксе и выложу в блоге! всем спс)
0
Zau4man Zau4man 12 лет назад #
Ждем :)
0
spacer spacer 12 лет назад #
И форму логина сразу бомбите на аяксе, нечего пользователя по таким мелочам по страницам гонять! :)
0
Таня Таня 12 лет назад #
Вещь хорошая и очень нужная, вот только доработать бы ее, по подобию логина. Если пишем в поле логин, внизу тут же сообщение появляется свободен или занят логин. О том что никнейм, как оказалось, занят мы узнаем лишь когда заполняем все поля регистрации, представьте сколько времени может занять такая регистрация. Лично я, как пользователь не люблю долгие регистрации и частенько ухожу с таких страниц. Возможно ли сделать чтоб сразу же сообщение появлялось о том занят или свободен никнейм?
0
FreeLancer FreeLancer 12 лет назад #
а вы комментарии выше пробовали читать?
0
Таня Таня 12 лет назад #
Нет, но считайте что я присоединилась к тем кто уже высказался, если вас так раздражает мой коммент.
0
prosis prosis 12 лет назад #
вроде есть эта проверка в 1.9, и на аяксе работает, см. код: core/ajax/registration.php или я что то путаю.
0
Санечек Санечек 12 лет назад #
да в 1.9 есть проверка такая, у меня вопрос возник: когда новый пользователь вводит имя типа name_1 пишет, что имя свободно, после нажатия кнопки регистрация движок пишет, что можно использовать только английские символы, т.е. получается "_" этот символ движок не проверяет при проверке?
+1
Антон Антон 11 лет назад #
Вот вариант на Ajax:

1. com_registration.tpl в папке темы
код
Код PHP:
<input name="nickname" id="nickinput" class="text-input" type="text" size="30" value="{$nickname|escape:'html'}"/>
<span class="regstar">*</span>
заменить на
Код PHP:
<input name="nickname" id="nickinput" class="text-input" type="text" size="30" value="{$nickname|escape:'html'}" onchange="checkNickname()"/>
<span class="regstar">*</span>
<div id="nicknamecheck"></div>

2. создаем /core/ajax/registrationnickname.php
содержимое:
Код PHP:
<?php
    if($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') { die(); }

	define("VALID_CMS", 1);
    define('PATH', $_SERVER['DOCUMENT_ROOT']);

	include(PATH.'/core/cms.php');

    $inCore = cmsCore::getInstance();

    define('HOST', 'http://' . $inCore->getHost());

    $inCore->loadClass('config');       //конфигурация
    $inCore->loadClass('db');           //база данных

    $opt = $inCore->request('opt', 'str', '');
    $data = $inCore->request('data', 'str', '');

    if (!$opt) { return; }

    $inDB = cmsDatabase::getInstance();

	if ($opt=='checknickname'){

		$sql    = "SELECT id, login FROM cms_users WHERE (nickname LIKE '$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>';				
		}

	}

    return;

?>
3. /components/registration/js/check.js
добавляем код:
Код PHP:
function checkNickname(){
	var nickname = $("#nickinput").attr('value');
	var reg1= /^[a-zA-Z0-9\]\[\._ @-]+$/;
	var reg2= /^[а-яА-Я0-9\]\[\._ @-]+$/;
	
	if (nickname.length < 2){
			$("#nicknamecheck").html('<span style="color:red">Минимальная длина = 2</span>'); 
	}
	else if (nickname.length > 15){
				$("#nicknamecheck").html('<span style="color:red">Максимальная длина = 15</span>'); 
	}	
	else if (reg1.test(nickname) || reg2.test(nickname)){
		$("#nicknamecheck").load("/core/ajax/registrationnickname.php", {opt: "checknickname", data:nickname});
	}
	else{
		$("#nicknamecheck").html('<span style="color:red">В нике нельзя использовать одновременно Русские и Латинские символы!</span>');  		
    }

}
+1
Антон Антон 11 лет назад #
Забыл написать:
1. Правки касаются момента регистрации, но не редактирования в профиле.
2. При использовании указанного мною кода правки, указанные Евгением в данном посте, теряют актуальность.
3. Написал код здесь, потому что на данную реализацию натолкнул сам пост Евгения.
0
Zau4man Zau4man 11 лет назад #
Если используете данный хак, нужно изменить регулярное выражение... Юзеры с буквой Ё пролетают, так как она не входит в регулярку а-я
Регулярка должна быть [а-яА-ЯЁё0-9\] а не [а-яА-Я0-9\]
0
lezginka.ru lezginka.ru 11 лет назад #
после заливки файлов /registration/ выдает 404
0
lezginka.ru lezginka.ru 11 лет назад #
точнее 403
0
lezginka.ru lezginka.ru 11 лет назад #
все нормально. это я ошибся при заливке
0
Def Def 11 лет назад #
так если заюзать на аяксе, то при редактирвоании может люой поставить? или там проверка тоже идет?
0
Май Май 11 лет назад #
На 1.10 работает?

Еще от автора

Готовый сайт лендинг компании по подбору персонала
Делал два года назад. Заказчик сменил профиль и сайт не пригодился.
Выведем контент группы в списке полей группы
Поле позволяет в списке полей группы вывести последний контент этой группы.
Чиним реферальные ссылки биллинга при закрытом сайте
Проблема такая: если сайт закрыт, то при переходе по реферальной ссылке типа /r/1 пользователя перехватывает компонент Авторизация, и хук биллинга, ко
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.