Битрикс компонент изменения пароля

Недавно на одном из форумов, посвященных битриксу, нашел запись, где человек ищет битрикс компонент изменения пароля. Оказалось, простейший компонент отсутствует в системе. Поменять пароль в битрикс можно либо через профиль пользователя (bitrix:main.profile) либо при помощи отправки контрольной строки на емайл, перейдя по ссылке “забыли пароль”. Отдельного компонента изменения пароля в битриксе, к сожалению нету.

Я сделал этот компонент.

Давайте рассмотрим где могут лежать компоненты в битриксе:

  • в папке /bitrix/components/bitrix/ лежат стандартные компоненты битрикса

  • в папке /bitrix/components/название_компонента/ лежат компоненты, не являющиеся частью стандартной системы

  • также нестандартные компоненты могут лежать в папке /local/components/название_компонента/

Перейдем к написанию компонента изменения пароля битикс:

на страничке смены пароля вешаем следующий код:

	 <?$APPLICATION->IncludeComponent(
	                 "test:change.pass",
	                 ".default"

	 );?>


Разместим компонент в папке /local/components/test/, для этого создадим там необходимую структуру:
Код компонента (файл component.php)

	 <?

	 if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
	 global $USER;

	                 if(!$USER->IsAuthorized())
	                                die();

	                 if($_REQUEST['do']=='send'){
                               if($_REQUEST['password']!=$_REQUEST['confirm_password'])
                                                $arResult['ERROR'] .= GetMessage('NOT_THE_SAME')."<br />";
                               
                                if($_REQUEST['password']=='')
                                                $arResult['ERROR'] = GetMessage('PASSWORD_EMPTY')."<br />";
                               
                                if($_REQUEST['confirm_password']=='')

                                               $arResult['ERROR'] = GetMessage('CONFIRM_PASSWORD_EMPTY')."<br />";
                              
                               
                                $arAuthResult = $USER->Login($USER->GetLogin(), $_REQUEST['old_password'], "Y");
                                if($arAuthResult['TYPE']=='ERROR')
                                                $arResult['ERROR'] .= GetMessage('PASSWORD_WRONG')."<br />";
                               if($arResult['ERROR']==''){

                                               $ID = intval($USER->GetID());

                                               $salt = randString(8);

                                               $checkword = md5(CMain::GetServerUniqID().uniqid());

                                               $_checkword = $salt.md5($salt.$checkword);

                                               $strSql = "UPDATE b_user SET ".

                                                               "              CHECKWORD = '".$_checkword."', ".

                                                               "              CHECKWORD_TIME = ".$DB->CurrentTimeFunction().", ".

                                                               "              LID = '".$DB->ForSql($SITE_ID, 2)."', ".

                                                               "   TIMESTAMP_X = TIMESTAMP_X ".

                                                               "WHERE ID = '".$ID."'".

                                                               "              AND (EXTERNAL_AUTH_ID IS NULL OR EXTERNAL_AUTH_ID='') ";

                                               $DB->Query($strSql);

                                               if($arResult['ERROR']==''){

                                                               $res = $USER->ChangePassword($USER->GetLogin(), $checkword, $_REQUEST['password'], $_REQUEST['confirm_password']);

                                              

                                               if($res["TYPE"] == "OK")

                                                               $arResult['SUCCESS'] = 'Y';

                                               else

                                                               $arResult['ERROR'] = $res['MESSAGE'];

                                               }

                               }


	                 }


	                 $this->IncludeComponentTemplate();

	                 ?>

LANG-файл компонента (change.pass/lang/ru/component.php)

	 <?
	 $MESS["NOT_THE_SAME"] = "Введенные пароли не совпдают";
	 $MESS["PASSWORD_EMPTY"] = "Заполните поле \"новый пароль\"";
	 $MESS["CONFIRM_PASSWORD_EMPTY"] = "Заполните поле \"подтверждение нового пароля\"";

	 $MESS["PASSWORD_WRONG"] = "Введенный неверный пароль";

	 ?>

Шаблон (change.pass/templates/.default/template.php):

	 <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
	 /** @var array $arParams */
	 /** @var array $arResult */
	 /** @global CMain $APPLICATION */
	 /** @global CUser $USER */
	 /** @global CDatabase $DB */
	 /** @var CBitrixComponentTemplate $this */
	 /** @var string $templateName */
	 /** @var string $templateFile */
	 /** @var string $templateFolder */
	 /** @var string $componentPath */
	 /** @var CBitrixComponent $component */

	 ?>
	 <div class="change_pass">
	 <?if($arResult['ERROR']){?>
	                 <span class="error"><?=$arResult['ERROR'];?></span>
	 <?}?>
	 <?if($arResult['SUCCESS'] == 'Y'){?>
	                 <span class="success"><?=GetMessage("SUCCESS");?></span>
	 <?}?>

	                 <form action="" method="post">
                               <input type="hidden" name="do" value="send" />
	                                 <div class="item">

                                               <input type="password" value="<?=$_REQUEST['old_password'];?>" name="old_password" placeholder="<?=GetMessage("OLD_PASSWORD");?>" required />

	                                </div>

	                                <div class="item">

	                                                <input type="password" value="<?=$_REQUEST['password'];?>" name="password" placeholder="<?=GetMessage("NEW_PASSWORD");?>" required />

	                                </div>

                               <div class="item">
	                                                <input type="password" value="<?=$_REQUEST['confirm_password'];?>" name="confirm_password" placeholder="<?=GetMessage("CONFIRM_NEW_PASSWORD");?>" required />
	                                </div>
	                               
	                                <div class="item">

	                                                <input type="submit" value="<?=GetMessage("SEND");?>" />

	                                </div>

	                 </form>

	 </div>

LANG-файл шаблона:

<?

	 $MESS["OLD_PASSWORD"] = "Введите старый пароль";
	 $MESS["NEW_PASSWORD"] = "Введите новый пароль";
	 $MESS["CONFIRM_NEW_PASSWORD"] = "Подтвердите новый пароль";
	 $MESS["NOT_THE_SAME"] = "Введенные пароли не совпдают";
	 $MESS["SEND"] = "Сохранить";
	 $MESS["SUCCESS"] = "Пароль успешно изменён";

?>

Битрикс компонент изменения пароля при помощи метода $USER->Login($USER->GetLogin(), $_REQUEST['old_password'], "Y") проверяет старый пароль, если он правильный – то меняет старый на новый, при помощи кода:

                                               $ID = intval($USER->GetID());
	                                                $salt = randString(8);
	                                                $checkword = md5(CMain::GetServerUniqID().uniqid());
                                                $_checkword = $salt.md5($salt.$checkword);

	                                                $strSql = "UPDATE b_user SET ".

	                                                                "              CHECKWORD = '".$_checkword."', ".

	                                                                "              CHECKWORD_TIME = ".$DB->CurrentTimeFunction().", ".

	                                                                "              LID = '".$DB->ForSql($SITE_ID, 2)."', ".

	                                                                "   TIMESTAMP_X = TIMESTAMP_X ".
                                                                "WHERE ID = '".$ID."'".

	                                                                "              AND (EXTERNAL_AUTH_ID IS NULL OR EXTERNAL_AUTH_ID='') ";

	                                                $DB->Query($strSql);

                                               if($arResult['ERROR']==''){

	                                                                $res = $USER->ChangePassword($USER->GetLogin(), $checkword, $_REQUEST['password'], $_REQUEST['confirm_password']);
Пользуйтесь на здоровье!
Битрикс компонент изменения пароля


Статьи на тему:

Комментарии:

2018.12.12
Дмитрий
Круто, но нет одного важного момента. Если пользователь не помнит пароль.

Оставить комментарий
x
Комментарий успешно отправлен и будет доступен после проверки модератором!