THINKPHP有一个很不错的特性,就是能够设置自动填充来处理默认值、数据过滤以及其他系
统写入字段。
该特性通过自定义模型继承Model类进行实现。
例如,在自定义模型类中,设置$_auto属性
class ArticleModel extends Model
{
//定义$_auto属性,进行字段值的自动填充,数据过滤等。
protected $_auto = array(
array(
'title', //(填充的字段名称
'autofill', //进行数据填充的该模型类的方法
3, //所有情况(1为新增数据的时候处理,2为更新数据的时候处理,3所有情况都进行处理 )
'callback',//调用该模型类的某一个方法进行数据过滤填充
'自定义的参数';//若为callback,或者function,则此处为函数或方法所需的自定义参数(若未填写该表单字段,通常可设定为默认值)
));
}
该属性通过调用Model的autoOperation方法,进行实现,现在看看源代码:
打开
Think/core/Model.class.php,找到大概857行:
private function autoOperation(&$data,$type) {
// 自动填充
if(!empty($this->_auto)) {
foreach ($this->_auto as $auto){
// 填充因子定义格式
// array('field','填充内容','填充条件','附加规则',[额外参数])
if(empty($auto[2])) $auto[2] = self::MODEL_INSERT; // 默认为新增的时候自动填充
if( $type == $auto[2] || $auto[2] == self::MODEL_BOTH) {
switch($auto[3]) {
case 'function': // 使用函数进行填充 字段的值作为参数
case 'callback': // 使用回调方法
//####问题就在此处#####
$args = isset($auto[4])?$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 'string':
default: // 默认作为字符串填充
$data[$auto[0]] = $auto[1];
}
if(false === $data[$auto[0]] ) unset($data[$auto[0]]);
}
}
}
return $data;
}
看完该方法后,就会有个问题:如果设置了$auto[4],并且该值不为数组,则array_unshift函数作用后的$args值依然是$auto[4](因为array_unshift函数的第一个参数值若不为数组,则直接返回参数值)。
这样,按照之前的$_auto属性定义,调用用户自定义的函数,将只能获取$auto[4]的值,不能获取提交的该表单值。
两种解决方案,第一种将$auto[4]设为数组,例如:
protected $_auto = array(
array(
'title',
'autofill',
3, //所有情况
'callback',
array('自定义的参数');//可以把此处设为数组,但只是感觉不太爽
));
第二种解决方案,就是修改源代码了,将
$args = isset($auto[4]) ? $auto[4] : array();
//改为
$args = isset($auto[4]) ? ( is_array($auto[4]) ? $auto[4] : array($auto[4])) :array();
总结:
文章标题为什么说“疑是”呢,是因为通过第一种解决方案,这不能算是一个bug(当需要传递给处理方法或函数多个参数,$auto[4]必须用数组),但只传递一个参数时,往往会忘记或者说不习惯将$auto[4]设为数组类型。
通过第二种方案,能够更好在$auto[4]为任何赋值类型时进行处理。
分享到:
相关推荐
thinkphp表单网页实例
thinkphp5.1.20代码自动生成,自动生成控制器,模型,验证,自动生成表单,数据库curd
ThinkPHP示例:表单处理
ThinkPHP类库导入和自动加载,能够让我们快速的对类库的导入和自动加载哟更大的帮助
该系统利用ThinkPHP的注释功能自动生成API文档,提供在线调试和代码生成器功能,支持Markdown文档格式。项目结构清晰,代码注释详尽,适合用于学习和研究ThinkPHP在API文档自动生成系统开发中的应用。
计算机后端-PHP视频教程. php之thinkphp106 自动填充.wmv
本文以实例讲述了ThinkPHP表单自动提交验证的实现过程,详细步骤如下所示: ...ThinkPHP示例:表单提交、自动验证和自动填充</TITLE> </HEAD> <BODY> <FORM METHOD=POST ACTION=__URL
主要介绍了如何使用thinkPHP实现表单自动验证,笔者也是菜鸟,一步步实验才得到的结果,这里给需要的朋友可以参考下
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用 开发和简化企业级应用开发而诞生的。拥有众多的优秀功能和特性,经历了三年多发展的同时,在社区...
thinkphp小说文学类自动采集+智能伪原创系统,功能强大,设置定时任务后可自动采集热搜词生成伪原创文章,可迅速提升搜索引擎排名获得大量流量,适合做站群。
thinkphp是一个基于thinkphp6的后台管理系统,对标laravel-admin。 think-admin特色: 1、composer库一键安装,丰富的配置项目 2、根据数据库自动生成增删改查,并生成相应的菜单和权限,减少基础机械重复工作 3、...
thinkphp5.1 对接 phpword 使用phpoffice 自己搞了一下午终于搞成了一个对接的,网上的各种bug ,命名很重要各种类库的引入也是无语,1积分吧
thinkphp结合jquery插件(uploadify、imgareaselect)实现图片填充、预览、截图三个功能,下载后php环境就能运行
thinkphp有一个自动填充字段的方法 填充规则如下 array( array(完成字段1,完成规则,[完成条件,附加规则]), array(完成字段2,完成规则,[完成条件,附加规则]), ...... ); 注:研究源码后发现其实还有第4个参数,...
本文实例讲述了ThinkPHP表单自动验证的实现方法。分享给大家供大家参考。具体方法如下: 该示例代码采用TP 3.2框架实现。具体代码如下: 复制代码 代码如下:public function add_post(){ //验证规则 $rule=array...
主要介绍了Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
基于thinkphp的一个通讯备忘录
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布
ThinkPHP 链接mysql 表单验证
一个extjs 和 thinkphp 结合在一起的一个例子 是一个购物的商城简单的资源。是学习extjs的一个好例子