活力39282
在线时间13640 小时
阅读权限200
管理员
自由的灵魂
- 积分
- 107434
- 主题
- 5630
- 回帖
- 26661
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-2
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1、问题缘起
在已有的管理操作邮件通知体系中(涵盖回帖:屏蔽、删除、警告等;主题:删除、移动、置顶、精华等),发现“合并”操作(MRG)缺失邮件通知和站内通知。当管理员将多个主题合并为一个时,被合并主题的作者无法收到任何通知,不知道自己的主题已被合并到哪里,导致用户体验缺失。
探讨过程中发现的相关问题:
| 问题 | 解决方案 | | 合并操作的英文代码是 MRG 而非 MERGE | 在 $action_map 中添加 'MRG' => '合并' | | 站内通知 reason_merge 没有区分源主题和目标主题 | 新增 reason_merge_target 语言项,包含目标主题链接 | | sendreasonpm() 使用 reasonvar 中的变量填充通知内容 | 修改 reasonvar 传递 source_subject、target_tid、target_subject | | 邮件通知应发送给被合并主题的作者,而非操作人 | 在 send_topicadmin_notification_universal 中增加 if ($uid == $_G['uid']) continue; | | 合并操作没有调用邮件通知函数 | 在 topicadmin_merge.php 中手动调用 |
2、解决方案
(1)简要技术分析:
合并操作通过 topicadmin_merge.php 处理,将 $other(被合并主题)合并到 $thread(目标主题)。邮件通知应发送给被合并主题的作者,告知其主题已被合并到哪个主题。通过在 $resultarray 中传递 reasonvar 变量,利用 sendreasonpm() 发送站内通知;同时手动调用 send_topicadmin_notification_universal() 发送邮件通知。
(2)修改、新增文件列表:
| 操作 | 文件路径 | | 修改 | /source/include/topicadmin/topicadmin_merge.php | | 修改 | /source/module/forum/forum_topicadmin.php | | 修改 | /source/language/lang_notification.php |
(3)关键代码段:
文件一:topicadmin_merge.php —— 修改 $resultarray
- $resultarray = array(
- 'redirect' => "forum.php?mod=forumdisplay&fid={$_G['fid']}",
- 'reasonpm' => ($sendreasonpm ? array('data' => array($other), 'var' => 'thread', 'item' => 'reason_merge_target', 'notictype' => 'post') : array()),
- 'reasonvar' => array(
- 'source_subject' => $other['subject'],
- 'target_tid' => $thread['tid'],
- 'target_subject' => $thread['subject'],
- 'modaction' => $modaction,
- 'reason' => $reason
- ),
- 'modtids' => $thread['tid'],
- 'modlog' => array($thread, $other)
- );
- // ========= 合并操作邮件通知 =========
- if (!empty($other) && !empty($modaction)) {
- $merged_threadlist = array($other);
- send_topicadmin_notification_universal($merged_threadlist, $modaction);
- }
- // ========= 邮件通知结束 =========
复制代码
文件二:forum_topicadmin.php —— 添加 MRG 映射
- $action_map = array(
- // ... 原有映射 ...
- 'MRG' => '合并',
- );
复制代码
文件三:forum_topicadmin.php —— 操作人免通知
- foreach ($users as $uid => $user) {
- if ($uid == $_G['uid']) {
- continue; // 操作人自己的主题不发送邮件
- }
- // ... 邮件构建逻辑
- }
复制代码
文件四:lang_notification.php —— 新增语言项
- 'reason_merge_target' => '您的主题《{source_subject}》已被合并到主题《<a href="forum.php?mod=viewthread&tid={target_tid}">{target_subject}</a>》中。',
复制代码
3、最终实现效果
| 场景 | 站内通知 | 邮件通知 | | 被合并主题的作者 | ✅ 收到,含目标主题链接 | ✅ 收到,含目标主题链接 | | 目标主题的作者 | ❌ 不通知 | ❌ 不通知(如果为操作人则跳过) | | 操作人(管理员) | ❌ 不通知 | ❌ 不通知 |
4、重要技术沉淀
需更新到固化摘要:
- 二十五、合并操作邮件通知(2026-07-08)
- 功能:主题被合并时,通知被合并主题的作者,包含目标主题名称和链接
- 涉及文件:
- - source/include/topicadmin/topicadmin_merge.php
- - source/module/forum/forum_topicadmin.php
- - source/language/lang_notification.php
- 关键逻辑:
- - 合并操作的英文代码为 MRG
- - 通知发送给被合并主题的作者($other),而非目标主题作者
- - 站内通知使用 reason_merge_target 语言项
- - 操作人(管理员)不给自己发邮件
复制代码
踩坑点:
| 踩坑 | 正确做法 | | 误以为合并操作代码是 MERGE | 实际是 MRG | | reasonvar 中只传 tid 和 subject | 需要传递 source_subject、target_tid、target_subject | | 通知发送给目标主题作者 | 应发送给被合并主题作者($other) | | 操作人给自己发邮件 | 增加 if ($uid == $_G['uid']) continue; 跳过 |
5、进一步优化可能性
- 合并前询问:在合并操作前增加确认弹窗,让操作人选择是否发送通知
- 批量合并:支持多个主题合并时,每个被合并主题的作者都收到通知
- 模板增强:邮件模板中增加更详细的合并前后对比信息
- 合并日志:在后台记录所有合并操作日志,便于追溯
|
|