# 数据表单
# 快速入门
ModStart\Form\Form
类用于快速生成表单页面,参照例子 数据表格→快速入门
可以通过如下代码快速定义个数据表单
return Form::make('blog', function (Form $form) {
// 定义标题字段,格式为单行文本
$form->text('title', '标题');
// 定义封面字段,格式为单张图片
$form->image('cover', '封面');
// 定义摘要字段,格式为多行文本
$form->textarea('summary', '摘要');
// 定义内容字段,格式为富文本
$form->richHtml('content', '内容');
});
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 获取当前模型数据
在闭包内可以获取到当前模型的数据
return Form::make('blog', function (Form $form) {
dd($form->item());
});
1
2
3
2
3
# 数据保存阶段自定义处理
# 保存前
$form->hookSaving(function (Form $form) {
if ($form->isModeAdd()) {
// 增加模式
$data = $form->dataAdding();
$data['xxx'] = 'xxx';
// 替换入库数据
$form->dataAdding($data);
} else if ($form->isModeEdit()) {
// 修改
$data = $form->dataEditing();
$data['xxx'] = 'xxx';
// 替换入库数据
$form->dataEditing($data);
}
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 保存后
$form->hookSaved(function(Form $form) {
// 保存后的操作
// 已保存的数据
$item = $form->item();
});
1
2
3
4
5
2
3
4
5
# 数据变更
$form->hookChanged(function (Form $form) {
// 可以在数据变更时自定义处理,一般用于清缓存等操作
RepositoryUtil::makeItems($form->item())->map(function ($item) {
// 数据 $item 已改动
});
});
1
2
3
4
5
6
2
3
4
5
6
# 删除前
$form->hookDeleting(function (Form $form) {
// 数据处理
// 即将删除的数据
$item = $form->item();
});
1
2
3
4
5
2
3
4
5
# 删除后
$form->hookDeleted(function (Form $form) {
// 数据处理
});
1
2
3
2
3
# 组件自定义hook
有两种方式修改字段的行为
① 通过继承 ModStart\Field\AbstractField
类,实现以下方法
class XxxField extends \ModStart\Field\AbstractField
{
// 字段值序列化
// 数据从存储系统(如数据库)读取出来,会调用此方法转换为字段 $value 值
public function unserializeValue($value, AbstractField $field)
{
return $value;
}
// 字段值序列化
// 数据提交到存储系统(如数据库)时,会调用此方法转换为存储值
public function serializeValue($value, $model)
{
return $value;
}
// 字段输入获取准备
// 数据从用户输入获后需要进行的处理,如转换、验证等,如果异常可以直接抛出 BizException 异常
public function prepareInput($value, $dataSubmitted)
{
return $value;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
② 在使用时动态的修改方法的行为
// 字段值序列化
$field->hookValueUnserialize(function($value, AbstractField $field){
return $value;
})/
// 字段值序列化
$field->hookValueSerialize(function($value, $model){
return $value;
})
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 字段组件基础
# 字段定义
$field = $form->text('xxx','字段名称');
1
# 字段自定义渲染
$field->hookRendering(function (AbstractField $field, $item, $index) {
// 是否为普通表单模式、增加表单模式、修改表单模式,可根据不同模式反馈不同的渲染内容
// $field->context()->isModeForm()
// $field->context()->isModeAdd()
// $field->context()->isModeEdit()
return <<<HTML
<div class="line">
<div class="label">内容</div>
<div class="field">
<div style="border:2px solid red;padding:10px;">
字段自定义显示,其中name需要和字段column相同
<input type="text" name="content" value="内容" />
</div>
</div>
</div>
HTML;
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 字段默认值
$field->defaultValue('默认值')
1
# 提示文字
$field->placeholder('提示文字')
1
# 只读模式
$field->readonly(true)
1
# 帮助文字
$field->help('帮助文字,支持HTML')
1
# 字段校验
// 字段必填
$field->required();
// 匹配URL
$field->ruleUrl();
// 在表中必须唯一
$field->ruleUnique('数据表')
// 匹配正则,目前正则中暂不能包含|
$field->ruleRegex('/^\d+$/');
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 字段组件库
# areaChina 中国地区
$form->areaChina('field', '字段名');
1
# audio 音频
$form->audio('field', '字段名');
// 使用用户音频库
$form->audio('field', '字段名')
->server(modstart_web_url('member_data/file_manager/audio'));
1
2
3
4
2
3
4
# captcha 验证码
$form->captcha('field', '字段名');
1
# checkbox 多选
$form->checkbox('field', '名称');
1
# code 代码
$form->code('field', '名称');
1
# color 颜色
$form->color('field', '字段名');
1
# currency 货币
$form->currency('field', '字段名');
1
# date 日期
$form->date('field', '字段名');
1
# datetime 日期时间
$form->datetime('field', '字段名');
1
# decimal 小数
$form->decimal('field', '字段名');
1
# display 显示
$form->display('field','名称');
1
# file 文件
$form->file('field', '字段名');
// 使用用户文件库
$form->file('field', '字段名')
->server(modstart_web_url('member_data/file_manager/file'));
1
2
3
4
2
3
4
# fileTemp 临时文件
临时路径指上传到临时表 data_temp
中的图片,正式保存时会将临时图片移动到正式表 data
中。
$form->fileTemp('field', '字段名');
1
# files 多文件
$form->files('field', '字段名');
// 使用用户文件库
$form->files('field', '字段名')
->server(modstart_web_url('member_data/file_manager/file'));
1
2
3
4
2
3
4
# hidden 隐藏域
$form->hidden('field', '字段名');
1
# html HTML
$form->html('field', '字段名');
1
# icon 图标
$form->icon('field', '字段名');
1
# id ID
$form->id('field', '字段名');
1
# image 单张图片
$form->image('field', '字段名');
// 使用用户图库
$form->image('field', '字段名')
->server(modstart_web_url('member_data/file_manager/image'));
1
2
3
4
2
3
4
# images 多张图片
$form->images('field', '字段名');
// 使用用户图库
$form->image('field', '字段名')
->server(modstart_web_url('member_data/file_manager/image'));
1
2
3
4
2
3
4
# imagesTemp 多张图片(临时路径)
临时路径指上传到临时表 data_temp
中的图片,正式保存时会将临时图片移动到正式表 data
中。
$form->imagesTemp('field', '字段名');
1
# jsonIdItems 条目列表
字段存储的是 JSON 格式的 ID 列表,通过 ID 列表获取对应的条目名称
$grid->jsonIdItems('field', '字段名');
// 条目选择接口
->selectUrl(modstart_admin_url('path/to/select'))
// 指定预览接口
->previewUrl(modstart_admin_url('path/to/preview'))
// 指定条目样式,ITEM_STYLE_TITLE、ITEM_STYLE_COVER_TITLE
->itemStyle(JsonIdItems::ITEM_STYLE_TITLE);
1
2
3
4
5
6
7
2
3
4
5
6
7
条目选择接口需要返回
{
"code": 0,
"data": {
"records": [
{"id": 1, "title": "选项1", "cover": "http://xxx.com/xxx.jpg"},
{"id": 2, "title": "选项2", "cover": "http://xxx.com/xxx.jpg"}
]
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
条目预览接口接收 ids
参数,该参数使用 ,
分隔的多个ID,返回的数据格式如下
{
"code": 0,
"data": {
"records": [
{"id": 1, "title": "选项1", "cover": "http://xxx.com/xxx.jpg"},
{"id": 2, "title": "选项2", "cover": "http://xxx.com/xxx.jpg"}
]
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# keyValueList 键值对列表
$form->keyValueList('field', '字段名');
1
# link 链接
$form->link('field', '字段名');
1
# markdown Markdown
$form->markdown('field', '字段名');
1
# multiSelect 下拉多选
$form->multiSelect('field', '字段名')->options([
'a' => '选项1',
'b' => '选项2',
'c' => '选项3',
]);
1
2
3
4
5
2
3
4
5
# number 数字
$form->number('field', '字段名');
1
# password 密码
$form->password('field', '字段名');
1
# percent 百分比
$form->percent('field', '字段名');
1
# radio 单选
$form->radio('field', '字段名');
// 使用数组
$form->radio('field', '字段名')
->options(['a'=>'选项1','b'=>'选项2']);
// 使用BaseType枚举类
$form->radio('field', '字段名')
->optionType(XxxType::class);
// 使用数据表
$form->radio('field', '字段名')
->optionModel('xxxx','id','name');
// 条件
$form->radio('field', '字段名')
->when('=', 1, function ($form) {
$form->text('xxx', '条件1配置项');
})
->when('=', 2,function ($form) {
$form->text('xxx', '条件2配置项');
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# richHtml 富文本
// 基础使用
$form->richHtml('field', '字段名');
// 简单版富文本
// default 默认的富文本编辑框,包含所有功能
// simple 精简的富文本编辑框,只包含基础功能
$field->editorMode('simple');
// 保存时不经过XSS过滤
// 默认系统保存时会经过XSS过滤,如果是后台应用为了更灵活丰富的样式可选择不过滤XSS
$field->htmlFilter(false);
// 自定义UEditorPlus的属性
$filter->editorOption([
'allowDivTransToP' => false,
'xxx' => 'xxx'
]);
// 设置富文本后台接口
// 后台默认为 modstart_admin_url('data/ueditor')
// 前台用户默认 modstart_web_url('member_data/ueditor')
$field->server('xxx');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# select 下拉
// 基本使用
$form->select('field', '字段名');
// 使用Type作为备选项,XxxType是继承BaseType的类
$field->optionType(XxxType::class);
// 使用数组作为备选项
$field->options(['1' => '选项1', '2' => '选项2']);
// 使用数组作为备选项
$field->optionArray([['id' => 1, 'name' => '选项1'], ['id' => 2, 'name' => '选项2']],'id','name');
// 使用模型作为备选项
$field->optionModel(ForumCategory::class,'id','title');
// 使用模型作为备选项(简单条件筛选)
$field->optionModel(ForumCategory::class,'id','title',['status'=>1]);
// 使用模型作为备选项,并渲染为树状结构
$field->optionModelTree(ForumCategory::class);
// 使用模型作为备选项,并渲染为树状结构(简单条件筛选)
$field->optionModelTree(ForumCategory::class,'id','pid','title','sort',['status'=>1]);
// 条件
$form->select('field', '字段名')
->when('=', 1, function ($form) {
$form->text('xxx', '条件1配置项');
})
->when('=', 2,function ($form) {
$form->text('xxx', '条件2配置项');
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# selectRemote 下拉(远程)
$form->selectRemote('seriesId', '剧集')
// 指定远程数据源
->server(modstart_admin_url('path/to/select_remote'))
// 显示时查找的数据字段
->viewWithModel(XxxModel::class,'id','title');
1
2
3
4
5
2
3
4
5
远程数据源接口需要返回
{
"code": 0,
"data": {
"options": [
{"value": 1, "label": "选项1"},
{"value": 2, "label": "选项2"}
]
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
系统封装好了参数可以直接试用,远程数据源可以直接调用以下方法返回
class XxxController extends Controller
{
public function selectRemote()
{
return SelectRemote::handleModel(XxxModel::class,'id','title');
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# switch 开关
$form->switch('field', '字段名');
// 条件判断
$form->switch('field', '字段名')
->when('=',true, function ($form) {
$form->text('xxx', '开启配置项');
})
->when('=', false,function ($form) {
$form->text('xxx', '关闭配置项');
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# tags 标签
$form->tags('field', '名称');
1
# text 单行文本
$form->text('field', '名称');
1
# textarea 多行文本
$form->textarea('field', '字段名');
1
# time 时间
$form->time('field', '字段名');
1
# tree 树状组件
$form->tree('field', '名称');
1
# type 类型
// 基础用法
$form->type('field', '字段名');
// 定义BaseType,同时指定类型颜色
$field->type(XxxStatus::class)
1
2
3
4
5
2
3
4
5
# values 多值
$form->values('field', '字段名');
1
# video 视频
$form->video('field', '字段名');
// 使用用户视频库
$form->video('field', '字段名')
->server(modstart_web_url('member_data/file_manager/video'));
1
2
3
4
2
3
4