需求:客户想有一个可以邀请注册,每一个客户都有自己的邀请链接,可以邀请朋友注册。
环境:WAMP,基于ECmallCMS二次开发。
初步构想:
每个用户在数据库中都有自己的id(A),可以通过判断id来确定A是否邀请了B。注册成功则写入数据库的ecm_member中。在member数据表添加一个字段,pr_id,作为邀请人的id。
首选分析ECmall的注册机制。
主入口文件:index.php?app=member&act=register&ret_url=
member模型下的register方法。
打开member.app.php,发现了 function register()方法。
首先是判断用户是否登录,if ($this->visitor->has_login) 如果没有登录就提醒登录 $this->show_warning('has_login');
if (!IS_POST)这个判断代码让我很疑惑。
在网路上没找到详细的说明,新增加的这个变量是ThinkPHP3.0.1dev版本开始支持的。
从字面意思上看就是如果提交方式不为POST的话,做下面的操作。
我是这样修改的,在数据库中的member表添加一个user_pid字段,默认为0。然后打开现在使用的模板文件夹,打开member.register.html模板文件(ps:我用的是一号店官方模板,需要的朋友可以联系我)。
找到form表单的行,添加如下
<form name="" id="register_form" method="post" action="">
<table>
<tr>
<td colspan="2"><h4>{$lang.enter_register_info}</h4></td>
<td >邀请id:(默认为空)<h4><input type="text" disabled="disabled" id="user_pid" name="user_pid" value="{$user_pid}" /></h4></td>
</tr>
在app文件夹中打开member.app.php,找到register方法,在头部添加$get['user_pid']接收数据并且assgin变量。
然后在$user_id = $ms->user->register($user_name, $password, $email,$user_pid);
然后打开passport下default.passport.php,找到register函数,增加参数$user_pid.
保存,打开浏览器访问http://xxxxx.com/index.php?app=member&act=register&ret_url=&user_pid=111测试,可以看到user_pid文本框已经显示出来了user_pid的值。
注册一个用户,然后就可以看到注册表中已经有了邀请的pid!
当然,user_pid需要做一下函数过滤,防止被人入侵。
sql语句:
select u.user_id,u.user_name, count(ui.user_id), group_concat(ui.user_name)
from ecm_member u
join ecm_member ui
on u.user_id=ui.user_pid
group by u.user_id