УрокСоздание своих токенов на примере регистрации пользователей
В этой статье я совмещу две очень полезные вещи: во-первых, расскажу про программное создание токенов, а во-вторых, покажу как в Drupal 7 отправлять пользователю письмо о регистрации, в котором будет находиться автоматически сгенерированный пароль для него.
Сегодня мне была поставлена такая задача по регистрации: Форма регистрации должна содержать только емейл пользователя. После ввода емейла пользователь автоматически авторизируется на сайте, а пароль и логин высылаются на указанную почту. Парадоксально, но в седьмом Друпале этого сделать стандартными средствами сделать невозможно. Из всех возможных стандартных средств, наиболее близкая к поставленной задаче оказалась такая: Пользователь вводит логин, емейл и пароль, после чего происходит автоматическая авторизация. На емейл приходит только логин пользователя - в токенах пароля нет и не предусмотрено. Поэтому отталкиваться я решил именно от него. Итак, переходим к реализации.
Шаг первый. Настройка пользователей.
Первым делом заходим на страницу настройки пользователей /admin/config/people/accounts и выставляем там такие настройки:
После таких настроек регистрация выглядит самым громоздким образом (зато автоматически авторизует пользователя):
Шаг второй. Убираем лишние поля из формы регистрации.
Скачиваем и ставим модуль Email Registration, который позволяет убрать логин из формы регистрации. Теперь она выглядит немного поменьше:
Осталось убрать поля с паролем. Для этого я создал небольшой модуль, который назвал Registration Password Token (системное имя - rpt). Имплементируем hook_form_FORM_ID_alter():
/** * Implements hook_form_FORM_ID_alter(). */ function rpt_form_user_register_form_alter(&$form, &$form_state) { // Если выставлены настройки из первого скриншота, то скрываем пароль. $user_registration = variable_get('user_register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL); $verification_required = variable_get('user_email_verification', TRUE); $user_registration_allowed = in_array($user_registration, array(USER_REGISTER_VISITORS, USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)); if ($user_registration_allowed && !$verification_required) { // Меняем полю с паролем тип на value и генерируем автоматический пароль. $form['account']['pass']['#type'] = 'value'; $form['account']['pass']['#value'] = user_password(); } }
Теперь регистрация выглядит намного проще:
Шаг третий. Создание токена.
Теперь, введя емейл, пользователь зарегистрируется и авторизируется. Однако свой пароль он не знает, а далеко не каждый пользователь догадается зайти в личный кабинет и поменять его. Поэтому очень неплохо было бы выслать пароль пользователю на емейл. Для этого надо создать токен с паролем, которого по умолчанию в Друпале нет. Создаём токен с паролем:
/** * Implements hook_token_info(). */ function rpt_token_info() { // Создаём новый токен с паролем и добавляем его в группу пользователей. $info['tokens']['user']['password'] = array( 'name' => t('User password'), 'description' => t('Provides user password. May be used only during registration.'), ); return $info; }
Наполняем токен данными, которые будут доступны только в процессе регистрации:
/** * Implements hook_tokens(). */ function rpt_tokens($type, $tokens, array $data = array(), array $options = array()) { $replacements = array(); if (isset($data['user']) && isset($data['user']->password)) { $replacements['[user:password]'] = $data['user']->password; } return $replacements; }
Теперь при регистрации будет доступен новый токен [user:password], который можно использовать в тексте письма:
Если включить модуль Token, то созданный токен будет отображаться в общем списке:
Ну вот, собственно, и всё.
Шаг четвёртый. Написал модуль - поделись с другими.
Модуль можно забрать прямо с d.org: Registration Token Password. Кстати, там есть настройка дополнительная: генерировать пароль автоматически (скрывая в форме регистрации поля для ввода пароля), или же оставлять всё как есть. Но в любом случае пароль может быть выслан на емейл при добавлении соответствующего токена.
- Spleshka
- 02.03.2012
- 33258
Комментарии
Не регистрация, а мечта! Спасибо!
Если поставить галку «Требуется подтверждение email», то всё сломается?
Ничего не сломается, все будет по прежнему работать. Код модуля не совсем соответсвует коду в статье - в модуле я его доработал. А статья всеже больше к токенам относится, чем к модулю.
Большое спасибо за модуль! Очень помог в решении моих задач!
А как можно вытащить (или создать новый) пароль пользователя и прислать ему в ответ на запрос Password Recovery?
Старый пароль пользователю вы никак не отправите, это точно. По поводу отправки нового - в принципе это можно реализовать, однако стандартный воркфлоу друпала этого не предусматривает. Поэтому придётся кодить самостоятельно :)
Спасибо за модуль, очень пригодился!!! =)
Огромное спасибо, очень сильно помог.
Спасибо!
Уже на 3-м сайте пытаюсь его включить. Сейчас пробовал на promo.org.il
Генерировать пароль автоматически - отмечено
----------
В 'Детали учётной записи для [user:name] на [site:name]' проставлено
пользователь: [user:name]
пароль: ваш пароль [current-user:password] или [site:current-user:password]
--------
1)ничего не генерируется
2)ничего не высылается
Правильный токен - [user:password]
Да, правильно [user:password]. Модуль толковый (по ходу)) Дал +1.
Путаница получилась потому-что в списке доступных токенов есть прочие, типа [current-user:password] которые не дают никакого значения.
---
А вот чего не понял - так это комментарии на этом сайте. Поля только 'Ваше имя'+'Комментарий' (для гостя). А уведомление об ответе в какую рельсу получать?))
Я когда-нибудь доведу сайт до ума) Сейчас Друпал 8 выходит, очень занят работой в этом русле.
Что-то не получается.
Если восстанавливать пароль по токену [user:password] - на почту приходит фраза "Your password "
Если вставлять в Rules, а там кстати в токенах его нет, то в письме ничего не приходит, на том месте где стоит токен
Версия Drupal 7.23
Token 7.x-1.5
Rules UI 7.x-2.3
Помогите, пожалуйста, если получится?
Тоже самое! Никто не знает как исправить?
удалось решить вопрос с фразой "Your password "? У меня такаяже проблема только эта фраза приходит при регистрации.
как вариант могу предложить перед отправкой письма выполнить PHP, в нем добавить в переменную $account->password новый пароль, ну и обновить pass хеш у данного пользователя.
приветствую, а не могли бы Вы подсказать как с помощью токенов вывести в user-profile.tpl.php количество баллов пользователя из userpoints? Возможно ли это вообще?
А то сейчас они отображаются в отдельной вкладке, не очень то удобно.
Доброе время суток вам.
Модуль сказка. Скажите а как привязать этот модуль не к основному user/register, а к profile2 типу, допустим moyprofile ? Это возможно?, а то у меня на основной профиль ldap настроен для внутренних пользeвателей, а для внешних пользевателей хотелось бы ваш модуль. Спасибо если подскажите как это сделать.
Добрый день, подскажите, как связать данный модуль, с модулем Rules.
В Drupal Commerce, после оформлении заказа анонимным пользователем срабатывает правило: "Create a new account for an anonymous order", одно из действий данного правила отправляет пользователю письмо, с уведомлением о регистрации. В данном письме пароль не приходит.
Подскажите, в какую сторону копать?
В Drupal Commerce, после оформлении заказа анонимным пользователем срабатывает правило: "Create a new account for an anonymous order", одно из действий данного правила отправляет пользователю письмо, с уведомлением о регистрации. В данном письме пароль не приходит.
Столкнулся с такой же проблемой. Удалось побороть так.
В правиле "Создание новой учётной записи для анонимного заказа":
1) После действия "Создать новую сущность" вставил действие "Добавить переменную" типа Текст с php-кодом
Имя переменной = pass
2) В цикле ниже перед действием "Отправить почтовое сообщение учётной записи" добавил action "Выполнение произвольного PHP кода." с кодом
В письме после завершения заказа на месте токена [user:password] будет сгенерированный пароль.
Комментировать