表单新增更新
快捷表单助手可以简化数据保存与更新操作,根据提交数据自动处理。
若在模型中需要使用到 FormHelper
快捷查询器,模型需要继承 \think\admin\Model
类;
若在控制器需要使用到 FormHelper
快捷查询器,控制器需要继承 \think\admin\Controller
类;
调用快捷表单
// 1.0 模型用法
// 参数 $template 模板文件
// 参数 $field 主键字段
// 参数 $where 查询条件
// 参数 $data 额外数据
MyModel::mForm($template, $field, $where, $data);
// 1.1 模型通用更新
MyModel::mForm();
// 2.0 控制器用法
// 参数 $dbQuery 为模型名称
// 参数 $template 模板文件
// 参数 $field 主键字段
// 参数 $where 查询条件
// 参数 $data 额外数据
$this->_form($dbQuery, $template, $field, $where, $data);
// 2.1 通用修改器
$this->_form('MyModel');
控制器只需要一行代码,就可以实现数据添加与更新,如:$this->_form('模板名称');
当然,这里使用了 HttpResponseException
直接输出,不需要返回内容的。
如果需要给模板额外赋值,可以直接在控制器 $this->username='变量值'
; 这样在模板中可以直接使用 $username
变量;
如果提交的表单数据包含指定主键时则为更新操作,否则为添加记录; 另外对表单还有 callback
操作(参数使用引用),统一名称为 protected function _form_filter(&$data)
数据回调处理
对于表单操作,Controller
内置了两个回调方法,如:
// 表单前置操作,允许使用引用更改 data 值
// 参数 $data :会返回待处理的数组,分显示模型和保存模型,也就是 get|post 请求
[_ACTION]_form_filter(array &$data)
// 表单后置操作,返回的 data 为提交的数据
// 参数 $result :为返回保存结果,成功为 true,失败为 false
// 参数 $data :为返回后的数据,默认为带上数据ID,也就是主键,这个与模型定义有关
[_ACTION]_form_result(bool $result, array $data)
以上案例回调函数如果返回 false
时,Controller
默认行为将不会再执行。
数据处理案例
/**
* 添加拼团
* @auth true
*/
public function add()
{
$this->title = '添加拼团';
// MyModel::mForm('form');
$this->_form('MyModel', 'form');
}
/**
* 编辑拼团
* @auth true
*/
public function edit()
{
$this->title = '编辑拼团';
// MyModel::mForm('form');
$this->_form('MyModel', '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 {
$this->app->db->transaction(function () use ($data, $all) {
$map = ['package_code' => $data['code']];
$this->app->db->name('StoreGoodsGroupList')->where($map)->delete();
$this->app->db->name('StoreGoodsGroupList')->insertAll($all);
});
} catch (Exception $e) {
$this->error("商品详情处理失败,{$e->getMessage()}");
}
}
}
/**
* 表单结果处理
* @param boolean $result
*/
protected function _form_result(bool $result,array $data)
{
// 这里可以获取到数据记录ID
// echo $data['id']
if ($result && $this->request->isPost()) {
$this->success('商品编辑成功!', 'javascript:history.back()');
}
}
如果是在 ThinkAdmin 后台基于 admin.js 的情况下,可使用 form[data-auto]
来与 $this->_form
配合使用。