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

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

Еще от автора

Шаблон вывода категорий
Делюсь небольшим компонентом, который выводит на списком записей список категорий со своим шаблоном.
Виджет "Меню добавить"
Небольшой виджет, предназначенный исключительно для вывода меню добавления контента.
ZПоиск. Другой взгляд на поиск
В рамках более глубокого знакомства с Vue в частности с появившимся недавно Composition Api сделал на Vue небольшой компонент, который по функционалу
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.