字段引擎
字段 schema 的格式、校验规则,以及怎么增加一种新的字段类型。
schema 格式
{
"fields": [
{"key":"price", "label":"价格", "type":"number", "required":true, "filter":true},
{"key":"brand", "label":"品牌", "type":"select", "options":["甲","乙"]},
{"key":"gallery","label":"图集", "type":"images"}
]
}
字段属性
| 属性 | 说明 |
|---|---|
key | 字段标识。小写字母开头,30 字符内,不能与内置字段重名 |
label | 显示名称,最长 40 字 |
type | 字段类型,必须在已注册的类型表里 |
required | 是否必填 |
options | 选项值,最多 50 个 |
default | 新建内容时的默认值 |
hint | 输入框下方的填写提示 |
filter | 是否参与前台查询。只有部分类型支持 |
内置字段名是保留的
以下名字已被内容主表占用,不能用作自定义字段标识:
id cid model title alias summary content thumb ext_data
hits top sort status publish_time author_id
created_at updated_at reject_reason url
一套 schema,两处使用
内容模型和自定义表单共用同一份 schema 格式、同一个渲染器、同一个校验器。 新增一种字段类型时,两处会同时获得这种能力,不存在两套并行逻辑。
校验发生在哪里
- 后台表单:前端做基础校验,提升体验
- 服务端:重新按 schema 逐字段校验,不信任任何前端提交
- 入库前:下拉与单选的值如果不在选项列表里,直接丢弃,避免脏数据
第三点值得强调:即使有人手工构造请求塞进一个不存在的选项值,也不会被写进数据库。
增加一种字段类型
在字段类型注册表里加一项,然后补上它的渲染分支与校验分支即可, 内核其它地方不需要改动 —— 模板层不必理解具体类型,它拿到的是一段已经渲染好的控件 HTML。