Регистрация по Логину Veppa

PHP
В стандартной регистрации Veppa нет реализации регистрации пользователя по Логину. Это конечно же не критично, но все же хотелось бы ввести свой пользовательский логин при регистрации.
Напомню, стандартная регистрации пользователя проходит по его email адресу, скрипт берет электронную почту и в поле username вводит все то что находится перед @.
На протяжении больше года я все крутил и тестировал двиг и с удивление обнаружил дубли логинов о_0
Проблема в том что email может быть и разный, но вот логин одинаковый, пример
[email protected]
[email protected]

Тем самым получили двух пользователей с одинаковым логином. Конечно если вы не собираетесь усовершенствовать скрипт и оставите все по стандарту, вам этот пост попросту не нужен, но если вы захотите что то сделать, например страничку пользователя и вам нужно будет вывести какую то информацию из базы данных именно по логину, вы столкнетесь с проблемой, выборка будет идти только по последней записи, т.е. по второму нику, а первый просто перезапишется в PHP, не пугайтесь слова перезапишется, с базой будет все в порядке и ни один пользователь не пострадает =) Разве что один из них увидит информацию другого пользователя.

Давайте приступим к самому Хаку, который и поможет нам избавится от лишних проблем и добавить поле с логином при регистрации.

Для начала давайте выведем само поле при регистрации, для этого откроем файл /sys/app/views/login/register.php
Перед
<tr>
    <td align="right" valign="top"><b><?php echo __('Email') ?> : </b></td>


Вставим
<tr>
    <td align="right" valign="top"><b><?php echo __('Логин') ?> : </b></td>
    <td valign="top">

    <input name="username" type="text" id="username" size="30" maxlength="100"  value="<?php echo View::escape($user->username)?>"  />
    <?php echo $this->validation()->username_error; ?>
      
      </td>
  </tr>


Теперь необходимо принять данные в файле отвечающем за регистрации, а именно
/sys/app/controllers/LoginController.php
Найдем функцию регистрации
private function _register()


перед
$rules['email'] = 'trim|required|xss_clean|valid_email|callback__validate_user_email';


Вставляем
$rules['username'] = 'trim|required|xss_clean|valid_username|callback__validate_user_username' ;


Перед
$fields['email'] = __('Email');


Вставляем
$fields['username'] = __('Логин');


Перед
'email',


Вставляем
'username',


Обратите внимания на
$rules['username'] = 'trim|required|xss_clean|valid_username|callback__validate_user_username' ;


тут мы проверяем логин на соответствие, убираем лишние пробелы из строки, проверяем правильность ввода логина о которой я вам напишу чуть ниже, а так же в случае ошибки мы выведем, почему пользователь не может быть зарегистрированным выбранным им логином.

Теперь чтобы все проверки работали, нам нужно написать функции которые и будет все проверять, а так же присвоить ошибку, для этого открываем файл /sys/helpers/Validation.php
Ищем строку
'isset'                 => __('The %s field must have a value.'),


после вставляем
'valid_username'    => __('Поле %s должен содержать логин только на латинице или цифровой.'),


Давайте напишем функцию валидации логина
Перед
function valid_email($str)


Вставляем
function valid_username($str)
    {
        return ( ! preg_match("/^[a-z0-9]+([_-][a-z0-9]+)?$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------


Думаете это все? Нет, не угадали, нам нужно еще подключиться к базе данный и проверить существует ли пользователя с логином который мы вводим, для этого открываем файл /sys/app/models/User.php
Перед
function _validate_user_email($str,$val=0)


Вставляем
function _validate_user_username($str,$val=0)
    {
        // check if this email address is not used before 
        // if it is not email address of current user
        $user = self::findByIdFrom('User',$str,'username',MAIN_DB);
        if($user)
        {
            
            // check if not current users username
            if($val==0 || $user->id != $val)
            {
                // this username is not unique
                $validation = Validation::getInstance();

                    $validation->set_message('_validate_user_username', __('%s занят другим пользователем.',
                        array('{url}'=>get_url('login/resendActivation/'.$user->id.'/'.md5($str).'/'))));                    
                
                return false;
            }
        }
        
        
        return true;
    }


Вот и все!

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.