Есть два решения:
1. переписать компонент
2. написать обработчик в шаблоне.
Первый вариант тянет на большую разработку.
а второй можно реализовать на коленке (ломаем идеологию MVC ):
а. создаем в своЁм сайте шаблоны компонент system.auth.changepasswd и system.auth.forgotpasswd
а1. проверка существования логина или почты и отсылка письма - system.auth.forgotpasswd
в шаблоне добывляем
Код |
---|
<?php.
if($arParams["~AUTH_RESULT"]){ //если есть результат , произошел пост
$code = mb_substr(md5(uniqid(rand(),true)), 0, 8); //код восстановления пароля
if(strlen($_REQUEST['USER_LOGIN'])>2){
$UserIDExt = (/объект или ф-ция проверки существования логина во внешней системе /->GetIDbyLogin($_REQUEST['USER_LOGIN']));
}elseif(strlen($_REQUEST['USER_EMAIL'])>2){
$UserIDExt = (/объект или ф-ция проверки существования почты во внешней системе /->GetIDbyMail($_REQUEST['USER_EMAIL']));
}else{
$UserIDExt = 0;
}
if($UserIDExt>0){
$arFilter = Array( //фильтр - найти пользователя с внешним ид - $UserIDExt и в группе 6
Array(
"LOGIC"=>"AND",
Array(
'XML_ID' => $UserIDExt,
),
Array(
"Bitrix\Main\UserGroupTable:USER.GROUP_ID"=>6
)
)
);
if (($arU = \Bitrix\Main\UserTable::getList(array('filter' => $arFilter))->fetch()) && ($arU['ID'] > 0)){
//пользователь есть сохраняем CONFIRM_CODE для проверке в письме
$U = new \CUser;
define('NOT_CHECK_ADD', true);
$ID = $U->Update($arU['ID'], array(
'CONFIRM_CODE' => $code,
));
}else{
//нету пользователя добавляем в битрикс
$U = new \CUser;
define('NOT_CHECK_ADD', true);
$ID = $U->Add(array(
'LOGIN' => $_REQUEST['USER_LOGIN'],
'PASSWORD' => $arParams['PASSWORD'],
'XML_ID' => $UserIDExt,
'ACTIVE' => 'Y',
'EXTERNAL_AUTH_ID' => 'BBY',
'LID' => SITE_ID,
'CONFIRM_CODE' => $code,
'GROUP_ID' => array(3,4,6),
));
//посылаем письмо пользователю, письмо из шаблонов
$rsSites = CSite::GetByID("s1");
$arSite = $rsSites->Fetch();
$arEventFields = array(
"SITE_NAME" => $arSite['NAME'],
"EMAIL" => /функция поиска почты/->GetMailCustomer($UserIDExt),
"MESSAGE" => 'Запрос о смене пароля.',
"USER_ID" => $arU['ID'],
"URL_LOGIN" => $arU['LOGIN'],
"LOGIN"> => $arU['LOGIN'],
'CHECKWORD' => $code,
'DEFAULT_EMAIL_FROM' => 'support@site.ru',
);
CEvent::Send('USER_PASS_REQUEST', $arSite, $arEventFields, "N");
} |
Далее изменение пароля system.auth.changepasswd в шаблоне
Код |
---|
if($arParams["~AUTH_RESULT"]){ //если есть результат , произошел пост
$code = mb_substr(md5(uniqid(rand(),true)), 0, 8);
if(strlen($_REQUEST['USER_LOGIN'])>2){
$UserIDExt = (/объект или ф-ция проверки существования логина во внешней системе /->GetIDbyLogin($_REQUEST['USER_LOGIN']));
if($UserIDExt>0){
$arFilter = Array( // поиск по ид и группе
Array(
"LOGIC"=>"AND",
Array(
'XML_ID' => $UserIDExt,
),
Array(
"Bitrix\Main\UserGroupTable:USER.GROUP_ID"=>6
)
)
);
if (($arU = \Bitrix\Main\UserTable::getList(array('filter' => $arFilter))->fetch()) && ($arU['ID'] > 0)){
if($arU['CONFIRM_CODE']===$_REQUEST['USER_CHECKWORD']){
//$USER->Update(, Array("PASSWORD" => $password, "CONFIRM_PASSWORD" => $password)) // это для битрикса , уменя не хранятся пароли в битриксе
if($_REQUEST['USER_PASSWORD']===$_REQUEST['USER_CONFIRM_PASSWORD']){
(/объект или ф-ция изменения пароля во внешней системе /->::ChangePass($UserIDExt, $_REQUEST['USER_PASSWORD']);
echo '<b>'.GetMessage("AUTH_MESS").'</b>'; // типа пароль изменен
$U = new \CUser; // изменяем код подтверждения что б только один раз можно было поменять
define('NOT_CHECK_ADD', true);
$ID = $U->Update($arU['ID'], array(
'CONFIRM_CODE' => $code,
));
}else{
echo '<font class="errortext">'.GetMessage("AUTH_PASS2").'</font>'; // ошибка сравнения пароля и подтверждения пароля
}
}else{
ShowMessage($arParams["~AUTH_RESULT"]); // стандартный вывод ошибки или код не тот или пользователь не найден
}
}
}
|
в иннете не нашел решений данной ситуации ,может кому пригодится ....