УрокСоздание своих токенов на примере регистрации пользователей

В этой статье я совмещу две очень полезные вещи: во-первых, расскажу про программное создание токенов, а во-вторых, покажу как в Drupal 7 отправлять пользователю письмо о регистрации, в котором будет находиться автоматически сгенерированный пароль для него.

Сегодня мне была поставлена такая задача по регистрации: Форма регистрации должна содержать только емейл пользователя. После ввода емейла пользователь автоматически авторизируется на сайте, а пароль и логин высылаются на указанную почту. Парадоксально, но в седьмом Друпале этого сделать стандартными средствами сделать невозможно. Из всех возможных стандартных средств, наиболее близкая к поставленной задаче оказалась такая: Пользователь вводит логин, емейл и пароль, после чего происходит автоматическая авторизация. На емейл приходит только логин пользователя - в токенах пароля нет и не предусмотрено. Поэтому отталкиваться я решил именно от него. Итак, переходим к реализации.

Шаг первый. Настройка пользователей.

Первым делом заходим на страницу настройки пользователей /admin/config/people/accounts и выставляем там такие настройки:

tokens.png

После таких настроек регистрация выглядит самым громоздким образом (зато автоматически авторизует пользователя):

tokens_0.png

Шаг второй. Убираем лишние поля из формы регистрации.

Скачиваем и ставим модуль Email Registration, который позволяет убрать логин из формы регистрации. Теперь она выглядит немного поменьше:

tokens_1.png

Осталось убрать поля с паролем. Для этого я создал небольшой модуль, который назвал 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();
  }
}

Теперь регистрация выглядит намного проще:

tokens_2.png

Шаг третий. Создание токена.

Теперь, введя емейл, пользователь зарегистрируется и авторизируется. Однако свой пароль он не знает, а далеко не каждый пользователь догадается зайти в личный кабинет и поменять его. Поэтому очень неплохо было бы выслать пароль пользователю на емейл. Для этого надо создать токен с паролем, которого по умолчанию в Друпале нет. Создаём токен с паролем:

/**
 * 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], который можно использовать в тексте письма:

tokens_3.png

Если включить модуль Token, то созданный токен будет отображаться в общем списке:

tokens_4.png

Ну вот, собственно, и всё.

Шаг четвёртый. Написал модуль - поделись с другими.

Модуль можно забрать прямо с d.org: Registration Token Password. Кстати, там есть настройка дополнительная: генерировать пароль автоматически (скрывая в форме регистрации поля для ввода пароля), или же оставлять всё как есть. Но в любом случае пароль может быть выслан на емейл при добавлении соответствующего токена.

Комментарии

Аватар пользователя Dyms
Dyms написал:

Не регистрация, а мечта! Спасибо!

03.03.2012 16:18
Аватар пользователя kalabro
kalabro написала:

Если поставить галку «Требуется подтверждение email», то всё сломается?

03.03.2012 19:48
Аватар пользователя Spleshka
Spleshka написал:

Ничего не сломается, все будет по прежнему работать. Код модуля не совсем соответсвует коду в статье - в модуле я его доработал. А статья всеже больше к токенам относится, чем к модулю.

03.03.2012 19:53
Аватар пользователя Ксения
Ксения написал:

Большое спасибо за модуль! Очень помог в решении моих задач!

31.03.2012 21:33
Аватар пользователя Brussnika
Brussnika написал:

А как можно вытащить (или создать новый) пароль пользователя и прислать ему в ответ на запрос Password Recovery?

05.04.2012 15:34
Аватар пользователя Spleshka
Spleshka написал:

Старый пароль пользователю вы никак не отправите, это точно. По поводу отправки нового - в принципе это можно реализовать, однако стандартный воркфлоу друпала этого не предусматривает. Поэтому придётся кодить самостоятельно :)

12.04.2012 23:25
Аватар пользователя Холод
Холод написал:

Спасибо за модуль, очень пригодился!!! =)

19.04.2012 02:11
Аватар пользователя Виталий
Виталий написал:

Огромное спасибо, очень сильно помог.

07.06.2012 20:59
Аватар пользователя Hail
Hail написал:

Спасибо!

26.06.2012 21:22
Аватар пользователя PG
PG написал:

Уже на 3-м сайте пытаюсь его включить. Сейчас пробовал на promo.org.il
Генерировать пароль автоматически - отмечено
----------
В 'Детали учётной записи для [user:name] на [site:name]' проставлено
пользователь: [user:name]
пароль: ваш пароль [current-user:password] или [site:current-user:password]
--------
1)ничего не генерируется
2)ничего не высылается

12.06.2013 20:52
Аватар пользователя Spleshka
Spleshka написал:

Правильный токен - [user:password]

13.06.2013 00:35
Аватар пользователя PG
PG написал:

Да, правильно [user:password]. Модуль толковый (по ходу)) Дал +1.
Путаница получилась потому-что в списке доступных токенов есть прочие, типа [current-user:password] которые не дают никакого значения.
---
А вот чего не понял - так это комментарии на этом сайте. Поля только 'Ваше имя'+'Комментарий' (для гостя). А уведомление об ответе в какую рельсу получать?))

14.06.2013 19:47
Аватар пользователя Spleshka
Spleshka написал:

Я когда-нибудь доведу сайт до ума) Сейчас Друпал 8 выходит, очень занят работой в этом русле.

16.06.2013 00:29
Аватар пользователя GoodSeeker
GoodSeeker написал:

Что-то не получается.
Если восстанавливать пароль по токену [user:password] - на почту приходит фраза "Your password "

Если вставлять в Rules, а там кстати в токенах его нет, то в письме ничего не приходит, на том месте где стоит токен

Версия Drupal 7.23
Token 7.x-1.5
Rules UI 7.x-2.3

Помогите, пожалуйста, если получится?

09.09.2013 22:02
Аватар пользователя bssso
bssso написал:

Тоже самое! Никто не знает как исправить?

06.01.2014 04:23
Аватар пользователя firemars81
firemars81 написал:

удалось решить вопрос с фразой "Your password "? У меня такаяже проблема только эта фраза приходит при регистрации.

11.05.2014 14:13
Аватар пользователя Александр1410
Александр1410 написал:

как вариант могу предложить перед отправкой письма выполнить PHP, в нем добавить в переменную $account->password новый пароль, ну и обновить pass хеш у данного пользователя.

20.10.2014 10:56
Аватар пользователя yury
yury написал:

приветствую, а не могли бы Вы подсказать как с помощью токенов вывести в user-profile.tpl.php количество баллов пользователя из userpoints? Возможно ли это вообще?
А то сейчас они отображаются в отдельной вкладке, не очень то удобно.

01.02.2014 11:31
Аватар пользователя Yuriy
Yuriy написал:

Доброе время суток вам.
Модуль сказка. Скажите а как привязать этот модуль не к основному user/register, а к profile2 типу, допустим moyprofile ? Это возможно?, а то у меня на основной профиль ldap настроен для внутренних пользeвателей, а для внешних пользевателей хотелось бы ваш модуль. Спасибо если подскажите как это сделать.

27.02.2014 23:25
Аватар пользователя Гость
Гость написал:

Добрый день, подскажите, как связать данный модуль, с модулем Rules.

В Drupal Commerce, после оформлении заказа анонимным пользователем срабатывает правило: "Create a new account for an anonymous order", одно из действий данного правила отправляет пользователю письмо, с уведомлением о регистрации. В данном письме пароль не приходит.

Подскажите, в какую сторону копать?

31.08.2016 21:23
Аватар пользователя nickson
nickson написал:

В Drupal Commerce, после оформлении заказа анонимным пользователем срабатывает правило: "Create a new account for an anonymous order", одно из действий данного правила отправляет пользователю письмо, с уведомлением о регистрации. В данном письме пароль не приходит.

Столкнулся с такой же проблемой. Удалось побороть так.
В правиле "Создание новой учётной записи для анонимного заказа":

1) После действия "Создать новую сущность" вставил действие "Добавить переменную" типа Текст с php-кодом

<?php
$rnd_pass = user_password(6);
user_save($account_created, array('pass'=>$rnd_pass));
echo $rnd_pass;
?>

Имя переменной = pass

2) В цикле ниже перед действием "Отправить почтовое сообщение учётной записи" добавил action "Выполнение произвольного PHP кода." с кодом

$list_item->password = $pass;

В письме после завершения заказа на месте токена [user:password] будет сгенерированный пароль.

22.09.2016 15:18

Комментировать