25
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, m , data set m = M_("post") set dict = D_ dict("title") = "测试自动完成" dict("password") = "123456" dict("ignore") = "" call m.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.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.db.data(data).Create(1) ``` ## 手动进行自动完成 在使用Create方法时会自动验证数据。如果想手动完成,也是可以的。 使用**db.AutoComplete**方法 比如: ```brush:vb '运行在Action中 sub autoComplete dim dict, m , data set m = M_("post") set dict = D_ dict("title") = "测试自动完成" dict("password") = "123456" dict("ignore") = "" call m.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 ```