用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函数就不能获取到第五个参数,只能获取到第一个参数。