Апрель 28, 2018
Теги: Пользователи, Как это сделать?
Конечно, по современным стандартам отправка пароля пользователю почтой не считается безопасной, но личные данные не на всех сайтах настолько ценны, чтобы беспокоится об этом, а клиент может попросить вас сделать, чтобы пароль все же отправлялся.
Чтобы отправить пароль при его изменении, нужно сначала перехватить его, т.к. в базе данных он хранится в шифрованном виде, за это отвечает обработчик события "OnBeforeUserChangePassword". В данном обработчике пароль сохраняется при помощи статической переменной в функции singleton.
Далее, мы используем обработчик события "OnBeforeEventAdd", который отвечает за отправку писем. В данном обработчике мы берем сохраненный пароль из функции singleton и добавляем в массив $arFields для почтового события "USER_PASS_CHANGED". Все что нужно после этого - добавить макрос "#PASSWORD#" в шаблон письма.
<?php
namespace Partner;
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnBeforeUserChangePassword',
'\Partner\SendPassword::onBeforeUserChangePassword'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnBeforeEventAdd',
'\Partner\SendPassword::onBeforeEventAdd'
);
class SendPassword
{
function onBeforeUserChangePassword($arParams)
{
self::singleton(true,$arParams["PASSWORD"]);
}
function onBeforeEventAdd(&$event, &$lid, &$arFields, &$message_id, &$files)
{
if($event=="USER_PASS_CHANGED")
$arFields["PASSWORD"] = self::singleton();
}
private function singleton($write=false,$newValue=false)
{
static $value;
if($write)
$value = $newValue;
return $value;
}
}
Более сложный пример, отправляющий пароль при регистрации или изменении (требует добавления "#PASSWORD#" в шаблон "USER_INFO"):
<?php
namespace Partner;
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnBeforeUserAdd',
'\Partner\SendPassword::onBeforeUserAddUpdate'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnBeforeUserUpdate',
'\Partner\SendPassword::onBeforeUserAddUpdate'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnAfterUserAdd',
'\Partner\SendPassword::onAfterUserAdd'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnAfterUserUpdate',
'\Partner\SendPassword::onAfterUserUpdate'
);
\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible(
'main',
'OnBeforeEventAdd',
'\Partner\SendPassword::onBeforeEventAdd'
);
class SendPassword
{
private static $alreadySent = false;
private static $needSend = false;
private static $password = "";
function onBeforeUserAddUpdate(&$arFields)
{
if($arFields["PASSWORD"])
{
self::$needSend = true;
self::$password = $arFields["PASSWORD"];
}
}
function onAfterUserAdd(&$arFields)
{
if(self::$needSend && !!$arFields["ID"])
\CUser::SendUserInfo($arFields["ID"], SITE_ID, "", true);
}
function onAfterUserUpdate(&$arFields)
{
if(self::$needSend && $arFields["RESULT"])
\CUser::SendUserInfo($arFields["ID"], SITE_ID, "", true);
}
function onBeforeEventAdd(&$event, &$lid, &$arFields, &$message_id, &$files)
{
if($event!="USER_PASS_CHANGED" && $event!="USER_INFO")
return;
if(self::$alreadySent)
return false;
$arFields["PASSWORD"] = self::$password;
self::$alreadySent = true;
}
}