## **表單自動操作**
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 配合使用。