Итак, самое главное в registration_functions.php
function regAuthenticate($login, $password, $Redirect = true)
{
$q = db_query("select cust_password, CID, ActivationCode, Login FROM ".CUSTOMERS_TABLE." WHERE Login='".xToText($login)."' OR Email='".xToText($login)."'");
$row = db_fetch_row($q);
// echo $login." ".$password."<br>";
//var_dump($row);exit;
if(CONF_ENABLE_REGCONFIRMATION && $row['ActivationCode']){
if($Redirect)RedirectProtected(set_query('&act_customer=1¬act=1'));
else return false;
}
if ($row && strlen( trim($login) ) > 0)
{
if ($row["cust_password"] == cryptPasswordCrypt($password, null) )
{
// set session variables
$_SESSION["log"] = $row["Login"];
$_SESSION["pass"] = cryptPasswordCrypt($password, null);
$_SESSION["current_currency"] = $row["CID"];
// update statistic
stAddCustomerLog( $login );
// move cart content into DB
moveCartFromSession2DB();
return true;
}
else
return false;
}
else return false;
}
здесь же отключим требование чтобы логин не начинался с цифр (почтовые адреса вполне могут с них начинаться):
//if (!(((ord($login)>=ord("a")) && (ord($login)<=ord("z"))) ||
// ((ord($login)>=ord("A")) && (ord($login)<=ord("Z")))))
// $error = ERROR_LOGIN_SHOULD_START_WITH_LATIN_SYMBOL;
//else
Теперь можно поправить authorization.tpl.html
<td align="left">E-mail или {$smarty.const.CUSTOMER_LOGIN}</td>
Для того чтобы убрать обязательный ввод логина при регистрации правим сначала register.tpl.html
закомментируем ввод логина и вместо него подвинем вверх e-mail:
<table cellspacing="0" cellpadding="0" align="center">
{* <tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_LOGIN}: </td>
<td valign="middle" align="left"><input type="text" name="login" style="width: 220px;" value="{$login}"></td>
</tr>
<tr>
<td colspan="2" style="height: 6px;"></td>
</tr>
*}
<tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_EMAIL}: </td>
<td valign="middle" align="left"><input type="text" name="email" style="width: 220px;" value="{$email}"></td>
</tr>
<tr>
<td colspan="2" style="height: 6px;"></td>
</tr>
затем отключим проверку на обязательность ввода логина, при регистрации, просто копируя поле email в поле login register.php
//$isPost = isset($_POST["login"]) && isset($_POST["cust_password1"]);
$isPost = isset($_POST["email"]) && isset($_POST["cust_password1"]);
if ( $isPost ) _copyDataFromPostToPage( $smarty );
if ( isset($_POST["save"]) ) //save user to the database
{
//$login = trim($_POST["login"]);
$login = trim($_POST["email"]);
здесь же:
function _copyDataFromPostToPage( & $smarty )
{
//$smarty->hassign("login", trim($_POST["login"]) );
$smarty->hassign("login", trim($_POST["email"]) );
Но некоторые пользователи любят регистрироваться по нескольку раз под разными логинами, но с одним и тем же E-mail. Для исключения подобной ситуации в registration_functions.php:
function regIsRegister( $login )
{
$id=trim($_SESSION["log"]);
$q=db_query("select count(*) from ".CUSTOMERS_TABLE." where (Login='".xToText($login)."' OR Email='".xToText($login)."') AND Login!='".xToText($id)."'");
$r = db_fetch_row($q);
//echo $login." ".$id."<br>";
//var_dump($r);exit;
return ( $r[0] != 0 );
}
Дубликаты регистраций с одинаковыми почтовыми адресами придется удалить из базы в ручном режиме. Я для этого просто выгрузил их в excel таблицу и отсортировал по алфавиту - тогда копии легко заметны. Конечно, при большом количестве пользователей придется писать специальный скрипт.
Дубликаты нужно удалять обязательно!
Но что произойдет, если покупатель захочет зайти в личный кабинет и сменить свой E-mail?
Удаляем поле Логин из личного кабинета, E-mail передвигаем на первое место в user_account.tpl.html
<table cellspacing="0" cellpadding="0">
<td>{$smarty.const.CUSTOMER_EMAIL}: </td>
<td><b>{$Email}</b></td>
</tr>
<tr>
<td style="height: 3px;"></td>
</tr>
<tr>
<td>{$smarty.const.CUSTOMER_LAST_NAME}: </td>
<td><b>{$last_name} {$first_name}</b></td>
</tr>
<tr>
<td style="height: 3px;"></td>
</tr>
{* <tr>
<td>{$smarty.const.CUSTOMER_LOGIN}: </td>
<td><b>{$login}</b></td>
</tr>
*}
и, соответственно в contact_info.tpl.html
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td align="center">{$smarty.const.STRING_REQUIRED}<br>
<br>
<table cellspacing="0" cellpadding="0" align="center">
{* <tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_LOGIN}: </td>
<td><input type="text" style="width: 250px;" name="login" value="{$login|default:""}"></td>
</tr>
<tr>
<td colspan="2" style="height: 4px;"></td>
</tr>
*}
<tr>
<td align="right" valign="middle"><span class="error">*</span> {$smarty.const.CUSTOMER_EMAIL}: </td>
<td><input type="text" style="width: 250px;" name="email" value="{$email|default:""}"></td>
</tr>
<tr>
<td colspan="2" style="height: 4px;"></td>
</tr>
И последнее, нужно немного изменить contact_info.php
это позволит не менять логин администратора:
<?php
#####################################
# ShopCMS: Скрипт интернет-магазина
# Copyright (c) by ADGroup
# http://shopcms.ru
#####################################
if ( isset($contact_info) && isset($_SESSION["log"]) )
{
// *****************************************************************************
// Purpose copies data from $_POST variable to HTML page
// Inputs $smarty - smarty object
// Remarks
// Returns nothing
function _copyDataFromPostToPage( & $smarty )
{
//$smarty->hassign("login", $_POST["login"] );
$smarty->hassign("login", $_POST["email"] );
$smarty->hassign("cust_password1", $_POST["cust_password1"] );
$smarty->hassign("cust_password2", $_POST["cust_password2"] );
$smarty->hassign("first_name", $_POST["first_name"] );
$smarty->hassign("last_name", $_POST["last_name"] );
$smarty->hassign("email", $_POST["email"] );
$smarty->assign("subscribed4news", (isset($_POST["subscribed4news"])?1:0) );
$additional_field_values = array();
$data = ScanPostVariableWithId( array( "additional_field" ) );
foreach( $data as $key => $val )
{
$item = array( "reg_field_ID" => $key, "reg_field_name" => "",
"reg_field_value" => $val["additional_field"] );
$additional_field_values[] = $item;
}
$smarty->hassign("additional_field_values", $additional_field_values );
}
// *****************************************************************************
// Purpose copies data from DataBase variable to HTML page
// Inputs $smarty - smarty object
// $log - customer login
// Remarks
// Returns nothing
function _copyDataFromDataBaseToPage( & $smarty, $log )
{
$cust_password = 0; $Email = 0; $first_name = 0;
$last_name = 0; $subscribed4news=0; $additional_field_values = 0;
$countryID = 0; $zoneID = 0; $state = 0;
$city = 0; $address = 0;
regGetContactInfo( $log, $cust_password, $Email, $first_name,
$last_name, $subscribed4news, $additional_field_values );
$smarty->assign("login", $log );
$smarty->assign("cust_password1", $cust_password );
$smarty->assign("cust_password2", $cust_password );
$smarty->assign("first_name", $first_name );
$smarty->assign("last_name", $last_name );
$smarty->assign("email", $Email );
$smarty->assign("subscribed4news", $subscribed4news );
$smarty->assign("additional_field_values", $additional_field_values );
}
//if ( isset($_POST["login"]) )
// _copyDataFromPostToPage( $smarty );
if ( isset($_POST["email"]) )
_copyDataFromPostToPage( $smarty );
else
_copyDataFromDataBaseToPage( $smarty, $_SESSION["log"] );
if ( isset($_POST["save"]) )
{
//$login = $_POST["login"];
if (trim($_SESSION["log"]) != "admin") $login = trim($_POST["email"]); else $login = trim($_SESSION["log"]);
$cust_password1 = $_POST["cust_password1"];
$cust_password2 = $_POST["cust_password2"];
$first_name = $_POST["first_name"];
$last_name = $_POST["last_name"];
$Email = $_POST["email"];
$subscribed4news = ( isset($_POST["subscribed4news"]) ? 1 : 0 );
$additional_field_values = ScanPostVariableWithId( array( "additional_field" ) );
if ( ( trim($login) != trim($_SESSION["log"]) ) && regIsRegister($login) )
$error = ERROR_USER_ALREADY_EXISTS;
if ( !isset($error) )
$error = regVerifyContactInfo( $login, $cust_password1, $cust_password2,
$Email, $first_name, $last_name, $subscribed4news,
$additional_field_values );
if ( $error == "" ) unset($error);
if ( !isset($error) )
{
regUpdateContactInfo( $_SESSION["log"], $login, $cust_password1,
$Email, $first_name, $last_name, $subscribed4news,
$additional_field_values );
$_SESSION["log"] = $login;
$_SESSION["pass"] = cryptPasswordCrypt($cust_password1, null);
Redirect( "index.php?contact_info=yes" );
}
else
$smarty->assign( "error", $error );
}
// additional fields
$additional_fields=GetRegFields();
$smarty->assign("additional_fields", $additional_fields );
$smarty->assign("main_content_template", "contact_info.tpl.html");
}
?>
Есть один момент. Если пользователь сменит свой E-mail или пароль из личного кабинета (нажмет "Сохранить" в разделе "Контактная информация"), то он больше не сможет заходить по логину. Но к этому переходу мы и стремимся
Да, "admin" это не касается.
Еще поправим russian.php
define('STRING_FORGOT_PASSWORD_FIX', 'Забыли пароль? Пожалуйста, введите Ваш E-mail или логин');
define('ERROR_USER_ALREADY_EXISTS', 'Пользователь с указанным E-mail или Login уже зарегистрирован');
и добавим восстановление пароля по E-mail в registration_functions.php
function regSendPasswordToUser( $login, &$smarty_mail )
{
$q = db_query("select Login, cust_password, Email FROM ".CUSTOMERS_TABLE." WHERE (Login='".xToText($login)."' OR Email='".xToText($login)."') AND (ActivationCode=\"\" OR ActivationCode IS NULL)");
if ($row = db_fetch_row($q)) //send password
{
$password = cryptPasswordDeCrypt( $row["cust_password"], null );
$smarty_mail->assign( "user_pass", $password );
$smarty_mail->assign( "user_login", $row['Login'] );
$html = $smarty_mail->fetch("remind_password.tpl.html");
xMailTxtHTMLDATA($row["Email"], EMAIL_FORGOT_PASSWORD_SUBJECT, $html);
return true;
}
else
return false;
}