26
2019.2
自动完成
作者: POPASP
在Model类定义 `db.auto_` 属性,可以完成数据自动处理功能,用来处理默认值、数据过滤以及其他系统写入字段。`db.auto_`属性是由多个填充因子组成的数组。
填充因子格式:
`array(填充字段,填充内容,[填充条件,附加规则])`
**说明**
| 项目 | 可选性 | 说明 |
| ------------- | ------------- |------------- |
| 填充字段 | 必须 | 就是需要进行处理的表单字段,这个字段不一定是数据库字段,也可以是表单的一些辅助字段,例如确认密码和验证码等等。 |
| 填充规则 | 必须 | 配合附加规则完成 |
| 填充时间 | 可选 |包括: 1(MODEL_INSERT) 新增数据的时候处理(默认);2(MODEL_UPDATE) 更新数据的时候处理;3(MODEL_BOTH) 所有情况都进行处理 |
| 附加规则 | 可选 | 包括: function :使用函数,表示填充的内容是一个函数名;callback :回调方法 ,表示填充的内容是一个当前模型的方法;field :用其它字段填充,表示填充的内容是一个其他字段的值;string :字符串(默认方式) |
示例:
下面的代码为自定义的Model类
```brush:vb
<%
Class PostModel
Public Sub init
db.tableName = "post"
db.prikey = "post_id"
db. auto_ = array( _
array("ignore","",3,"ignore"), _
array("title","PostModel.testFunc",3,"callback",array() ), _
array("keywords","测试",3,"string"), _
array("add_time","now",3,"function"), _
array("re_password","password",3,"field"), _
array("string","string",3) _
)
End Sub
Public function testFunc( val )
testFunc = "增加一个前缀_" & val
End Function
End Class
%>
```
下面的代码写在Action控制器中
```brush:vb
'运行在Action中
sub [auto]
dim dict, data
set dict = D_
dict("title") = "测试自动完成"
dict("password") = "123456"
dict("ignore") = ""
call M_("post").db.data(dict).Create(1) 'data采用的ByRef传参,在处理中会改变原值
var_export dict 'dict的值已经改变
end sub
```
结果如下:
> {"title":"增加一个前缀_测试自动完成", "password":123456, "keywords":"测试", "add_time":"2016\/7\/16 16:06:57", "re_password":123456, "string":"string"}
使用自动填充可能会覆盖表单提交项目。其目的是为了防止表单非法提交字段。使用Model类的db.create方法创建数据对象的时候会自动进行表单数据处理。和自动验证一样,自动完成机制需要使用create方法才能生效。并且,也可以在操作方法中动态的更改自动完成的规则。
```brush:vb
M_("post").db.auto_ = array( _
array("ignore","",3,"ignore"), _
array("title","PostModel.testFunc",3,"callback",array() ), _
array("keywords","关键字",3,"string"), _
array("add_time","now",3,"function"), _
array("re_password","password",3,"field"), _
array("string","string",3) _
)
M_("post").db.data(data).Create(1)
```
## 手动进行自动完成
在使用Create方法时会自动验证数据。如果想手动完成,也是可以的。
使用**db.AutoComplete**方法
比如:
```brush:vb
'运行在Action中
sub autoComplete
dim dict, data
set dict = D_
dict("title") = "测试自动完成"
dict("password") = "123456"
dict("ignore") = ""
call M_("post").db.AutoComplete(dict,1) 'data采用的ByRef传参,在处理中会改变原值
var_export dict 'dict的值已经改变
end sub
```
结果跟上面例子的一样
使用**POPASP_AUTOVALIDATE**类中的方法**handle**
handle参数说明
| 参数 | 说明 |
| ------------- | ------------- |
| [auto] | 符合自动完成规则的数组 |
| ByRef data | 验证数据,Dictionary对象 |
| mode | 完成时间。1(MODEL_INSERT) 新增数据的时候处理(默认);2(MODEL_UPDATE) 更新数据的时候处理;3(MODEL_BOTH) 所有情况都进行处理 |
```brush:vb
' 运行在Action中
sub autoComplete_handle
dim dict, auto_ , obj
set dict = D_
dict("title") = "测试自动完成"
dict("password") = "123456"
dict("ignore") = ""
auto_ = array( _
array("ignore","",3,"ignore"), _
array("title","PostModel.testFunc",3,"callback",array() ), _
array("keywords","测试",3,"string"), _
array("add_time","now",3,"function"), _
array("re_password","password",3,"field"), _
array("string","string",3) _
)
set obj = P_("AUTOCOMPLETE")
call obj.handle( auto_ , dict, 3 )
var_export dict
end sub
```