欢迎各位兄弟 发布技术文章

这里的技术是共享的

Thinkphp 模型自动完成,callback回调函数 传递参数

Thinkphp 模型自动完成,callback回调函数 传递参数  

2015-03-26 23:30:34|  分类: ThinkPHP|举报|字号 订阅

 
 
用Thinkphp写一个模型的时候,要用到自动完成。
有好几个参数都需要用到同样的方法。
如果自动完成可以传递参数就好了。但是手册里面并没有提到,在网上搜到了如下的文章。
文章来源:http://www.thinkphp.cn/topic/1518.html
 
自动完成只需要在模型中定义一个$_auto的数组。

$_auto=array(
array('keywords','parsedata',3,'callback')
);

这里定义了一个自动完成规则,对keywords字段调用模型类中的parsedata方法,将返回值填充到keywords字段。
一般情况下,默认调用回调函数的时候,会将keywords默认值当作第一个参数传去进:
function parsedata($data){
...

return $data;//处理过的data
}
这里的$data就是keywords字段默认的值,从表单中传过来的,如果表单中没有,那么这个值就是空的,$data经过parsedata处理后,返回给keywords,作为最终结果用于写入数据库。

那么现在我们有多个字段需要自动完成
$_auto=array(
array('keywords','fillkeywords',3,'callback'),
array('descriptions','filldescriptions',3,'callback'),
);
function fillkeywords($data){
...
}
function filldescriptions($data){
...
}
我们需要分别定义两个回调函数,某些情况下感觉不是很好。

根据手册里写的,一个规则也只有4个参数,只能定义多个回调函数。

老衲觉得不应该这样,就去看了下model.class.php里关于自动完成部分的代码,发现其实自动完成有第五个参数
这个参数是定义除了默认$data以外的其他函数参数,它是一个数组类型
$_auto=array(
array('keywords','autofill',3,'callback',array('arg1','arg2')),

);
这样,我们autofill函数可以这样写
function autofill($data,$arg1,$arg2){
...
}
总之,autofill第一个参数必须是字段默认值,后面的参数是根据auto规则第五个参数按顺序来的。
这样我们不必定义多个回调函数,我是这么做的
$_auto=array(
array('keywords','autofill',3,'callback','keywords'),
array('descriptions','autofill',3,'callback','description'),
);
注:如果第五个参数是字符串,它将被强制转换成数组类型,当然只包含一个元素
function autofill($data,$field){
$return="";
switch($field){
case "keywords":
//处理keywords字段
$return = ……;//此处过程省略
break;
case "description":
//处理description
$return = ..;//此处过程省略
break;
default:
}
return $return;
}
 
经过本人的实践发现了一个问题。
比如$_auto=array(
array('keywords','autofill',3,'callback','keywords'),
);
keywords表单的值为空,autofill函数就不能获取到第五个参数,只能获取到第一个参数。
来自  http://tanning555.blog.163.com/blog/static/52975171201522611252052/
唯物品评历史

关注"唯物品评历史",跟着泪痕春雨先生,读懂历史,看彻人生

打开隐藏二维码