Skip to content
Butschster edited this page Jan 27, 2015 · 1 revision

Referral links (Ссылки подтверждения)

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

Для таких случаев в KodiCMS имеется модуль reflinks, который помогает сгенерировать ссылку и отправить её по электронной почте.

Принцип работы

Рассмотрим ситуацию с регистрацией пользователя. Допустим у нас есть форма регистрации, которую заполняет пользователь и отправляет данные на сервер. Данные поступают на сервер и там происходит создание нового пользователя в системе без роли login, которая отвечает за возможность авторизации на сайте (В Kohana без этой роли пользователь не может авторизоваться) и получение данной роли и будет тем самым подтверждением регистрации.

Приступим:

try
{
	// Создаем нового пользователя
	$user = ORM::factory('User')->create_user($_POST, array(
		'username',
		'password',
		'email',
	));
} 
catch (ORM_Validation_Exception $e)
{
	// Ошибка в валидации данных
	...
}
catch (Kohana_Exception $e)
{
	// Ошибка
	...
}

// Проверяем создался ли пользователь
if( !$user->loaded())
{
	// Если нет выводим ошибку
	...
}

try
{
	// Генерируем ссылку для подтверждения
	$reflink = ORM::factory('user_reflink')->generate($user, 'register', array(
		'next_url' => URL::frontend('/register/completed', TRUE)
	));

	// Отправляем ссылку на email (https://github.com/butschster/kodicms/wiki/Email-Types)
	Email_Type::get('user_register')->send(array(
		'username' => $user->username,
		'email' => $user->email,
		'reflink' => Route::url('reflink', array('code' => $reflink)),
		'code' => $reflink
	));

	// Сообщение об отправке ссылки на почту
	....
} 
catch (Kohana_Exception $e)
{
	// Ошибка
	...
}

Немного подробнее остановимся на методе генерации ссылки ORM::factory('user_reflink')->generate, он принимает 3 параметра:

  • ORM модель пользователя
  • Тип генерируемой ссылки (ключ)
  • Данные, которые могут понадобиться после нажатия на ссылку подтверждения (Сериализуются в БД)

После того, как пользователь получил ссылку и кликнул по ней происходит поиск ключа в БД, получение типа ссылки - register и поиск для этого типа ссылки класса Reflink_Register, если класс найден, инициалзиация объекта и запуск метода Reflink_Register::confirm

class Reflink_Register extends Reflink {
	
	// $this->_model - объект сгенерированной ссылки Model_User_Reflink
	// https://github.com/butschster/kodicms/blob/dev/cms/modules/reflinks/classes/model/user/reflink.php
	
	public function confirm()
	{
		try
		{
			// Загрузка объекта роли `login`
			$role = ORM::factory('role', array('name' => 'login'));

			// Добавление роли пользовалею
			$this->_model->user->add('roles', $role);
			
			// Отправка уведомления пользователю об успешной регистрации (https://github.com/butschster/kodicms/wiki/Email-Types)
			Email_Type::get('user_registered')->send(array(
				'username' => $this->_model->user->username,
				'email' => $this->_model->user->email
			));

			
			
			// Удаление ссылки из БД
			$this->_model->delete();
			return TRUE;
		}
		catch (Kohana_Exception $e)
		{
			throw new Reflink_Exception('Something went wrong');
		}
	}
}

Таким образом вы можете создавать свои типы ссылок и добавлять на них свои сценарии.