多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 数据预处理(V3.1新增功能) 当有下面这样的需求时,我们可以使用通用的数据新增模型common_add来添加数据,其中小程序标签字段是一个checkbox类型的多选项。 ![](https://box.kancloud.cn/765ffa01379f403cda7db9c54b506329_1525x915.png) 我们可以用下面这样的代码来生成一个数据新增表单 ``` /** * 添加小程序 */ public function add() { $this->setMetaTitle('添加小程序') ->addCrumb('系统管理', U('Index/index'), '') ->addCrumb('小程序管理', U('lists'), '') ->addCrumb('添加小程序', '', 'active') ->addNav('添加小程序', '', 'active') ->addFormField('name', '小程序名称', 'text') ->addFormField('created_by', '发布者名称', 'text') ->addFormField('logo', '小程序LOGO', 'image') ->addFormField('qrcode', '小程序二维码', 'image') ->addFormField('created_at', '小程序发布时间', 'time') ->addFormField('tags', '小程序标签', 'checkbox', array('options'=>'callback','callback_name'=>'getTags', 'pre_type'=>'callback', 'pre_name'=>'implode')) ->addFormField('description', '小程序简介', 'textarea') ->setModel('app') ->addValidate('name', 'require', '小程序名称必填', 1, 'regex', 3) ->common_add(); } ``` 我们在生成一个checkbox多选框的时候用到了这样的代码,其中第四个参数是array类型,'options'=>'callback'表示我们需要用一个当前控制器的方法来动态生成checkbox的数据,'callback_name'=>'getTags'表示我们用到的callback方法名是getTags。 ```->addFormField('tags', '小程序标签', 'checkbox', array('options'=>'callback','callback_name'=>'getTags', 'pre_type'=>'callback', 'pre_name'=>'implode')) ``` 我们可以看一下用来动态生成checkbox数据项的callback方法“getTags” ``` /** * 获取所有标签 */ public function getTags() { $tags = M('app_tag')->select(); $options = array(); foreach ($tags as $k => $v) { $options[$v['id']] = $v['name']; } return $options; } ``` 因此用上面的代码写完了之后,我们可以看到视图呈现的效果就是这样的: ![](https://box.kancloud.cn/26b48ab65907d669fcec226415d13603_973x119.png) 跟text、textarea、option、select这样的视图控件不同,checkbox控件是一个多选项,在勾选了几个选项并点击提交后,我们调试可以看到post的数据中tags字段选择的值是这样的: ![](https://box.kancloud.cn/865d0b986bccc9cdf7a7040a97fca132_208x333.png) 现在的需求是:我们的数据表字段tags是varchar类型的,我们希望能对提交过来的tags数据用逗号进行连接,并存入数据表。 于是我们可以用到V3.1新增的空间选项pre_type和pre_name。按照下面的代码,我们用'pre_type'=>'callback'指定当前控制器的一个方法来对提交的数据中的tags字段进行预处理,用'pre_name'=>'implode'指定用来进行预处理的方法名为'implode'。 ``` ->addFormField('tags', '小程序标签', 'checkbox', array('options'=>'callback','callback_name'=>'getTags', 'pre_type'=>'callback', 'pre_name'=>'implode')) ``` 来看一下预处理方法是实现 ``` /** * 字符串连接 */ public function implode($value) { return implode(',', $value); } ``` 加上预处理代码后我们再来提交数据,调试一下可以发现tags的数据已经用逗号分隔了。 ![](https://box.kancloud.cn/3500c0fcfe900978eeec140302ad7486_251x203.png) >[info] 数据预处理功能可以让豆信封装的通用数据增删改查模型更为强大,开发者可以根据自己需要的数据格式选择合适的数据预处理方式。