X-Cart: shopping cart software

X-Cart forums (https://forum.x-cart.com/index.php)
-   Dev Questions (https://forum.x-cart.com/forumdisplay.php?f=20)
-   -   Use E-mail address instead of username 3.5.x & 4.0 (https://forum.x-cart.com/showthread.php?t=8809)

issay 03-14-2005 11:47 PM

In this case, when customers register, can they still specify a username? Can we make the customers type the email address only since having username and email maybe a bit confusing.

B00MER 03-15-2005 07:34 AM

Yes, but you'll need to modify include/register.php to remove any username/password validation checks, along with removing the input fields from the register form.

mrbiggles 03-16-2005 01:38 AM

Hello
Just installed this on 4.11 and it works very nicely, thankyou.

x-light 03-22-2005 04:36 PM

use email rather username
 
Hello all,

As I am new to this forum, but not new to development work, I would like to share a token of my appreciation for all the great custom mods everyone has been sharing by contributing to a rather complete solution for this topic. Btw, thanks Boomer for starting this important topic. I have tested it with 4.0.12 only and so far everything seem to work well according to the features I have outlined below.

For security purpose, I will only post code here in this forum and it's rather long so bear with me. I will be busy the next couple days, but will try my best to answer to questions that you may have regarding to this mod. Enjoy :)

~x-light

-------------------------------------------------------------------------------------
Description: This mod allow all users customers, admins to use their email to register for an account and login instead of username. It modifies the register process to automatically generate an unique Id for the username during the registration process. If the user is anonymous, it resorts back to the default "anonymous+1"username X-Cart uses.

Key feature:
* checks for duplicate email during user registration or user profile updates and return appropriate errors.
* The user can also change their email at any time as long as their email has no duplicates.
* To avoid confusion, customers can only login using their email.
* If the user is an administrator, he/she can login using either their username or email.
* During an anonymous checkout, anonymous users can use same email to register again since register will drop previous anonymous user's record with the same email. This should be ok since the orders table is not affected and anonymous user aren't really suppose to login-in in the first place. However, anonymous user that happen to request a email which has already been used by a registered user will be denied. Please see comment in include/register.php starting with "# delete this record since the user is anonymous requesting the same email" for detailed explanation.

Modified for X-Cart Gold: Version 4.0.12 stock

Tested with: Version 4.0.12 stock
Apache 1.33, OpenSSL 0.9.6b, PHP 4.3.10, SQL 4.0.22

Intended Audience: This mod requires changes to various php, tpl files and some sql table(s) as well as outlined in "General Overview" below. If you are a store owner and have met the requirements for the modified and tested X-Cart versions, you can follow the instructions below and it should work. However, if you intend to make this mod work with previous X-Cart versions or make any changes to this mod, it is recommended that you hire a developer with development and coding knowledge to perform this task.

Disclaimer: This mod may work on other X-Cart versions, but it has not been tested. Therefore, use it at your own risk. We are not responsible for any loss in sales, time spent or damages that is direct or indirectly caused by this modification to your store. By using this modification, you have agreed all the terms to the license agreement and hold all personel indemfiable and harmless including but not limited to owners, shareholders, stakeholders, employees, contractors, or anyone else related to the business.

License: None/Freeware

As usual, always backup your current store or try it on a development store before integrating this with production.

General Overview:

files modified application logic related:
sql table modification
xcart_customers
files modified application logic related:
include/login.php
include/register.php
frontend gui related:
register.php include/check_useraccount.php
skin1/customer/main/register.tpl skin1/main/register_account.tpl
skin1/main/register_contact_info.tpl skin1/main/orders_list.tpl

each code section which has been modified has the comment header:
mod.use.email.rather.username

Instructions:

Prerequisites:
BACKUP, BACKUP, BACKUP!!
make sure no duplicate email exist in xcart_customers table also
make sure email field is active and required for admin and customers.
Also, remember that customers can only login using their emails once this mod is added.

Installation:

1. update sql table using ssh or sql patch from admin menu
If using ssh, issue command:
"mysql -u username -p dbname < update_tables.sql"
If using sql patch just use the command
"ALTER TABLE xcart_customers ADD UNIQUE (email);"

2. modify code
a. match the code section under the "find original code snippet" and "end original code snippet" with your source
b. replace original code section with the code section under the "replace modified code snippet"

3. repeat step 2 for each php and template files until all are done

-------------------------------------------------------------------------------------
file: update_tables.sql v1
Code:

# this script will make the following field(s) unique to avoid duplication

# table(s) affected
# xcart_customers

# field(s) affected
# email

ALTER TABLE xcart_customers ADD UNIQUE (email);

-------------------------------------------------------------------------------------
file: register.php v1
Code:

# find original code snippet
if ($REQUEST_METHOD == "POST" && $action == "cart") {

        if (empty($reg_error))
                func_header_location("cart.php?mode=checkout&paymentid=$paymentid");
}

$smarty->assign("login",$login);
# end original code snippet

# replace modified code snippet
if ($REQUEST_METHOD == "POST" && $action == "cart") {

        if (empty($reg_error))
                func_header_location("cart.php?mode=checkout&paymentid=$paymentid");
}

# mod.use.email.rather.username
$smarty->assign("login", func_query_first_cell("select email from $sql_tbl[customers] where login='$login'"));
# end modified code snippet

-------------------------------------------------------------------------------------
file: include/check_useraccount.php v1
Code:

# find original code snippet
$smarty->assign("login",$login);
$smarty->assign("usertype",$current_area);
# end original code snippet

# replace modified code snippet
# mod.use.email.rather.username
$smarty->assign("login", func_query_first_cell("select email from $sql_tbl[customers] where login='$login'"));
$smarty->assign("usertype",$current_area);
# end modified code snippet

-------------------------------------------------------------------------------------
file: include/login.php v1
Code:

# mod1
# find original code snippet
switch ($redirect) {
        case "admin":
                $redirect_to = DIR_ADMIN;
                break;
        case "provider":
                $redirect_to = DIR_PROVIDER;
                break;
        case "partner":
                $redirect_to = DIR_PARTNER;
                break;
        case "customer":
        default:
                $redirect_to = DIR_CUSTOMER;
}
# end original code snippet

# replace modified code snippet
switch ($redirect) {
        case "admin":
                $redirect_to = DIR_ADMIN;
# mod.use.email.rather.username
        $c_area = 'A';
                break;
        case "provider":
                $redirect_to = DIR_PROVIDER;
                break;
        case "partner":
                $redirect_to = DIR_PARTNER;
                break;
        case "customer":
        default:
                $redirect_to = DIR_CUSTOMER;
}
# end modified code snippet


# mod2
# find original code snippet
if ($REQUEST_METHOD == "POST") {
        $intershipper_recalc = "Y";
        if ($mode == "login") {

                $username = $HTTP_POST_VARS["username"];
                $password = $HTTP_POST_VARS["password"];

        $user_data = func_query_first("SELECT * FROM $sql_tbl[customers] WHERE email='$username' AND usertype='$usertype' AND status='Y'");
# end original code snippet

# replace modified code snippet
if ($REQUEST_METHOD == "POST") {
        $intershipper_recalc = "Y";
        if ($mode == "login") {

                $username = $HTTP_POST_VARS["username"];
                $password = $HTTP_POST_VARS["password"];

# mod.use.email.rather.username
# exception if current area is admin, use username or email instead
    if( $c_area == 'A' ) {
        $c_area = '';
                $user_data = func_query_first("SELECT * FROM $sql_tbl[customers] WHERE (login='$username' OR email='$username') AND usertype='$usertype' AND status='Y'");
    }
    else
        $user_data = func_query_first("SELECT * FROM $sql_tbl[customers] WHERE email='$username' AND usertype='$usertype' AND status='Y'");
# end modified code snippet

-------------------------------------------------------------------------------------
file: include/register.php v1
Code:

# mod1
# find original code snippet
#
# User registration info passed to register.php via POST method
#
        $existing_user = func_query_first("select password, email from $sql_tbl[customers] where login='$uname'");
        if (empty($existing_user)) {
                $existing_user = func_query_first("SELECT login FROM $sql_tbl[orders] WHERE login='$uname'");
    }
# end original code snippet

# replace modified code snippet
#
# User registration info passed to register.php via POST method
#
        $existing_user = func_query_first("select password, email from $sql_tbl[customers] where login='$uname'");
        if (empty($existing_user)) {
                $existing_user = func_query_first("SELECT login FROM $sql_tbl[orders] WHERE login='$uname'");

# mod.use.email.rather.username
# generate unique id number as username since email is used as unique key in customers and order table
# only for non-anonymous users
        if( !$anonymous_user ){
            for( $i=0; $i<3; $i++ ){
                $u_tmp = uniqid(rand());
                if( $login != $u_tmp )
                    break;
            }
            $uname = $u_tmp;
        }
    }
# end modified code snippet


# mod2
# find original code snippet
                foreach($default_fields as $k => $v) {
                        if($v['required'] == 'Y' && empty($$k) && $v['avail'] == 'Y') {
                                if(($k == "b_county" || $k == 's_county')) {
                                        if($config["General"]["use_counties"] == "Y") {
                                                $fillerror = true;
                                                break;
                                        }
                                } elseif($k != 'b_state' && $k != 's_state') {
                                        $fillerror = true;
                                        break;
                                } elseif($k == 's_state' && func_query_first_cell("SELECT display_states FROM $sql_tbl[countries] WHERE code = '$s_country'") == 'Y') {
                                        $fillerror = true;
                                        break;
                                } elseif($k == 'b_state' && func_query_first_cell("SELECT display_states FROM $sql_tbl[countries] WHERE code = '$b_country'") == 'Y') {
                                        $fillerror = true;
                                        break;
                                }
                        }
                }
# end original code snippet

# replace modified code snippet
                foreach($default_fields as $k => $v) {
                        if($v['required'] == 'Y' && empty($$k) && $v['avail'] == 'Y') {
                                if(($k == "b_county" || $k == 's_county')) {
                                        if($config["General"]["use_counties"] == "Y") {
                                                $fillerror = true;
                                                break;
                                        }
                                } elseif($k != 'b_state' && $k != 's_state') {
                                        $fillerror = true;
                                        break;
                                } elseif($k == 's_state' && func_query_first_cell("SELECT display_states FROM $sql_tbl[countries] WHERE code = '$s_country'") == 'Y') {
                                        $fillerror = true;
                                        break;
                                } elseif($k == 'b_state' && func_query_first_cell("SELECT display_states FROM $sql_tbl[countries] WHERE code = '$b_country'") == 'Y') {
                                        $fillerror = true;
                                        break;
                                }
                        }
                }

# mod.use.email.rather.username
# check if email already exist in customers table
        if( $email == func_query_first_cell("select email from $sql_tbl[customers] where email='$email'")) {
                # duplicate email not allowed
                $eerror = true;
        }

# exception checks to this rule
        if( $mode != "update") {
            # check if this is anonymous registration during checkout
            if( $eerror && func_query_first_cell("select status from $sql_tbl[customers] where email='$email' and usertype='C'") == 'A' ) {
                # delete this record since the user is anonymous requesting the same email
                # we can't assume that the email belongs to the user, but at least this way
                # the original user can use his/her same email to register again anonymously during another checkout
                # if an anonymous user already placed an order with this email, it will not effect the orders table
                # since it is a seperate record
                # note, if the user is already registered, we will never allow to automatically delete the registered user's record
                db_query("DELETE FROM $sql_tbl[customers] WHERE login LIKE 'anonymous%' AND email='$email' and usertype='C' AND status='A'");
                # this is not an error since we have deleted this record
                $eerror = false;
            }
        }
        else {
            if( $email == func_query_first_cell("select email from $sql_tbl[customers] where login='$login' and email='$email'")) {
                # email match, user did not change email
                $eupdate = false;
                # this is not an error since the existing email belong to this user
                $eerror = false;
            }
            else {
                # email does not match, see if new requested email is taken
                if( !$eerror )
                    $eupdate = true;
            }
        }
# end modified code snippet

# mod3
# find original code snippet
#
# Update/Insert user info
#

                if ($mode=="update") {
                        $intershipper_recalc = "Y";
                db_query("UPDATE $sql_tbl[customers] SET password='$crypted', password_hint='$password_hint', password_hint_answer='$password_hint_answer', title='$title', firstname='$firstname', lastname='$lastname', company='$company', b_address='".$b_address."\n".$b_address_2."', b_city='$b_city', b_county='".(@$b_county)."', b_state='$b_state', b_country='$b_country', b_zipcode='$b_zipcode', s_address='".$s_address."\n".$s_address_2."', s_city='$s_city', s_county='".(@$s_county)."', s_state='$s_state', s_country='$s_country', s_zipcode='$s_zipcode', phone='$phone', email='$email', fax='$fax', url='$url', card_name='$card_name', card_type='$card_type', card_number='".addslashes(text_crypt($card_number))."', card_expire='$card_expire', card_cvv2='$card_cvv2', pending_membership='$pending_membership', ssn='$ssn', change_password='$change_password', parent = '$parent', pending_plan_id = '$pending_plan_id' WHERE login='$login' AND usertype='$login_type'");
# end original code snippet

# replace modified code snippet
#
# Update/Insert user info
#

                if ($mode=="update") {
                        $intershipper_recalc = "Y";

# mod.use.email.rather.username
# update email only if eupdate is true
            if( !$eupdate )
                db_query("UPDATE $sql_tbl[customers] SET password='$crypted', password_hint='$password_hint', password_hint_answer='$password_hint_answer', title='$title', firstname='$firstname', lastname='$lastname', company='$company', b_address='".$b_address."\n".$b_address_2."', b_city='$b_city', b_county='".(@$b_county)."', b_state='$b_state', b_country='$b_country', b_zipcode='$b_zipcode', s_address='".$s_address."\n".$s_address_2."', s_city='$s_city', s_county='".(@$s_county)."', s_state='$s_state', s_country='$s_country', s_zipcode='$s_zipcode', phone='$phone', fax='$fax', url='$url', card_name='$card_name', card_type='$card_type', card_number='".addslashes(text_crypt($card_number))."', card_expire='$card_expire', card_cvv2='$card_cvv2', pending_membership='$pending_membership', ssn='$ssn', change_password='$change_password', parent = '$parent', pending_plan_id = '$pending_plan_id' WHERE login='$login' AND usertype='$login_type'");
            else
                db_query("UPDATE $sql_tbl[customers] SET password='$crypted', password_hint='$password_hint', password_hint_answer='$password_hint_answer', title='$title', firstname='$firstname', lastname='$lastname', company='$company', b_address='".$b_address."\n".$b_address_2."', b_city='$b_city', b_county='".(@$b_county)."', b_state='$b_state', b_country='$b_country', b_zipcode='$b_zipcode', s_address='".$s_address."\n".$s_address_2."', s_city='$s_city', s_county='".(@$s_county)."', s_state='$s_state', s_country='$s_country', s_zipcode='$s_zipcode', phone='$phone', email='$email', fax='$fax', url='$url', card_name='$card_name', card_type='$card_type', card_number='".addslashes(text_crypt($card_number))."', card_expire='$card_expire', card_cvv2='$card_cvv2', pending_membership='$pending_membership', ssn='$ssn', change_password='$change_password', parent = '$parent', pending_plan_id = '$pending_plan_id' WHERE login='$login' AND usertype='$login_type'");
# end modified code snippet

-------------------------------------------------------------------------------------
file: skin1/customer/main/register.tpl v1
Code:

{* find original code snippet *}
{include file="main/register_account.tpl" userinfo=$userinfo}
{* end original code snippet *}

{* replace modified code snippet *}
{* mod.use.email.rather.username, include register_account.tpl if not using anonymous checkout *}
{if not ($anonymous ne "" and $config.General.disable_anonymous_checkout ne "Y")}
{include file="main/register_account.tpl" userinfo=$userinfo}
{/if}
{* end modified code snippet *}

-------------------------------------------------------------------------------------
file: skin1/main/orders_list.tpl v1
Code:

{* find original code snippet *}
<TD>{$orders[oid].firstname} {$orders[oid].lastname} ({$orders[oid].login})</TD>
{* end original code snippet *}

{* replace modified code snippet *}
{* mod.use.emai.rather.username *}
<TD>{$orders[oid].firstname} {$orders[oid].lastname} ({$orders[oid].email})</TD>
{* end modified code snippet *}

-------------------------------------------------------------------------------------
file: skin1/main/register_account.tpl v1
Code:

{* mod1 *}
{* find original code snippet *}
{* Anonymous account *}

<TR>
<TD colspan="3">{$lng.txt_anonymous_account_msg}</TD>
</TR>

<TR>
<TD align="right">{$lng.lbl_username}</TD>
<TD></TD>
<TD nowrap>
<INPUT type="text" name="uname" size="32" maxlength="32" value="{$userinfo.login}">
</TD>
</TR>
{* end original code snippet *}

{* replace modified code snippet *}
{* Anonymous account *}

<TR>
<TD colspan="3">{$lng.txt_anonymous_account_msg}</TD>
</TR>

{* mod.use.email.rather.username, show email for username instead *}
{if $default_fields.email.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_email}</TD>
<TD>{if $default_fields.email.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="email" name="email" size="32" maxlength="128" value="{$userinfo.email}">
{if $emailerror ne "" or ($reg_error ne "" and $userinfo.email eq "" and $default_fields.email.required eq 'Y')}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}

{* mod.use.email.rather.username, disable this since no need to show username *}
{if 0}
<TR>
<TD align="right">{$lng.lbl_username}</TD>
<TD></TD>
<TD nowrap>
<INPUT type="text" name="uname" size="32" maxlength="32" value="{$userinfo.login}">
</TD>
</TR>
{/if}
{* end modified code snippet *}



{* mod2 *}
{* find original code snippet *}
{* NOT anonymous account *}

<TR>
<TD align="right">{$lng.lbl_username}</TD>
<TD class="Star">*</TD>
<TD nowrap>
{if $userinfo.login ne "" || ($login eq $userinfo.uname && $login ne '')}
{$userinfo.login|default:$userinfo.uname}
<INPUT type="hidden" name="uname" value="{$userinfo.login|default:$userinfo.uname}">
{else}
<INPUT type="text" id="uname" name="uname" size="32" maxlength="32" value="{if $userinfo.uname}{$userinfo.uname}{else}{$userinfo.login}{/if}">
{if ($reg_error ne "" and $userinfo.uname eq "" and $userinfo.login eq "") or $reg_error eq "U"}<FONT class="Star">&lt;&lt;</FONT>{/if}
{/if}
</TD>
</TR>

<TR>
<TD align="right">{$lng.lbl_password}</TD>
<TD><FONT class="Star">*</FONT></TD>
<TD nowrap><INPUT type="password" id="passwd1" name="passwd1" size="32" maxlength="32" value="{$userinfo.passwd1}">
{if $reg_error ne "" and $userinfo.passwd1 eq ""}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{* end original code snippet *}

{* replace modified code snippet *}
{* NOT anonymous account *}

{* mod.use.email.rather.username, show email for username instead *}
{if $default_fields.email.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_email}</TD>
<TD>{if $default_fields.email.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="email" name="email" size="32" maxlength="128" value="{$userinfo.email}">
{if $emailerror ne "" or ($reg_error ne "" and $userinfo.email eq "" and $default_fields.email.required eq 'Y')}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}

{* mod.use.email.rather.username, disable this since no need to show username *}
{if 0}
<TR>
<TD align="right">{$lng.lbl_username}</TD>
<TD class="Star">*</TD>
<TD nowrap>
{if $userinfo.login ne "" || ($login eq $userinfo.uname && $login ne '')}
{$userinfo.login|default:$userinfo.uname}
<INPUT type="hidden" name="uname" value="{$userinfo.login|default:$userinfo.uname}">
{else}
<INPUT type="text" id="uname" name="uname" size="32" maxlength="32" value="{if $userinfo.uname}{$userinfo.uname}{else}{$userinfo.login}{/if}">
{if ($reg_error ne "" and $userinfo.uname eq "" and $userinfo.login eq "") or $reg_error eq "U"}<FONT class="Star">&lt;&lt;</FONT>{/if}
{/if}
</TD>
</TR>
{/if}

{* mod.use.email.rather.username, output hidden username for include/register.php verification *}
<INPUT type="hidden" name="uname" value="{$userinfo.login|default:$userinfo.uname}">

<TR>
<TD align="right">{$lng.lbl_password}</TD>
<TD><FONT class="Star">*</FONT></TD>
<TD nowrap><INPUT type="password" id="passwd1" name="passwd1" size="32" maxlength="32" value="{$userinfo.passwd1}">
{if $reg_error ne "" and $userinfo.passwd1 eq ""}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{* end modified code snippet *}

-------------------------------------------------------------------------------------
file: skin1/main/register_contact_info.tpl v1
Code:

{* find original code snippet *}
{if $default_fields.phone.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_phone}</TD>
<TD>{if $default_fields.phone.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="phone" name="phone" size="32" maxlength="32" value="{$userinfo.phone}">
{if $reg_error ne "" and $userinfo.phone eq "" and $default_fields.phone.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}

{if $default_fields.email.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_email}</TD>
<TD>{if $default_fields.email.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="email" name="email" size="32" maxlength="128" value="{$userinfo.email}">
{if $emailerror ne "" or ($reg_error ne "" and $userinfo.email eq "" and $default_fields.email.required eq 'Y')}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}

{if $default_fields.fax.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_fax}</TD>
<TD>{if $default_fields.fax.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="fax" name="fax" size="32" maxlength="128" value="{$userinfo.fax}">
{if $reg_error ne "" and $userinfo.fax eq "" and $default_fields.fax.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{if $default_fields.url.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_web_site}</TD>
<TD>{if $default_fields.url.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="url" name="url" size="32" maxlength="128" value="{$userinfo.url}">
{if $reg_error ne "" and $userinfo.url eq "" and $default_fields.url.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{include file="main/register_additional_info.tpl" section="C"}
{/if}
{* end original code snippet *}




{* replace modified code snippet *}
{* mod.use.email.rather.username, added a section suitable for anonymous accounts *}
{if $anonymous ne "" and $config.General.disable_anonymous_checkout ne "Y"}

{* Anonymous account *}

{if $default_fields.phone.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_phone}</TD>
<TD>{if $default_fields.phone.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="phone" name="phone" size="32" maxlength="32" value="{$userinfo.phone}">
{if $reg_error ne "" and $userinfo.phone eq "" and $default_fields.phone.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>

{if $default_fields.email.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_email}</TD>
<TD>{if $default_fields.email.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="email" name="email" size="32" maxlength="128" value="{$userinfo.email}">
{if $emailerror ne "" or ($reg_error ne "" and $userinfo.email eq "" and $default_fields.email.required eq 'Y')}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}

{if $default_fields.fax.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_fax}</TD>
<TD>{if $default_fields.fax.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="fax" name="fax" size="32" maxlength="128" value="{$userinfo.fax}">
{if $reg_error ne "" and $userinfo.fax eq "" and $default_fields.fax.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{if $default_fields.url.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_web_site}</TD>
<TD>{if $default_fields.url.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="url" name="url" size="32" maxlength="128" value="{$userinfo.url}">
{if $reg_error ne "" and $userinfo.url eq "" and $default_fields.url.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{include file="main/register_additional_info.tpl" section="C"}
{/if}

{* /Anonymous account *}

{else}

{* NOT anonymous account *}

{if $default_fields.phone.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_phone}</TD>
<TD>{if $default_fields.phone.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="phone" name="phone" size="32" maxlength="32" value="{$userinfo.phone}">
{if $reg_error ne "" and $userinfo.phone eq "" and $default_fields.phone.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}

{* mod.use.email.rather.username, disable this and move to register_account.tpl *}
{if 0}
{if $default_fields.email.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_email}</TD>
<TD>{if $default_fields.email.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="email" name="email" size="32" maxlength="128" value="{$userinfo.email}">
{if $emailerror ne "" or ($reg_error ne "" and $userinfo.email eq "" and $default_fields.email.required eq 'Y')}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{/if}

{if $default_fields.fax.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_fax}</TD>
<TD>{if $default_fields.fax.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="fax" name="fax" size="32" maxlength="128" value="{$userinfo.fax}">
{if $reg_error ne "" and $userinfo.fax eq "" and $default_fields.fax.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{if $default_fields.url.avail eq 'Y'}
<TR>
<TD align="right">{$lng.lbl_web_site}</TD>
<TD>{if $default_fields.url.required eq 'Y'}<FONT class="Star">*</FONT>{else}{/if}</TD>
<TD nowrap>
<INPUT type="text" id="url" name="url" size="32" maxlength="128" value="{$userinfo.url}">
{if $reg_error ne "" and $userinfo.url eq "" and $default_fields.url.required eq 'Y'}<FONT class="Star">&lt;&lt;</FONT>{/if}
</TD>
</TR>
{/if}
{include file="main/register_additional_info.tpl" section="C"}
{/if}

{/if}
{* end modified code snippet *}


mustang 03-25-2005 07:27 AM

I'd love to only allow users to use the email address in place of their username. It makes things much simpler for them.

My only problem is with the phone orders that are received. I'd like to allow either anonymous checkout or username checkout for these orders, since many of these people do not have email addresses. Maybe even use their telephone number as the username for these orders!

Any ideas on how this should be done??

Thanks.

x-light 03-25-2005 05:38 PM

Hi Mustang,

Quote:

My only problem is with the phone orders that are received. I'd like to allow either anonymous checkout or username checkout for these orders, since many of these people do not have email addresses. Maybe even use their telephone number as the username for these orders!

So what you are saying is that people without email addresses uses their phone as primary contact? If that is the case, you don't need this mod. I wouldn't recommend using their telephone number as the username as people's number do change. To X-Cart, the username is the primary and unique key so you don't want to change that very often if possible.

However, if you want to still use email without the username with customers , you can make a small adjustment to the login procedure to allow customers to login from email (for your email customers) or phone instead (for your phone customers). In registration, you may want to add a check to see if the customer enters a phone, then email is not necessary as a required field or vs. versa. I would still keep the username hidden and use the system to generate a unique id so not to confuse the customer. Let me know if this helps.

~x-light

x-light 03-25-2005 10:19 PM

minor update (forcing all emails to lowercase)
 
I forgot a minor detail where the code will allow duplicate email address thus cause an duplicate entry error in mysql since the email tests do not check for case sensitivity. The problem can be easily fixed by forcing all email address entries either at initial registration or profile updates to lowercase. Here is what you need to change.

file: include/register.php v1

find this section of code

Code:

# mod.use.email.rather.username
# check if email already exist in customers table     
        if( $email == func_query_first_cell("select email from $sql_tbl[customers] where email='$email'")) {
                # duplicate email not allowed
                $eerror = true;
        }


and replace with

Code:

# mod.use.email.rather.username
# check if email already exist in customers table
        $email = strtolower($email);
        if( $email == func_query_first_cell("select email from $sql_tbl[customers] where email='$email'")) {
                # duplicate email not allowed
                $eerror = true;
        }


~x-light

sportruck 03-31-2005 02:13 PM

Awesome, I got this mod working. Thanks for posting. There are a few places you need to modify different files and messages to make it consistent. Such as the emails (so users don't see their random username), password recovery, and login sections.

2019 04-01-2005 01:52 AM

rated 99/100
keep up the good work
thnx!

x-light 04-01-2005 02:07 PM

Quote:

Awesome, I got this mod working. Thanks for posting. There are a few places you need to modify different files and messages to make it consistent. Such as the emails (so users don't see their random username), password recovery, and login sections.

Your welcome. Humm, I thought I already did that for login. However, if you have already made changes to the emails and password recovery section, please post the changes. I am quite busy working on other mods and may not be able to get back to this one right away. Thanks for pointing this out, see this is what's so great about this forum. Very informative feedbacks.


Quote:

rated 99/100
keep up the good work
thnx!

Hi, thanks for the feedback. I appreciate it. I will be posting a few more useful mods in the near future. Currently I am working on a mod that validates fields for registration on the server side. I looked for this everywhere in the forum and couldn't find it. So, I will write my own. I will post this mod soon as it is very important to validate your customer information before you send it to the sql db.

~x-light


All times are GMT -8. The time now is 09:38 PM.

Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.