- 发帖模板ID post_template版本 1.0.0插件制作者 cxk123售价 30 积分2395 行 / 129.5 KBHook / 路由 / 后台页把「发帖只能写标题 + 正文」变成**结构化发帖**:版主为版块定义一组带类型的字段收费插件安装说明购买后点击“授权码”获取一次性授权码;在后台 > 插件广场点击在线安装或更新,并填写该授权码。已购买用户更新免费:每次在线安装或更新前,重新点击“授权码”获取新的一次性授权码即可,无需再次购买;也可直接下载新版后用后台“插件上传”更新。尊重并感谢他人劳动,请勿传播代码。app/plugins/post_template/plugin.php插件预览6 张开发日志已有 1 条
此项目接受所有登录用户协助维护和提交更新。
主楼 版本 1.0.0 更新:
首次上架(1.0.0)。市场里 发帖模板 / 结构化发帖 / 结构化 / 帖子模板 / 主题模板 / 表单模板 / 自定义字段 / 模板字段 /
表单构建 / topic_template / post_template / custom_field / form_builder / 模板化 / 字段 这一族词
此前双源 0 命中(全目录 392 条 + 站点两视图 431 条,按 id、按 6 个中文名、按全文三种查法);
核心侧也没有承载能力:app_topics只有title+body(Setup.php:142),没有任何地方挂结构化值。
于是版块的「必须填的信息」只能写在帖子正文里靠自觉:租房帖少了租金、活动帖少了时间、招聘帖少了岗位,
读者要读完整段才知道;版主想按「地铁 / 成色 / 预算」筛帖,只能靠人肉翻。
这一款补的是这件事:**版主为版块定义带类型的字段 → 发帖时勾模板按字段填 → 主题页顶部生成只读信息卡 →
读者能按字段值找帖。它不改帖子正文、不发积分、不做审核、不碰附件**。- 版主定义字段(后台 tab):一个版块可以有多个模板,每个模板一组字段,六种类型 —— 单行文本 /
多行文本 / 单选 / 多选 / 数字 / 链接;每个字段单独设「必填」与「档位」(公开 / 仅作者与团队可见),
还有选项清单与长度上限。模板三种状态(草稿 / 已发布 / 已归档)与两档可见性(公开模板 / 内部模板)
都走产品路径的 CAS 状态机(UPDATE … WHERE id=? AND status=?+rowCount()===1),
两个会话同时发布同一个模板只有一个成功。- 发帖时按模板填:发帖表单里多一个「结构化发帖」区块(核心
topic.form_extra):勾一个模板、
按字段填。校验全在服务端(必填 / 选项合法性 / 数字格式 / 链接协议 / 超长拒绝而不是悄悄截断),
不过就err()直接中止 —— 零落库,不会出现「先发出去再补」。
零前端脚本:assets只有一段 CSS,控件全是原生 radio / checkbox / select / textarea。- 主题页顶部的只读信息卡:发帖时填的值在主题页标题下方成卡展示(模板名 + 字段集版本 + 逐行标签值,
链接类字段渲染成
rel="nofollow noopener"的外链)。topic.after_view预载 1 条、
topic.template渲染期零查库 —— 楼层数从 8 涨到 16,主题页自有语句恒为 1。- 快照冻结,历史帖子不会被后来改的模板篡改:字段的标签 / 类型 / 选项 / 长度 / 值一起冻结进
data_json,模板后来改名、删字段、连整行模板都删掉,已经发出去的帖子卡片逐字不变;
模板行不存在时列表与台账给「原主题已删除 / 模板已删除」占位块,不 404 也不破版。- 隐私是构造性的,不是查询期过滤:检索引擎用的
search_text只由公开档字段的值拼成 ——
敏感字段的值根本不进索引,所以连作者本人都搜不到自己的敏感值(宁可搜不到,不可搜得到);
卡片 / 详情 / 检索三个面共用同一对可见性函数(一条 SQL 谓词 + 一条 PHP 判据),不会随页面漂移。
默认档位是最严的那一档:新建字段默认「仅作者与团队可见」,新建模板默认「内部模板」。- 每人每天用模板发帖有上限(可关):配额用
UPDATE … SET used=used+1 WHERE user_id=? AND used<?
抢占(并发下只放行一条);主题被删除时在核心的删除事务里清行并归还名额;计划任务按「当天实际落库的
填单数」精确重建(DELETE+INSERT … SELECT … GROUP BY两条语句,兜住预留后落库被拒的保守泄漏)。- 悬空引用不崩页:主题被绕过产品路径删掉之后留下的填单,团队面显示占位块,并由计划任务按保留期清理
(后台另有「立即清理悬空填单」按钮);任务先写认领令牌批量认领、再按令牌回读,循环体内零查库。
- 自有表、零核心写入:五张
plugin_post_template_*表(templates / fields / fills / events / quota)+
八枚具名索引 + 三个唯一键(
(forum_id,tkey)/(template_id,fkey)/fills.topic_id);
对app_*只有 SELECT;app.boot只比一个结构版本戳(0 条 SQL)就能幂等自愈建表补列;
卸载把表、索引、结构戳一起清干净。- 三驱动可移植:无窗口函数、无
db_driver()分支、不手写ON CONFLICT/INSERT IGNORE
(幂等写入走核心
app_db_insert_ignore())、时间一律 unix 秒整数、建删表索引只走app_db_*。- 页面级无 N+1:首页增量 0(启用 = 停用,差值实测 0);发帖表单 ≤4 条;主题页恒 1 条;
模板库 4 条、按字段找帖 4 条、我的 4 条、填单详情 3 条、后台台账 8 条 —— 行数翻倍后语句数不变。
本版为 v1.0.0 首次上架:验收套件 508 项通过 / 0 项失败(九节:私有副本引导 / 结构与七道门禁 /
写入与校验 / 快照冻结 / 权限矩阵 4 身份 × 3 状态 × 3 面 / 隐私三面同源 / 并发 / 查询预算 / 卸载重装自愈),
七道静态门禁 0 违规 / 0 待人工确认,全仓suite_integrity_audit全 ✓。插件质量报告
插件:
post_templateHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 app.boot 全站请求启动 否 5 - - - 写 plugin_post_template_quota, plugin_post_template_fills, plugin_post_template_templates, plugin_post_template_fields, plugin_post_template_events sidebar.feature_links 首页/侧栏快捷功能 否 5 - - - - topic.after_view 主题查看页完成加载 否 4 - - - 读 plugin_post_template_fills user.menu_links 个人卡片/移动端我的菜单(展示位置:个人卡片) 否 4 - - - - topic.after_save 主题保存后 否 3 - - - 写 plugin_post_template_fills, plugin_post_template_events topic.before_save 主题发布/编辑表单提交 否 3 - - - 写 plugin_post_template_quota;读 plugin_post_template_templates, plugin_post_template_fields, plugin_post_template_fills topic.before_delete 主题删除操作 否 2 - - - 写 plugin_post_template_events, plugin_post_template_fills, plugin_post_template_quota topic.form_extra 主题发布/编辑表单 否 2 - - - 读 plugin_post_template_templates, plugin_post_template_fields, plugin_post_template_quota, plugin_post_template_fills topic.template 非系统hook 否 1 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_post_template_templates字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_post_template_fields字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_post_template_fills字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_post_template_events字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析 plugin_post_template_quota字段 类型 可空 默认值 约束 - 动态定义 - - 无法静态解析