数据预处理(V3.1新增功能)
当有下面这样的需求时,我们可以使用通用的数据新增模型common_add来添加数据,其中小程序标签字段是一个checkbox类型的多选项。
我们可以用下面这样的代码来生成一个数据新增表单
/**
* 添加小程序
*/
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。
我们可以看一下用来动态生成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;
}
因此用上面的代码写完了之后,我们可以看到视图呈现的效果就是这样的:
跟text、textarea、option、select这样的视图控件不同,checkbox控件是一个多选项,在勾选了几个选项并点击提交后,我们调试可以看到post的数据中tags字段选择的值是这样的:
现在的需求是:我们的数据表字段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] 数据预处理功能可以让豆信封装的通用数据增删改查模型更为强大,开发者可以根据自己需要的数据格式选择合适的数据预处理方式。