ecshop促销中使用红包激励用户购物,要想炒热活动,红包就需要有物以稀为贵的感觉。有人求有人送,这样红包之间的转赠有助于拉动第二梯队的顾客。但是如果已经把红包添加到自己的账户了怎么办?如果ecshop红包的使用再加上什么限制(比如,一个单只能用一个红包,就够坑爹的),现在来做一个线上转赠红包的功能。
最模板简单的实现一下:
首先了解,红包存放在ecs_user_bonus表中,他的归属区分很简单:通过user_id来决定红包属于谁的。
此功能涉及到四个文件:/js/user.js 、  /user.php、 /includes/lib_transaction.php 、 /themes/default/user_transaction.dwt
第一步:增加模板功能
在/themes/default/user_transaction.dwt中 {$item.status}后面添加
1 | 
<!--{if $item.status == "未使用"}--><form action="/user.php"name="handsel_bonus_{$item.bonus_id}" method="post" onsubmit="return handsel_bonus_to_user(this)"><input type="hidden" name="act" value="handsel_bonus"><input type="hidden" name="bonus_id" value="{$item.bonus_id}"><input type="hidden"name="user_name" value=""><input class="btn_bom" type="submit" value="转赠"></form><!--{/if}--> | 
 
 
 
代码,然后再增加点按钮的修饰
1 | 
.btn_bom{padding:5px 10px; cursor:pointer;} | 
 
 
 
,
这里作用是给处于未被使用状态的红包添加转赠按钮,这里未使用状态直接用文本判断,因为在模板赋值之前已经有过逻辑处理,另外我们转增过程中也会有相应的逻辑处理,因此不会出现bug,真的想完善,又有闲心的可以用语言包代替 本人一向鄙视多语言效果如下

第二步,前端交互增加表单验证
转赠信息提交的表单已经创建,现在需要做验证等相关工作,在/js/user.js中增加
4 | 
function handsel_bonus_to_user(obj){ | 
 
5 | 
    var username = prompt("输入你要转赠红包的账户名",""); | 
 
7 | 
    if (username == null){return false;} | 
 
8 | 
    if (username.length == 0) | 
 
10 | 
    msg += "用户名不能为空" + '\n'; | 
 
12 | 
  else if (username.match(/^\s*$|^c:\\con\\con$|[%,\'\*\"\s\t\<\>\&\\]/)) | 
 
14 | 
    msg += '用户名不合法' + '\n'; | 
 
16 | 
  else if (username.length < 3) | 
 
18 | 
    msg += '用户名不合法' + '\n'; | 
 
20 | 
    obj.user_name.value = username; | 
 
 
 
代码,采用模式窗口接收数据
第三步:接收数据并处理
这一步开始就是核心功能方面的了,在/user.php中增加
2 | 
elseif( $action == 'handsel_bonus'){ | 
 
4 | 
     include_once(ROOT_PATH .'includes/lib_transaction.php'); | 
 
5 | 
     if(isset($_REQUEST['bonus_id'])){ | 
 
6 | 
        $bonus_id = (int)$_REQUEST['bonus_id']; | 
 
7 | 
        if(handsel_bonus_to_user($user_id, $bonus_id, $_REQUEST['user_name'])){ | 
 
9 | 
               show_message("成功转赠红包给".$_REQUEST['user_name'],$_LANG['back_up_page'], 'user.php?act=bonus', 'info'); | 
 
11 | 
             $err->show($_LANG['back_up_page'], 'user.php?act=bonus'); | 
 
15 | 
          show_message("请指明要操作的红包".$_REQUEST['user_name'], '/user.php?act=bonus'); | 
 
 
 
逻辑代码
第四部:操作数据库,
创建最重要的handsel_bonus_to_user函数,在/includes/lib_transaction.php文件增加函数代码
2 | 
 *  当前用户给指定用户赠送一个指定红包,红包会立即转向对方账号 | 
 
5 | 
 * @param   int         $user_id        用户ID | 
 
6 | 
 * @param   string      $bouns_sn       红包序列号 | 
 
7 | 
 * @param   string      $to_user_name       红包序列号接受赠送红包的用户 | 
 
9 | 
 * @return  boolen      $result | 
 
11 | 
function handsel_bonus_to_user($user_id, $bonus_id, $to_user_name) | 
 
15 | 
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_login']); | 
 
21 | 
    $sql = "SELECT bonus_id,user_id,order_id,bonus_type_id FROM " .$GLOBALS['ecs']->table('user_bonus') . | 
 
22 | 
           " WHERE bonus_id = '$bonus_id'"; | 
 
23 | 
    $row = $GLOBALS['db']->getRow($sql); | 
 
27 | 
        if ($row['order_id'] == 0) | 
 
31 | 
            if($user_id != $row['user_id']){ | 
 
32 | 
                $GLOBALS['err']->add('soga,你不拥有此红包'); | 
 
36 | 
            $sql = "SELECT send_end_date, use_end_date ". | 
 
37 | 
                   " FROM " . $GLOBALS['ecs']->table('bonus_type') . | 
 
38 | 
                   " WHERE type_id = '" . $row['bonus_type_id'] . "'"; | 
 
40 | 
            $bonus_time = $GLOBALS['db']->getRow($sql); | 
 
45 | 
            if ($now > $bonus_time['use_end_date']) | 
 
47 | 
                $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_use_expire']); | 
 
51 | 
            $sql = "select user_id from " . $GLOBALS['ecs']->table('users') ." where user_name='$to_user_name'"; | 
 
52 | 
            $user = $GLOBALS['db']->getRow($sql); | 
 
54 | 
                $GLOBALS['err']->add('转赠的用户不存在,谢谢好心:)请重新确认用户名!'); | 
 
58 | 
$sql = "UPDATE " .$GLOBALS['ecs']->table('user_bonus') . " SET user_id = '".$user['user_id']."'  WHERE bonus_id = '$row[bonus_id]'"; | 
 
59 | 
            $result = $GLOBALS['db'] ->query($sql); | 
 
66 | 
                return $GLOBALS['db']->errorMsg(); | 
 
72 | 
            $GLOBALS['err']->add('红包已用来购物,不可再次使用'); | 
 
79 | 
        $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_not_exist']); | 
 
 
 
这样,ecshop商城用户之间就可以互相转赠红包了
												
												
								- 给ecshop后台增加管理功能页面
		
给ecshop后台增加管理功能页面 比如我们增加一个统计报表叫做 物流费用统计报表 放在后台“报表统计”栏目中 具体操作步骤: 第一步,我们要添加一个菜单到后台,然后设置语言项,最后设置权限,这样,后 ...
		 
						- ecshop后台增加|添加商店设置选项和使用方法详解
		
有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...
		 
						- ECSHOP 商品增加新字段的方法
		
在ecshop二次开发工作中,经常碰到一些ECSHOP高级使用者问我,如何给商品增加一个新字段,来录入一些新的内容. 下面我们结合ecshop后台“商品编辑”.“商品录入”来谈谈如何给ecshop商品 ...
		 
						- Ecshop 后台增加一个左侧列表菜单menu菜单的方法
		
Ecshop 后台增加一个左侧列表菜单menu菜单需要修改三个文件:/admin/includes/inc_menu.php/admin/includes/inc_priv.php/languages ...
		 
						- 如何Windows分页控件中增加统计功能
		
在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是 ...
		 
						- ecshop后台增加模块菜单详细教程(图)
		
我们有时候针对ecshop如此开发,想在后台加一些菜单,最模板以前提供过教程,但是并非很系统,今天最模板抛砖引玉图文教程告诉大家:如何在ecshop后台增加模块菜单! 首先需要修改四个文件:inc_p ...
		 
						- 【PHP开源产品】Ecshop的商品筛选功能实现分析之一
		
一.首先,说明一下为什么要对category.php文件进行分析. 原因如下: ①个人对商城类商品筛选功能的实现比较好奇: ②对商城中关于商品的数据表设计比较感兴趣.(该功能涉及到与数据库的交互,而且 ...
		 
						- [转载]ecshop 实现订单导出功能 指定订单导出 EXCEL 数据文件
		
当下很多功能都觉得理所当然,但是实际作为2012年停更的ECSHOP来说,很多功能其实都是缺少的,好比今天的要说的功能 订单导出 这个功能对于现在的产品设计来说,应该属于一个比较常规的功能,但是ECS ...
		 
						- 学习ASP.NET Core Razor 编程系列九——增加查询功能
		
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET  ...
		 
		
	
随机推荐
	
									- VS中查看/修改Dialog控件TAB顺序的方法
			
打开资源视图,打开Dialog的编辑界面 查看: 格式>Tab键顺序 修改: 格式>Tab键顺序 用鼠标左键按你想要的顺序点击各个控件的TAB标签,就设定了 那些你想要TAB键能选择到的控 ...
			 
						- ZooKeeper -- 分布式开源协调服务
			
ZooKeeper是一个为分布式应用所设计的开源协调服务,适用于大型的分布式系统,可以提供统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等服务.ZooKeeper支持Java和C两种编程 ...
			 
						- 通常Struts框架会自动地从action mapping中创建action对象
			
开发者不必在Spring中去注册action,尽管可以这么去做,通常Struts框架会自动地从action mapping中创建action对象 struts2-spring-plugin-x-x-x ...
			 
						- 自动档车的P档和N档的区别
			
P档时,驻车齿轮在变速箱内被部分锁死,所以此时平地上不踩刹车,车辆有一定的驻车效果.N档就是空档,发动机与传动轴在变速器位置彻底分离,没有连接.因此P档适合停车和驻车,就是到地方了,要熄火时挂P档,拉 ...
			 
						- [原创]安装Oracle 11gR2,以及如何在win8下使用plsql develper连接Oracle数据库 ,在这里和大家分享下
			
一,关于win8下安装Oracle 11gR2 1.我下载的是Oracle_11gR2_win64.其中有两个包: 注意:在解压了之后将:win64_11gR2_database_2of2\datab ...
			 
						- Java基础(39):数据的四舍五入、去整、产生随机数---Math类的应用
			
使用 Math 类操作数据 Math 类位于 java.lang 包中,包含用于执行基本数学运算的方法, Math 类的所有方法都是静态方法,所以使用该类中的方法时,可以直接使用类名.方法名,如: M ...
			 
						- 杭电ACM分类
			
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
			 
						- Ajax 核心函数
			
今天刚刚了解了Ajax的一个核心函数,由于对javascript还没有系统的学习,目前还没有深入研究Ajax.但是在运用此函数的同时也发现了一些问题--编码问题.这样在后台接收到的URL参数若果有汉字 ...
			 
						- LDA-math-神奇的Gamma函数
			
http://cos.name/2013/01/lda-math-gamma-function/ 1. 神奇的Gamma函数1.1 Gamma 函数诞生记学高等数学的时候,我们都学习过如下一个长相有点 ...
			 
						- 【crunch bang】字体美化
			
中文字体美化是个很讨厌的事情,无数初学者在这里面浪费了无数时间,做了无数没有意义的事情.但这也是不得不做的,我把 Debian/Ubuntu 所需要的中文字体美化操作步骤详细记录在这里,希望能节约大家 ...