ecshop积分系统修改小记(1)

2016-07-07 15:17 来源:www.chinab4c.com 作者:ecshop专家

ecshop积分系统修改小记

[iamstar]
[9441287@qq.com]

我用的是ecshop 2.51版本,在测试购物流程时发现积分根本无法赠送。也就是说,在
订单里明明说好赠送100个积分的,等整个购物流程结束后客户的积分一点也没有增加,很
多站长都只能通过手工增加解决这个问题。我搜索了一下,似乎2.60也有这个问题,这个
bug一直都没有妥善的修补。
自己动手,丰衣足食,下面我结合我自己的需求把程序的修改过程跟大家交流一下。
一、后台设置:
ecshop的积分分两种:等级积分和消费积分。
由于我个人只需要增加用户的等级积分,因此,在“商店设置”的“基本设置”里,我
将“积分换算比例”和“积分支付比例”都设置为0,在“购物流程”里,我还是启用了积分
,在“是否使用积分”里,我选择了“使用”。
在商品列表的后台设置里,将“积分购买额度”设置为0(不使用消费积分当钱用),然
后在“赠送积分数”里设置为-1(即赠送积分数跟价格一样)。
二、分析修改:
接下来我们要找到记录用户积分的数据库表字段。经查,用户数据表是ecs_users,在这
里,等级积分字段名是rank_points,消费积分是pay_points。由于我个人只需要增加用户的
等级积分,因此我只需让用户完成购物流程后将rank_points的积分递增上去。
这时,我们在提交订单时发现底部已经有提示,“该订单完成后”,可以获得多少多少的
积分,由于我们在后台已经设置了赠送积分数为-1,因此这个积分的数量是和货物的金额相等
的。用膝盖想想也知道,赠送的积分数在提交订单之后,必须要记录在数据库的订单表里,这
样用户确认收货之后,才有依据将积分加到ecs_users表的rank_points中。
经测试,订单表(ecs_order_info)中有integral和integral_money字段,我猜想他们分
别对应等级积分和消费积分(或者是用在此订单中的消费积分所折合的金额)。后来我发现,
提交订单后,订单里所承诺的赠送积分数并没有记录在integral字段里,因此我们要做的第一
件事情就是在提交订单时将承诺赠送积分数记录到ecs_order_info表的integral字段里。

1)改变用户欢迎页的积分含义。
在模板user_clips找到欢迎页的用户积分变量为{$info.integral},然后在user.php的
101行找到info是由函数get_user_default()赋值的。在/includes/lib_clips.php里的582行
我们搜索到这个函数,可以看到info.integral定义为pay_points,这不是我需要的,因此将
此行改为:
$info['integral']= $row['rank_points'] . $GLOBALS['_CFG']['integral_name'];
这样在用户欢迎页显示的积分就是等级积分而不是消费积分了。
2)寻找显示承诺积分的变量。
购物的整个流程都是flow.php,我们分析模板flow.dwt,积分变量在发现在它所调用的
Library/order_total.lbi里,打开此文件,我们找到了{$total.will_get_integral}这个
变量,这个就是提交订单前所承诺赠送的积分变量。
3)提交积分变量
有html经验的朋友都知道后台接收的post表单都在<form></form>里,因此我们找到提交
订单的form是在flow.dwt的700行处,可以找到一个</form>。我们在这个</from>上一行添加
一个html语句:
<input type="hidden" name="integral2" value="{$total.will_get_integral}" />
也就是说,我们可以把所找到的积分变量以post方式提交到后台处理。
4)后台处理
上一步完成了积分的提交,我们这里分析flow.php,找到了程序对integral的处理是在
1469行:
$order['integral'] = $total['integral'];
程序会把$order['integral']添加到ecs_order_info的integral字段里,可是测试过后
我们发现这里的值都为0,也不去深究,反正将我们提交上来的积分变量赋值给它就行。将
这一行注释掉(在语句前面加//),然后换成:
$order['integral'] = intval($_POST['integral2']);
做了这个更改之后,我们测试提交订单,可以发现integral字段里已经有积分数了。

5)增加用户积分
做了以上修改之后,我们正常确定、收款、配货、发货,最后就等用户的确认。我们要
在用户确认时增加用户积分。
我们可以找到用户确认的链接是user.php?act=affirm_received&order_id=xxx
继续跟踪,我们分析user.php文件,搜索affirm_received,找到处理确认的程序段大
约在1036行。顺藤摸瓜,找到affirm_received()函数所在的库文件/includes/lib_transaction.php
,在442行找到了affirm_received()函数。
在445行我们可以看到一个sql语句:
$sql = "SELECT user_id, order_sn , order_status, shipping_status, pay_status FROM
".$GLOBALS['ecs']->table('order_info') ." WHERE order_id = '$order_id'";
这是函数处理收货确认时读取的部分订单字段信息,我们发现没有integral,这很不够
意思。在pay_status字段后加上integral字段,那就可以一起读出来了,修改如下:

$sql = "SELECT user_id, order_sn , order_status, shipping_status, pay_status
, integral FROM ".$GLOBALS['ecs']->table('order_info') ." WHERE order_id = '$order_id'";
读取了订单信息之后,我们可以看到函数继续做了“检查订单是否属于该用户”以及“检
查订单”的处理,处理完毕后,我们找到了469行,这里将订单发货状态改为确认收货,我们
看看这一段:
$sql = "UPDATE " . $GLOBALS['ecs']->table('order_info') . " SET shipping_status = '"
. SS_RECEIVED . "' WHERE order_id = '$order_id'";
if ($GLOBALS['db']->query($sql))
{
/* 记录日志 */
order_action($order['order_sn'], $order['order_status'], SS_RECEIVED,
$order['pay_status'], '', $GLOBALS['_LANG']['buyer']);
return true;
}
else
{
die($GLOBALS['db']->errorMsg());
}

这一段是将订单发货状态改成确认收货,看到那个return true了吗?也就是说,如果这个
sql语句执行成功之后,函数将正确返回,否则提示数据库出错信息。到这里,还是跟我们积分
的增加无关,因此最重要的,我们要在这里加上我们自己的数据库操作,将之前读出来的
$order['integral']增加到integral字段里去。我们在return true的上一行加上我们自己的
语句,于是变成:
if ($GLOBALS['db']->query($sql))
{
/* 记录日志 */
order_action($order['order_sn'], $order['order_status'], SS_RECEIVED,
$order['pay_status'], '', $GLOBALS['_LANG']['buyer']);
//add by iamstar
$_LANG['order_gift_integral'] = '订单 %s 赠送的积分';
log_account_change($order['user_id'], 0, 0, $order['integral'], 0,
sprintf($_LANG['order_gift_integral'], $order['order_sn']));
return true;
}
else
{
die($GLOBALS['db']->errorMsg());
}
保存文件,然后上传,再测试购物流程,我们可以发现用户确认收货后,等级积分增加了
,让我们轻呼一声:oh yeah~

回答:
可以教教我我吗。联系我一下。QQ100100375