Изменение страницы регистрации

Вот тут я задавал вопрос по поводу изменения способа регистрации, но не дождавшись ответа решил попробовать сам.
Вкратце стояла такая задача: юзер попадает на страницу регистрации и вводит в поле свой имейл и капчу, в ответ скрипт генерирует ему логин и пароль и высылает на имейл, если юзер в течение 24 часов не зашел, то данные удаляются из таблицы юзеров, если зашел — то как бы подтвердил регистрацию.
Что реализовал:
1. Сделал отдельную страницу вместо test1.ru/registration/ сделал test1.ru/join/
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 комментариев

avatar
Меня это не особо заинтересовало, но как я понял, пользователю необходимо помнить логин который скрипт сам сгенерирует. Если это так, то это НЕ ГУД(
avatar
Пользователю логин и пароль прийдет на почту, таким образом, зайдя под этим логином пользователь подтверждает свой имейл.
Если это так, то это НЕ ГУД(
Причем тут гуд не гуд, стоит задача и я ее решаю, а минусы ставить не разобравшись это глупость ваша, господин C4ACTbE!
avatar
Прыгни из окна 356 этажа, я даже плюсик поставлю, задача такая блять стоит, ВЫПОЛНЯТЬ БЛЯТЬ!!!
avatar
Эммм… А зачем пользователю навязывать какой то мистический логин и какой то там пароль, да притом еще надо это все дело подтвердить, скопировать пароль (а если по ссылке из письма юзвер без ввода пароля автоматом логинеться, то ребята, это привет ку-ку, клоунада гарантирована), столько телодвижений — писздец просто. Какой в этом смысл то?
avatar
2. Удаление юзера, если он не зашел под полученным на почту логином. — CRON тебе в помо… анус =)
avatar
macrulez, по делу вы ничего не сказали, в 30 лет уже можно избавиться от юношеских замашек комментировать все подряд, лично вас я не оскорблял.
Если кому то неясно о чем идет речь, вот пример vkontakte.ru/activation.php
сейчас логин и пароль высылается на имейл, но нужно переделать чтоб высылался смс-кой на указанный номер.
avatar
Как сделать, чтобы вместо логина на сайте отображалось имя, введенное при регистрации?
Спасибо
avatar
Говнокод конечно… Зачем все городить в Action? Существуют модули для многих вещей. А также маппер и сущность. Нужно придерживаться структуры движка ls, это правильно и принесет множество плюшек в будущем, да и в настоящем.
Автор, ты не обижайся, спрашивай, я смогу тебе все разжевать подробнее, просто хочется чтобы безграмотных php программистов становилось меньше.
Почитай про паттерны проектирования, будет полезно.

P.S. Знаешь, в ls есть встроенный объект для работы с бд — oDb, наряду с ним использовать mysql_connect это кощунство, тем более коннектится к базе из экшена. И ещё, если будешь что-либо разрабатывать в будущем НЕ в рамках готовой cms или какого-либо фреймворка, то почитай про PDO или Mysqli, на дворе php5 и расщирение mysql не рекомендовано к использованию по ряду причин.
  • emmy
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.