活力39280
在线时间13640 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 107425
- 主题
- 5630
- 回帖
- 26661
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、需求背景
论坛需要在对帖子执行管理操作时(如屏蔽、删除、移动、精华、置顶等)向帖子作者发送邮件通知,目的是吸引用户回流,让用户及时了解自己的帖子被管理的情况。
需求覆盖所有管理操作类型:
- 面向回帖:屏蔽、解除屏蔽、删除回帖、置顶回复、警告
- 面向主题:删除主题、关闭/打开、移动、置顶/解除置顶、精华/解除精华、推荐/解除推荐、高亮/解除高亮、分类、提升/下沉、定时操作等
二、技术难点
| 难点 | 说明 | | 操作入口分散 | 管理操作有两个不同的入口:forum_topicadmin.php 处理回帖操作,topicadmin_moderate.php 处理主题操作 | | 数据结构不同 | 两个入口传入的数据格式完全不同,无法共用同一套函数 | | AJAX 干扰 | 管理操作通过弹窗 AJAX 提交,邮件发送不能影响弹窗正常关闭 | | 批量操作 | 一次可操作多个帖子,需要合并同一用户的多个通知,超过阈值需入队 | | 操作代码中文化 | Discuz! 中 $modaction 变量在翻译前是英文代码(如 BNP、DEL),翻译后变成中文,需在翻译前拦截 |
三、解决方案
3.1 两套函数分别处理不同入口
| 函数 | 面向对象 | 调用位置 | 处理操作 | | send_topicadmin_notification | 回帖 | forum_topicadmin.php | 屏蔽、删除回帖、警告、置顶回复 | | send_topicadmin_notification_universal | 主题 | topicadmin_moderate.php | 删除主题、移动、置顶、精华、高亮等 |
为什么不能共用?
- 数据格式不同:回帖传入 $resultarray['reasonpm']['data'],主题传入 $threadlist
- 字段不同:回帖有 pid、first,主题没有;主题有 subject,回帖没有
- 分开处理更清晰、更易维护
3.2 静默模式确保 AJAX 正常
- $is_ajax = !empty($_G['inajax']) || defined('IN_AJAX');
- if ($is_ajax) {
- @error_reporting(0);
- @ini_set('display_errors', 0);
- }
- // ... 邮件发送逻辑 ...
- if ($is_ajax) {
- @error_reporting(E_ALL);
- }
复制代码
3.3 批量操作合并通知 + 阈值入队
- 同一用户的多个帖子合并为一封邮件
- 操作数 > 10 条时,邮件任务入队 pre_common_mail_queue,由 crontab 每5分钟发送
- 操作数 ≤ 10 条时,直接发送
3.4 在翻译前调用(使用英文代码)
- // 在 topicadmin_moderate.php 中,翻译 $modaction 之前调用
- send_topicadmin_notification_universal($threadlist, $modaction);
- // 之后才翻译成中文用于站内通知
- $modactioncode = lang('forum/modaction');
- $modaction = $modactioncode[$modaction];
复制代码
四、涉及文件
| 文件 | 绝对路径 | 作用 | | forum_topicadmin.php | /source/module/forum/forum_topicadmin.php | 主入口,定义两个函数,调用回帖通知 | | topicadmin_moderate.php | /source/include/topicadmin/topicadmin_moderate.php | 主题操作入口,调用主题通知 | | function_delete.php | /source/function/function_delete.php | 清理旧的删除邮件代码(已注释) |
五、清理旧代码
function_delete.php 中原有的删除邮件通知代码已注释(实时发送、模板简陋、无操作人、无链接),统一由新函数处理。
六、调试日志
调试日志文件位置:/data/log/topicadmin_debug.log
- cat /data/log/topicadmin_debug.log
复制代码
七、技术沉淀
| 项目 | 经验总结 | | 数据格式分析 | 先分析两个入口的数据结构差异,再设计函数 | | 英文代码拦截 | 在翻译前使用英文代码做映射,避免中文匹配问题 | | AJAX 静默 | 邮件发送不能干扰 AJAX 响应,必须关闭错误输出 | | 批量合并 | 同一用户的多个通知合并为一封,避免邮件轰炸 | | 队列阈值 | 大量操作时入队而非实时发送,保证页面响应 | | 函数分离 | 数据格式不同时,宁可代码重复也要保持清晰 |
八、env-base 分支更新
已在以下章节补充:
- 第九节(目录结构与关键路径):source/module/forum/forum_topicadmin.php、source/include/topicadmin/topicadmin_moderate.php 新增邮件通知函数
- 第十二节(管理操作邮件通知):新增完整的技术说明
九、未来展望
- 如需扩展更多操作类型,在 $action_map 映射表中补充即可
- 如需修改邮件模板,在函数中的 $mail_message 构建部分调整
- 如需调整队列阈值,修改 $batch_threshold = 10 即可
|
|