ThinkPHP中的模型有一个自动完成的本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。功能,非常好用。我们经常在对用户的密码进【原创内容,转载请注明出处】【原创内容,转载请注明出处】行加密的时候使用这个功能,比如一个用户注【本文受版权保护】本文版权归作者所有,未经授权不得转载。册的时候,我们写一个模型方法,直接完成注【关注微信公众号:wwwtangshuangnet】【转载请注明来源】册,而在数据插入到数据库之前,自动对密码原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。字段进行了加密。
【未经授权禁止转载】【本文受版权保护】未经授权,禁止复制转载。Model User; $_auto = array( array(password,md5) );
function register($username,$password)
上面的$username和$passwo著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。rd都是用户提交的信息,而在数据库中,我著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。们查看数据,发现密码字段已经自动加密了。【转载请注明来源】原创内容,盗版必究。但是,有一个情况比较复杂,就是在用户更新【本文受版权保护】【原创内容,转载请注明出处】数据的时候。
【关注微信公众号:wwwtangshua【作者:唐霜】【转载请注明来源】ngnet】【版权所有,侵权必究】【未经授权禁止转载】function update($uid,$password,$data) {
$this->check_pass($uid,$password);
$this->create($data,self::MODEL_UPDATE);
$this->save();
}
我们一般的情况是:需要输入原始密码进行校原创内容,盗版必究。原创内容,盗版必究。验,校验通过后才能修改密码。但是也有一个本文版权归作者所有,未经授权不得转载。【作者:唐霜】情况是,用户并不希望修改密码,所以新密码原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。字段留空,而修改了其他字段。这种情况下,【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】ThinkPHP提供了一个ignore(【本文受版权保护】本文作者:唐霜,转载请注明出处。忽略,不处理)的自动完成条件来处理。如下【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】:
【访问 www.tangshuang.n【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshua【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】ng.netprotected $_auto = array(
array('password', '', self::MODEL_UPDATE, 'ignore'),
// 解释一下,第一个元素是指字段名,第二个元素是指当该字段的值为什么的时候执行忽略操作(不一定为空,也可以是其他值)
);
当提交的密码为空的时候,就会执行igno【未经授权禁止转载】原创内容,盗版必究。re动作。但是ThinkPHP的官方文档【未经授权禁止转载】【本文受版权保护】中,并没有说明,当两个自动完成同时使用的【原创不易,请尊重版权】【版权所有,侵权必究】时候,应该怎么处理,比如password【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】既要执行md5又要执行ignore时应该【本文受版权保护】【本文首发于唐霜的博客】怎么处理。所以,我们必须去把自动完成的源转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。码翻出来进行剖析。
【转载请注明来源】原创内容,盗版必究。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。自动完成的源码在/ThinkPHP/Li【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】brary/Think/Model.cl本文作者:唐霜,转载请注明出处。【转载请注明来源】ass.php文件中的autoOpera【本文受版权保护】本文作者:唐霜,转载请注明出处。tion函数来实现:
【转载请注明来源】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】/** * 自动表单处理
* @access public
* @param array $data 创建数据
* @param string $type 创建类型
* @return mixed
*/
private function autoOperation(&$data,$type) {
if(false === $this->options['auto']) { // 关闭自动完成
return $data;
}
if(!empty($this->options['auto'])) {
$_auto = $this->options['auto'];
unset($this->options['auto']);
}
elseif(!empty($this->_auto)) {
$_auto = $this->_auto;
}
// 自动填充
if(isset($_auto)) {
foreach ($_auto as $auto) {
// 填充因子定义格式
// array('field','填充内容','填充条件','附加规则',[额外参数])
if(empty($auto[2])) $auto[2] = self::MODEL_INSERT; // 默认为新增的时候自动填充
if( $type == $auto[2] || $auto[2] == self::MODEL_BOTH) {
if(empty($auto[3])) $auto[3] = 'string';
switch(trim($auto[3])) {
case 'function': // 使用函数进行填充 字段的值作为参数
case 'callback': // 使用回调方法
$args = isset($auto[4]) ? (array)$auto[4] : array();
if(isset($data[$auto[0]])) {
array_unshift($args,$data[$auto[0]]);
}
if('function'==$auto[3]) {
$data[$auto[0]] = call_user_func_array($auto[1], $args);
}
else {
$data[$auto[0]] = call_user_func_array(array(&$this,$auto[1]), $args);
}
break;
case 'field': // 用其它字段的值进行填充
$data[$auto[0]] = $data[$auto[1]];
break;
case 'ignore': // 为空忽略
if($auto[1]===$data[$auto[0]]) unset($data[$auto[0]]);
break;
case 'string':
default: // 默认作为字符串填充
$data[$auto[0]] = $auto[1];
}
if(isset($data[$auto[0]]) && false === $data[$auto[0]] ) unset($data[$auto[0]]);
}
}
}
return $data;
}
上面是实现自动完成的源码,可以看到,核心【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。代码用红色标注出来,当采用ignore作未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。为动作行为选项时,判断array的第二个【原创不易,请尊重版权】未经授权,禁止复制转载。元素和传过来的数据(如$_POST)的对【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net应字段是否有相同的值(全等,所以null未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。 !== ”,要注意),如果【转载请注明来源】【本文受版权保护】全等,就直接unset这个字段,这样在更【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】新的时候就不会更新这个字段。
【本文受版权保护】转载请注明出处:www.tangshua【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】ng.net【访问 www.tangshuang.n【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。et 获取更多精彩内容】原创内容,盗版必究。如果我们有两条语句,如下:
原创内容,盗版必究。【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】ang.net【本文首发于唐霜的博客】【访问 www.tangshuang.n本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】protected $_auto = array(
array('password', '', self::MODEL_UPDATE, 'ignore'),
array('password', 'md5', self::MODEL_UPDATE, 'function')
);
那么,无论你如何改变这两个条件的顺序,都【转载请注明来源】【本文受版权保护】会导致密码被md5加密,只是顺序不同,加原创内容,盗版必究。转载请注明出处:www.tangshuang.net密的结果不同而已。那么这是由什么产生的呢【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net?是由上面源码中的蓝色标识代码产生的。$【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】_auto的每一个元素数组都会被执行,案【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。例中的第二个自动完成不会自动消失,而是会【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。执行:md5在前面执行,和在后面执行,都本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。会产生结果。
【作者:唐霜】【转载请注明来源】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】那么怎么来达到我们的目的呢?其实很简单,本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】我们反而是利用foreach这个本质规律本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】,先执行一个我们自己写的加密函数,如果结著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net果为空,那么再执行ignore即可。代码【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】如下:
【关注微信公众号:wwwtangshua【原创不易,请尊重版权】未经授权,禁止复制转载。ngnet】转载请注明出处:www.tangshua著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。ng.net【本文受版权保护】protected $_auto = array(
array('password', 'md5_password', self::MODEL_UPDATE, 'callback'),
array('password', '', self::MODEL_UPDATE, 'ignore')
);
protected function md5_password($password) {
if(!$password) return '';
return md5($password);
}
我们利用到了另外一个自动完成的规则,及c【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】allback。它实际上和functio【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。n是一样的,只不过callback调用的【转载请注明来源】【作者:唐霜】是本模型类的一个方法而已,实际上,我们也本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】可以自己在common中写一个函数来达到【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】这个效果。
【本文受版权保护】【转载请注明来源】【作者:唐霜】【作者:唐霜】要注意自动完成的顺序,当第一个规则执行完【作者:唐霜】【关注微信公众号:wwwtangshuangnet】之后,我们来看一下。如果你传过来的密码是著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】空的,那么md5_password函数返【本文受版权保护】【转载请注明来源】回的值是”,而再去执行第二个【本文受版权保护】【未经授权禁止转载】自动完成规则ignore时,passwo【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】rd字段就被忽略了。这样就达到了我们要的著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】目的。
原创内容,盗版必究。转载请注明出处:www.tangshua转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。ng.net有两个注意点:1.自动完成规则的顺序必须【未经授权禁止转载】【版权所有,侵权必究】是先执行md5_password函数,然本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】后在执行ignore;2.md5_pas本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。sword在忽略条件下必须返回和igno【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。re要忽略的值相同的值。
【本文首发于唐霜的博客】【原创内容,转载请注明出处】2015-11-24 7512


