ecshop邮箱登录

由于,ecshop中本身注册时就有邮箱唯一的验证,同时用户名中也不能包含@符号。

所以,只需要考虑控制登录的login方法(public_htm/includes/modules/integrates/integrate.php中)。

在该方法中增加如下代码

function login($username, $password, $remember = null)
{
 if(is_email($username)) 
 { 
	$sql = "select ".$this->field_name." 
 from ".$this->table($this->user_table)." 
 where ".$this->field_email."="".$username."""; 
	$username = $this->db->getOne($sql); 
	if(!$username)
	  return false; 
 } 
 if ($this->check_user($username, $password) > 0)
 {
 if ($this->need_sync)
 {
 $this->sync($username,$password);
 }
 $this->set_session($username);
 $this->set_cookie($username, $remember);

 return true;
 }
 else
 {
 return false;
 }
}

其中用到了include/lib_common.php文件中的is_email()方法

function is_email($user_email)
{
 $chars = "/^([a-z0-9 _]|\\-|\\.) @(([a-z0-9_]|\\-) \\.) [a-z]{2,6}\$/i";
 //通过strpos()函数判断传入字符串是否包含@与.
 if (strpos($user_email, "@") !== false && strpos($user_email, ".") !== false)
 {
 if (preg_match($chars, $user_email))
 {
 return true;
 }
 else
 {
 return false;
 }
 }
 else
 {
 return false;
 }
}

也就是说先判断提交过来的$username是否为邮箱,如果是就去数据库里取相应的username,取到username以后继续执行原来的方法就可以了。如果邮箱在数据库中不存在就返回false。

ecshop URL简单重写

大概在网上调查了一下,ecshop的URL重写主要是为了SEO搜索引擎优化使用。

而简单重写基本就可以满足伪静态的处理需求,ECSHOP v2.7.2,操作步骤如下:

1 打开httpd.conf文件中LoadModule rewrite_module注释。

2 将 ecshop 目录下的htaccess.txt 重命名为 .htaccess。

3 去掉.htaccess文件中RewriteBase /前注释。

4 如修改了httpd.conf文件,则需要重启Apache。

5 进入 ecshop 管理中心->商店设置,将 URL 重写设置为启用。

ecshop 保存用户购物车数据

ecshop的购物车记录储存在cart表中,用户向购物车中添加商品时会在其中产生一条记录

靠session_id与用户产生映射关系。当注册用户退出登录或者游客关闭浏览器时,session被销毁,同时删除掉cart表中与之对应的记录。所以ecshop的购物车功能,无法在用户下次登录时记录之前的购物车信息。这在某些场景,如用户误关掉浏览器时十分不方便。
为了解决这个问题,首先要在用户登录时,将他以户已游客身份,产生的购物车数据加上user_id。
然后要将该用户的历史购物车记录中的session_id改为本次的session_id。
最后要在用户退出登录时,保存住注册用户在cart表中的购物车记录。
 
具体实现方法:
一、在includes/lib_main.php
中定义如下方法并在update_user_info()方法中的末尾处执行
/**
* 用户登陆后,载入上一次退出时的购物车信息,并与此次登录前购物车信息合并
*
* @access  public
* @return  void
*/
function merge_cart_history()
{
if (!$_SESSION[“user_id”])
{
return false;
}
$sql = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set user_id = ” . $_SESSION[“user_id”] . ” where session_id = “”.SESS_ID.”””;//为用户以游客身份时(登录之前),产生的购物车记录添加user_id
$GLOBALS[“db”]->query($sql);

 $sql1 = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set session_id =”” . SESS_ID . “” where user_id = “” . $_SESSION[“user_id”] . “””;//将用户历史购物车记录的session_id,改为本次的session_id
$GLOBALS[“db”]->query($sql1);
$re = $GLOBALS[“db”]->getAll(“select goods_id, rec_id, sum(goods_number) as goods_number from ” . $GLOBALS[“ecs”]->table(“cart”) . ” where user_id = “{$_SESSION[“user_id”]}” and session_id = “”.SESS_ID.”” group by goods_id”);//汇总历史购物记录与本次购物记录中,每一种商品的数量
if($re){
foreach ($re as $k => $v)
{
$sql = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set goods_number = ” . $v[“goods_number”] . ” where rec_id = ” . $v[“rec_id”];
$GLOBALS[“db”]->query($sql); //每种商品保留一条记录

$sql = “delete from ” . $GLOBALS[“ecs”]->table(“cart”) . ” where rec_id <> {$v[“rec_id”]} and user_id = “{$_SESSION[“user_id”]}” and session_id = “” . SESS_ID . “” and goods_id = ” . $v[“goods_id”];//删除多余的记录
$GLOBALS[“db”]->query($sql);
}
}
}

二、将includes/cls_session.php中的destroy_session()方法做如下修改:

将$this->db->query(“DELETE FROM ” . $GLOBALS[“ecs”]->table(“cart”) . ” WHERE session_id = “$this->session_id””);

改为$this->db->query(“DELETE FROM ” . $GLOBALS[“ecs”]->table(“cart”) . ” WHERE session_id = “$this->session_id” AND `user_id`=0″);

既销毁当销毁session时,只将cart表中user_id等于0(未登录用户)的购物车记录删除。

改完收工。

 

12