Изменение страницы регистрации
Вот тут я задавал вопрос по поводу изменения способа регистрации, но не дождавшись ответа решил попробовать сам.
Вкратце стояла такая задача: юзер попадает на страницу регистрации и вводит в поле свой имейл и капчу, в ответ скрипт генерирует ему логин и пароль и высылает на имейл, если юзер в течение 24 часов не зашел, то данные удаляются из таблицы юзеров, если зашел — то как бы подтвердил регистрацию.
Что реализовал:
1. Сделал отдельную страницу вместоtest1.ru/registration/ сделал test1.ru/join/
2. Сделал генератор логина, скрипт делает запрос в базу и считает скольео строк в таблице юзеров, берет эту цифру и добавляет ее к строке id, получается логин пользователя id454.
3. Сделал генератор паролей, пароль генерируется из латинских букв и цифр, длинна пароля 8 знаков.
Что не реализовал:
1. Убрать автологин после успешной регистрации и переадресацию на главную.
2. Удаление юзера, если он не зашел под полученным на почту логином.
3. Возможность в профиле указать имя или ник которое будет отображаться вместо логина.
В файле config/config.route.php
находим это:
ниже добавляем:
находим это:
ниже добавляем:
В папке classes/actions создаем файл ActionJoin.class.php
В файле templates/language/russian.php
находим это:
ниже вставляем:
В папке templates/skin/new/actions создаем папку ActionJoin и копируем в нее все файлы из папки ActionRegistration
Затем в файле templates/skin/new/actions/ActionJoin/index.tpl заменяем весь код на этот:
Жду ваших комментариев по тем пунктам которые реализовал и помощи — по которым не реализовал :)
Вкратце стояла такая задача: юзер попадает на страницу регистрации и вводит в поле свой имейл и капчу, в ответ скрипт генерирует ему логин и пароль и высылает на имейл, если юзер в течение 24 часов не зашел, то данные удаляются из таблицы юзеров, если зашел — то как бы подтвердил регистрацию.
Что реализовал:
1. Сделал отдельную страницу вместо
2. Сделал генератор логина, скрипт делает запрос в базу и считает скольео строк в таблице юзеров, берет эту цифру и добавляет ее к строке id, получается логин пользователя id454.
3. Сделал генератор паролей, пароль генерируется из латинских букв и цифр, длинна пароля 8 знаков.
Что не реализовал:
1. Убрать автологин после успешной регистрации и переадресацию на главную.
2. Удаление юзера, если он не зашел под полученным на почту логином.
3. Возможность в профиле указать имя или ник которое будет отображаться вместо логина.
В файле config/config.route.php
находим это:
define("ROUTE_PAGE_REGISTRATION",'registration');
ниже добавляем:
define("ROUTE_PAGE_JOIN",'join');
находим это:
ROUTE_PAGE_REGISTRATION => 'ActionRegistration',
ниже добавляем:
ROUTE_PAGE_JOIN => 'ActionJoin',
В папке classes/actions создаем файл ActionJoin.class.php
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Обрабатывает регистрацию
*
*/
class ActionJoin extends Action {
/**
* Инициализация
*
* @return unknown
*/
public function Init() {
/**
* Проверяем аторизован ли юзер
*/
if ($this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('registration_is_authorization'),$this->Lang_Get('attention'));
return Router::Action('error');
}
/**
* Если включены инвайты то перенаправляем на страницу регистрации по инвайтам
*/
if (!$this->User_IsAuthorization() and USER_USE_INVITE and !in_array(Router::GetActionEvent(),array('invite','activate','confirm')) and !$this->CheckInviteRegister()) {
return Router::Action('registration','invite');
}
$this->SetDefaultEvent('index');
$this->Viewer_AddHtmlTitle($this->Lang_Get('join'));
}
/**
* Регистрируем евенты
*
*/
protected function RegisterEvent() {
$this->AddEvent('index','EventIndex');
$this->AddEvent('confirm','EventConfirm');
$this->AddEvent('activate','EventActivate');
$this->AddEvent('invite','EventInvite');
}
/**********************************************************************************
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
**********************************************************************************
*/
/**
* Показывает страничку регистрации и обрабатывает её
*
* @return unknown
*/
protected function EventIndex() {
/**
* Если нажали кнопку "Зарегистрироваться"
*/
if (isset($_REQUEST['submit_register'])) {
$this->Security_ValidateSendForm();
//Проверяем входные данные
$bError=false;
/**
* Проверка мыла
*/
if (!func_check(getRequest('mail'),'mail')) {
$this->Message_AddError($this->Lang_Get('registration_mail_error'),$this->Lang_Get('error'));
$bError=true;
}
/**
* Проверка капчи(циферки с картинки)
*/
if (!isset($_SESSION['captcha_keystring']) or $_SESSION['captcha_keystring']!=strtolower(getRequest('captcha'))) {
$this->Message_AddError($this->Lang_Get('registration_captcha_error'),$this->Lang_Get('error'));
$bError=true;
}
/**
* А не занято ли мыло?
*/
if ($this->User_GetUserByMail(getRequest('mail'))) {
$this->Message_AddError($this->Lang_Get('registration_mail_error_used'),$this->Lang_Get('error'));
$bError=true;
}
/**
* Если всё то пробуем зарегить
*/
if (!$bError) {
/**
* Создаем юзера
*/
// генерируем логин
$query = "SELECT COUNT(*) FROM prefix_user";
$result = mysql_query($query);
$ar = mysql_fetch_row($result);
$one = $ar[0]+1;
$login = "id".$one;
// генерируем пароль
$arr = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','X','Y','Z','1','2','3','4','5','6','7','8','9','0');
$password = "";
for($i = 0; $i < 8; $i++) {
$index = rand(0, count($arr) - 1);
$password .= $arr[$index];
}
$oUser=new UserEntity_User();
$oUser->setLogin($login); // вставляем сгенерированый логин
$oUser->setMail(getRequest('mail'));
$oUser->setPassword(func_encrypt($password)); // вставляем сгенерированый пароль
$oUser->setDateRegister(date("Y-m-d H:i:s"));
$oUser->setIpRegister(func_getIp());
/**
* Если используется активация, то генерим код активации
*/
if (USER_USE_ACTIVATION) {
$oUser->setActivate(0);
$oUser->setActivateKey(md5(func_generator().time()));
} else {
$oUser->setActivate(1);
$oUser->setActivateKey(null);
}
/**
* Регистрируем
*/
if ($this->User_Add($oUser)) {
/**
* Убиваем каптчу
*/
unset($_SESSION['captcha_keystring']);
/**
* Создаем персональный блог
*/
$this->Blog_CreatePersonalBlog($oUser);
/**
* Если юзер зарегистрировался по приглашению то обновляем инвайт
*/
if (USER_USE_INVITE and $oInvite=$this->User_GetInviteByCode($this->GetInviteRegister())) {
$oInvite->setUserToId($oUser->getId());
$oInvite->setDateUsed(date("Y-m-d H:i:s"));
$oInvite->setUsed(1);
$this->User_UpdateInvite($oInvite);
}
/**
* Если стоит регистрация с активацией то проводим её
*/
if (USER_USE_ACTIVATION) {
/**
* Отправляем на мыло письмо о подтверждении регистрации
*/
$this->Notify_SendRegistrationActivate($oUser,getRequest('password'));
func_header_location(DIR_WEB_ROOT.'/'.ROUTE_PAGE_JOIN.'/confirm/');
} else {
$this->Notify_SendRegistration($oUser,$password); // отправляем на мыло логин и пароль
$this->Viewer_Assign('bRefreshToHome',true);
$oUser=$this->User_GetUserById($oUser->getId());
$this->User_Authorization($oUser,false);
$this->SetTemplateAction('ok');
$this->DropInviteRegister();
}
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
return Router::Action('error');
}
}
}
}
/**
* Обрабатывает активацию аккаунта
*
* @return unknown
*/
protected function EventActivate() {
$bError=false;
/**
* Проверяет передан ли код активации
*/
$sActivateKey=$this->GetParam(0);
if (!func_check($sActivateKey,'md5')) {
$bError=true;
}
/**
* Проверяет верный ли код активации
*/
if (!($oUser=$this->User_GetUserByActivateKey($sActivateKey))) {
$bError=true;
}
/**
*
*/
if ($oUser and $oUser->getActivate()) {
$this->Message_AddErrorSingle($this->Lang_Get('registration_activate_error_reactivate'),$this->Lang_Get('error'));
return Router::Action('error');
}
/**
* Если что то не то
*/
if ($bError) {
$this->Message_AddErrorSingle($this->Lang_Get('registration_activate_error_code'),$this->Lang_Get('error'));
return Router::Action('error');
}
/**
* Активируем
*/
$oUser->setActivate(1);
$oUser->setDateActivate(date("Y-m-d H:i:s"));
/**
* Сохраняем юзера
*/
if ($this->User_Update($oUser)) {
$this->DropInviteRegister();
$this->Viewer_Assign('bRefreshToHome',true);
$this->User_Authorization($oUser,false);
return;
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
return Router::Action('error');
}
}
/**
* Обработка кода приглашения при включеном режиме инвайтов
*
*/
protected function EventInvite() {
if (!USER_USE_INVITE) {
return parent::EventNotFound();
}
if (isset($_REQUEST['submit_invite'])) {
$this->Security_ValidateSendForm();
/**
* проверяем код приглашения на валидность
*/
if ($this->CheckInviteRegister()) {
$sInviteId=$this->GetInviteRegister();
} else {
$sInviteId=getRequest('invite_code');
}
$oInvate=$this->User_GetInviteByCode($sInviteId);
if ($oInvate) {
if (!$this->CheckInviteRegister()) {
$this->Session_Set('invite_code',$oInvate->getCode());
}
return Router::Action('join');
} else {
$this->Message_AddError($this->Lang_Get('registration_invite_code_error'),$this->Lang_Get('error'));
}
}
}
/**
* Пытается ли юзер зарегистрироваться с помощью кода приглашения
*
* @return unknown
*/
protected function CheckInviteRegister() {
if ($this->Session_Get('invite_code')) {
return true;
}
return false;
}
protected function GetInviteRegister() {
return $this->Session_Get('invite_code');
}
protected function DropInviteRegister() {
if (USER_USE_INVITE) {
$this->Session_Drop('invite_code');
}
}
/**
* Просто выводит шаблон
*
*/
protected function EventConfirm() {
}
}
?>
В файле templates/language/russian.php
находим это:
'registration_ok' => 'Поздравляем! Регистрация прошла успешно',
ниже вставляем:
'join' => 'Регистрация',
В папке templates/skin/new/actions создаем папку ActionJoin и копируем в нее все файлы из папки ActionRegistration
Затем в файле templates/skin/new/actions/ActionJoin/index.tpl заменяем весь код на этот:
{include file='header.light.tpl'}
<div class="lite-center register">
<form action="{$DIR_WEB_ROOT}/join/" method="POST">
<h3>{$aLang.registration}</h3>
<label for="email">{$aLang.registration_mail}:</label><br />
<p><input type="text" class="input-text" id="email" name="mail" value="{$_aRequest.mail}"/>
<span class="input-note">{$aLang.registration_mail_notice}</span></p><br />
{$aLang.registration_captcha}:<br />
<img src="{$DIR_WEB_ROOT}/classes/lib/external/kcaptcha/index.php?{$_sPhpSessionName}={$_sPhpSessionId}">
<p><input type="text" class="input-text" style="width: 80px;" name="captcha" value="" maxlength=3 /></p>
<div class="lite-note">
<button type="submit" name="submit_register" class="button" style="float: none;"><span><em>{$aLang.registration_submit}</em></span></button>
</div>
</form>
</div>
{include file='footer.light.tpl'}
Жду ваших комментариев по тем пунктам которые реализовал и помощи — по которым не реализовал :)
8 комментариев
Причем тут гуд не гуд, стоит задача и я ее решаю, а минусы ставить не разобравшись это глупость ваша, господин C4ACTbE!
Если кому то неясно о чем идет речь, вот пример
сейчас логин и пароль высылается на имейл, но нужно переделать чтоб высылался смс-кой на указанный номер.
Спасибо
Автор, ты не обижайся, спрашивай, я смогу тебе все разжевать подробнее, просто хочется чтобы безграмотных php программистов становилось меньше.
Почитай про паттерны проектирования, будет полезно.
P.S. Знаешь, в ls есть встроенный объект для работы с бд — oDb, наряду с ним использовать mysql_connect это кощунство, тем более коннектится к базе из экшена. И ещё, если будешь что-либо разрабатывать в будущем НЕ в рамках готовой cms или какого-либо фреймворка, то почитай про PDO или Mysqli, на дворе php5 и расщирение mysql не рекомендовано к использованию по ряду причин.