Discuz3.3注册程序修改添加记录推荐人账号
Discuz3.3注册入口地址为:member.php?mod=register
一.member.php:
打开之后,代码非常简单。
其中有一句:
$mod = !in_array($discuz->var['mod'], $modarray) && (!preg_match('/^\w+$/', $discuz->var['mod']) || !file_exists(DISCUZ_ROOT.'./source/module/member/member_'.$discuz->var['mod'].'.php')) ? 'register' : $discuz->var['mod'];
这一句里面的 $discuz->var['mod']来源,有专门的技术贴分析:http://www.phpfensi.com/cms/20150930/10204.html
require libfile('function/member');//载入menber 函数
require libfile('class/member');//载入menber 类库
runhooks(); //运行hook点
require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php';//载入member_register.php页面。
从这里面来看,主要注册程序页为:source/module/member/member_register.php页面。
二.source/module/member/member_register.php:
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}//来源检测
define('NOROBOT', TRUE);
$ctl_obj = new register_ctl();//实例化register_ctl类
$ctl_obj->setting = $_G['setting'];//获取全局变量中setting值
$ctl_obj->template = 'member/register';//载入模板template\default\member\register.htm
$ctl_obj->on_register();//执行on_register函数
注册执行的主函数为:register_ctl类中的on_register(),register_ctl类的位置是:source/class/class_member.php文件中。这个文件在第一部分已经通过载入类库方式载入。
三.source/class/class_member.php:
function register_ctl(){}
function on_register(){}
这个文件只有这两个函数,register_ctl(){}初始化,载入相关类库。on_register()注册程序。
注册程序很长,选几个关键点来看:
大约700行左右(这个程序页面我稍微修改过,跟官方原版略有区别):
if(!$activation) {
$ffromuser=getuserbyuid($fromuid);//这个系我添加,上面程序已经获取了$fromuid推荐人ID,这里我获取了一下推荐人的数据(注:这是个人员数据数组对象, $ffromuser['username']是用户名)。
$uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G['clientip'], $ffromuser['username']);//ucenter中心添加用户。
这个程序uc_user_register()是添加用户的具体实现方法。
uc_user_register()这个程序的位置是:uc_client\client.php页面里面。
四.uc_client\client.php:
function uc_user_register($username, $password, $email, $questionid = '', $answer = '', $regip = '',$fromuser = '') {
return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer, 'regip'=>$regip, 'fromuser'=>$fromuser));
}
代码很简单,调用了call_user_func()方法实现了多接口复用。其中参数:
UC_API_FUNC参数在该页面头部定义了:
define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post');//在我这边连接方式是mysql,根据配置,也可以使用api post方式传送用户注册信息。
uc_api_mysql()函数,在本页面上部定义了:
function uc_api_mysql($model, $action, $args=array()) {
global $uc_controls;
if(empty($uc_controls[$model])) {
if(function_exists("mysql_connect")) {
include_once UC_ROOT.'./lib/db.class.php';
} else {
include_once UC_ROOT.'./lib/dbi.class.php';
}
include_once UC_ROOT.'./model/base.php';
include_once UC_ROOT."./control/$model.php";
eval("\$uc_controls['$model'] = new {$model}control();");
}
if($action{0} != '_') {
$args = uc_addslashes($args, 1, TRUE);
$action = 'on'.$action;
$uc_controls[$model]->input = $args;
return $uc_controls[$model]->$action($args);
} else {
return '';
}
}
include_once UC_ROOT."./control/$model.php";表示载入/control/user.php模块。
$action = 'on'.$action;表示调用函数onregister();
五.uc_client\control\user.php:
function onregister() {
$this->init_input();
$username = $this->input('username');
$password = $this->input('password');
$email = $this->input('email');
$questionid = $this->input('questionid');
$answer = $this->input('answer');
$regip = $this->input('regip');
$fromuser = $this->input('fromuser');//这一行是我添加的推荐人信息。
if(($status = $this->_check_username($username)) < 0) {
return $status;
}
if(($status = $this->_check_email($email)) < 0) {
return $status;
}
$uid = $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer, $regip, $fromuser);//这一行是我修改的推荐人账号传参。
return $uid;
}
$_ENV是PHP中的一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP程序的任何地方直接访问它。
在 uc_client/model/base.php 中,使用了load()方法定义了 $_ENV[$model] 并赋值。
function load($model, $base = NULL) {
$base = $base ? $base : $this;
if(empty($_ENV[$model])) {
require_once UC_ROOT."./model/$model.php";
eval('$_ENV[$model] = new '.$model.'model($base);');
}
return $_ENV[$model];
}
这里的作用,我们不深究,知道这里调用的是UC_ROOT."./model/user.php中的add_user()方法。
六.uc_client/model/user.php:
大约L129:
function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '', $fromuser = '') {
$regip = empty($regip) ? $this->base->onlineip : $regip;
$salt = substr(uniqid(rand()), -6);
$password = md5(md5($password).$salt);
$sqladd = $uid ? "uid='".intval($uid)."'," : '';
$sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',";
$this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");
$uid = $this->db->insert_id();
$this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
return $uid;
}
到此,参数就传递到写入数据库的部分了,具体如何放置就不属于本文讨论范围,相信大家会有很多很好的解决方案。
所有需要修改的部分就完成了。总共涉及6个页面。
Discuz3.3注册程序修改添加记录推荐人账号的更多相关文章
- 异步方式向WPF ListBox控件中一条一条添加记录
向ListBox绑定数据源时,如果数据量过大,可能会使得程序卡死,这是就需要一条一条的向ListBox的数据源中添加记录了,下面是个小Demo: 1.前台代码,就是一个ListBox控件 <Wi ...
- NSIS:在注册表中记录安装路径以便重装或升级时读取
原文 NSIS:在注册表中记录安装路径以便重装或升级时读取 在NSIS中,这个功能是非常有用的,可以避免用户把程序安装到多个位置的尴尬. 第1步:在“安装目录选择页面”前面加入以下代码: 1 !def ...
- Linux 在添加一个新账号后却没有权限怎么办
当添加一个新账号后,我们可能会发现新账号sudo 时会报告不在sudoers中,使用su -s时输入密码后也会认证失败 上网搜索大部分都要求修改/etc/sudoers中的内容,但修改这个文件必须需要 ...
- mybatis添加记录时返回主键id
参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...
- 使用mybatis注解@Options实现添加记录时返回主键值
官网:http://www.mybatis.org/mybatis-3/index.html 在使用mybatis作为ORM框架时,我通常更喜欢使用注解而非xml配置文件的方式.业务场景:添加记录之后 ...
- django之跨表查询及添加记录
一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); 一本书只应该由一个出版商出 ...
- 架构师成长之路6.5 DNS服务器搭建(添加记录、负载均衡、DNS视图)
点击返回架构师成长之路 架构师成长之路6.5 DNS服务器搭建(添加记录.负载均衡.DNS视图) 部署主DNS : 点击 部署从DNS : 点击 1.添加A记录.CNAME记录.MX记录.PTR记录 ...
- Django框架----跨表查询及添加记录
一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); 一本书只应该由一个出版商出 ...
- 如何在 vCenter Server 上将虚拟机注册或添加到清单中
免责声明:本文为 Registering or adding a virtual machine to the Inventory in vCenter Server or in an ESX/E ...
随机推荐
- JDK1.7新特性(3):java语言动态性之脚本语言API
简要描述:其实在jdk1.6中就引入了支持脚本语言的API.这使得java能够很轻松的调用其他脚本语言.具体API的使用参考下面的代码: package com.rampage.jdk7.chapte ...
- unity多线程
多线程概念 多线程,是指实现多个线程并发执行的技术,合理利用多线程可以提升程序的性能,在unity中,一般是避免使用多线程的,unity对多线程的支持并不友好. 协程概念 协程,是指在主线程运行时开启 ...
- Angular2-三种样式封装策略的区别
Angular2有三种样式封装方式,分别是None.Native.Emulated. 可用元数据“encapsulation”配置,配置方式如下: encapsulation: ViewEncapsu ...
- 方法执行一次js
var isFirst = true; $(function () { //一级 $("#City").change(function () { var url = "/ ...
- WCF 之部署(VS2010)
一. 环境vs2010,WCF应用程序,server 2008 第一步:WCF项目右键点击项目,选择生成部署包,如下图: 第二步:WCF项目上右键,选择:在windows资源管理器中打开文件夹,如下图 ...
- log4j2配置文件
项目里面经常用到日志,Java开发一般用log4j.slf4j这些框架,看着配置文件有点懵.这几天看公司代码的时候,也有用到log4j,感觉要复杂一点.在本地打log,也有打到hive里面存的.看了一 ...
- Java内存区域与虚拟机类加载机制
一.Java运行时数据区域 1.程序计数器 “线程私有”的内存,是一个较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器.Java虚拟机规范中唯一一个没有OutOfMemoryError情况 ...
- Django中用Jquery实现不刷新页面进行身份验证和计算器功能
1.下载jquery http://www.jq22.com/jquery-info122 下载解压之后加入工程中的static文件夹中 2.路由分发. """Djang ...
- gulp快速将css中的px替换成rem
1.Gulp安装配置 1.全局安装gulp 1.1 安装 命令提示符执行cnpm install gulp -g; 1.2 查看是否正确安装:命令提示符执行gulp -v,出现版本号即为正确安装. 2 ...
- xfs参数简介
age_buffer_centisecs age_buffer_centisecs:(Min: 100 Default: 1500 Max: 720000) 多长时间设置为脏数据 xfsbufd_ ...