-
Notifications
You must be signed in to change notification settings - Fork 35
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'); } } }
Таким образом вы можете создавать свои типы ссылок и добавлять на них свои сценарии.