## **表单自动操作**
ThinkLibrary 表单处理可能简化数据保存与更新操作,
控制器只需要一行代码,就可以实现数据添加与更新,如:
```php
$this->_form('表名','模板名称');
```
当然,这里使用了`HttpResponseException`直接输出,不需要返回内容的。
需要给模板额外赋值,可以直接在控制器`$this->username='你的值';`
这样在模板中可以直接使用`$username`变量;
如果提交的表单数据包含指定主键时则为更新操作,否则为添加记录;
另外对表单还有`callback`操作(参数使用引用),统一名称为`protected function _form_filter(&$data)`
另外关于模板的使用,可以参考下demo哦。
-----
#### 数据回调处理
对于表单操作,`Controller`内置了两个回调方法,如:
```php
[_ACTION]_form_filter($vo)
[_ACTION]_form_result($result, $vo)
```
当回调函数返回`false`时,`Controller`默认的行为将不会执行。
-----
#### 数据回调处理DEMO
~~~
/**
* 添加拼团
* @auth true
*/
public function add()
{
$this->title = '添加拼团';
$this->_form($this->table, 'form');
}
/**
* 编辑拼团
* @auth true
*/
public function edit()
{
$this->title = '编辑拼团';
$this->_form($this->table, 'form');
}
/**
* 添加拼团商品表单处理
* @param array $data
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\ModelNotFoundException
* @throws \think\exception\DbException
*/
protected function _form_filter(&$data)
{
if (empty($data['code'])) $data['code'] = Data::uniqidNumberCode(10);
if ($this->request->isGet()) {
$map = ['package_code' => $data['code']];
$data['list'] = Db::name('StoreGoodsGroupList')->where($map)->select();
} else {
if (empty($data['logo'])) $this->error('请上传商品图标图片');
if (empty($data['image'])) $this->error('请上传商品展示图片');
if (empty($data['item_number'])) $this->error('请添加套卡包含内容');
$all = [];
foreach (array_keys($data['item_number']) as $key) $all[] = [
'package_code' => $data['code'],
'goods_code' => $data['item_code'][$key],
'goods_type' => $data['item_type'][$key],
'goods_title' => $data['item_title'][$key],
'goods_number' => $data['item_number'][$key],
];
try {
Db::transaction(function () use ($data, $all) {
$map = ['package_code' => $data['code']];
Db::name('StoreGoodsGroupList')->where($map)->delete();
Db::name('StoreGoodsGroupList')->insertAll($all);
});
} catch (Exception $e) {
$this->error("商品详情处理失败,{$e->getMessage()}");
}
}
}
/**
* 表单结果处理
* @param boolean $result
*/
protected function _form_result($result)
{
if ($result && $this->request->isPost()) {
$this->success('商品编辑成功!', 'javascript:history.back()');
}
}
~~~
如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可使用 form[data-auto] 来与 $this->_form 配合使用。