数据预处理(V3.1新增功能)

当有下面这样的需求时,我们可以使用通用的数据新增模型common_add来添加数据,其中小程序标签字段是一个checkbox类型的多选项。数据预处理 - 图1

我们可以用下面这样的代码来生成一个数据新增表单

  1. /**
  2. * 添加小程序
  3. */
  4. public function add() {
  5. $this->setMetaTitle('添加小程序')
  6. ->addCrumb('系统管理', U('Index/index'), '')
  7. ->addCrumb('小程序管理', U('lists'), '')
  8. ->addCrumb('添加小程序', '', 'active')
  9. ->addNav('添加小程序', '', 'active')
  10. ->addFormField('name', '小程序名称', 'text')
  11. ->addFormField('created_by', '发布者名称', 'text')
  12. ->addFormField('logo', '小程序LOGO', 'image')
  13. ->addFormField('qrcode', '小程序二维码', 'image')
  14. ->addFormField('created_at', '小程序发布时间', 'time')
  15. ->addFormField('tags', '小程序标签', 'checkbox', array('options'=>'callback','callback_name'=>'getTags', 'pre_type'=>'callback', 'pre_name'=>'implode'))
  16. ->addFormField('description', '小程序简介', 'textarea')
  17. ->setModel('app')
  18. ->addValidate('name', 'require', '小程序名称必填', 1, 'regex', 3)
  19. ->common_add();
  20. }

我们在生成一个checkbox多选框的时候用到了这样的代码,其中第四个参数是array类型,'options'=>'callback'表示我们需要用一个当前控制器的方法来动态生成checkbox的数据,'callback_name'=>'getTags'表示我们用到的callback方法名是getTags。

我们可以看一下用来动态生成checkbox数据项的callback方法“getTags”

  1. /**
  2. * 获取所有标签
  3. */
  4. public function getTags() {
  5. $tags = M('app_tag')->select();
  6. $options = array();
  7. foreach ($tags as $k => $v) {
  8. $options[$v['id']] = $v['name'];
  9. }
  10. return $options;
  11. }

因此用上面的代码写完了之后,我们可以看到视图呈现的效果就是这样的:数据预处理 - 图2

跟text、textarea、option、select这样的视图控件不同,checkbox控件是一个多选项,在勾选了几个选项并点击提交后,我们调试可以看到post的数据中tags字段选择的值是这样的:数据预处理 - 图3

现在的需求是:我们的数据表字段tags是varchar类型的,我们希望能对提交过来的tags数据用逗号进行连接,并存入数据表。

于是我们可以用到V3.1新增的空间选项pre_type和pre_name。按照下面的代码,我们用'pre_type'=>'callback'指定当前控制器的一个方法来对提交的数据中的tags字段进行预处理,用'pre_name'=>'implode'指定用来进行预处理的方法名为'implode'。

  1. ->addFormField('tags', '小程序标签', 'checkbox', array('options'=>'callback','callback_name'=>'getTags', 'pre_type'=>'callback', 'pre_name'=>'implode'))

来看一下预处理方法是实现

  1. * 字符串连接
  2. */
  3. public function implode($value) {
  4. return implode(',', $value);
  5. }
  6. ```
  7. 加上预处理代码后我们再来提交数据,调试一下可以发现tags的数据已经用逗号分隔了。
  8. ![](https://box.kancloud.cn/3500c0fcfe900978eeec140302ad7486_251x203.png)
  9. >[info] 数据预处理功能可以让豆信封装的通用数据增删改查模型更为强大,开发者可以根据自己需要的数据格式选择合适的数据预处理方式。