找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 25|回复: 0

[维护日志] [2026-07-08] [功能] [合并操作邮件通知] - 主题合并操作邮件通知与站内通知功能实现

[复制链接]
  • 打卡等级:本地老炮

9337

威望

7448

金钱

1万

贡献

管理员

自由的灵魂

积分
107434
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-2
发表于 2026-7-9 10:08:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

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

  1. $resultarray = array(
  2.         'redirect'        => "forum.php?mod=forumdisplay&fid={$_G['fid']}",
  3.         'reasonpm'        => ($sendreasonpm ? array('data' => array($other), 'var' => 'thread', 'item' => 'reason_merge_target', 'notictype' => 'post') : array()),
  4.         'reasonvar'        => array(
  5.             'source_subject' => $other['subject'],
  6.             'target_tid' => $thread['tid'],
  7.             'target_subject' => $thread['subject'],
  8.             'modaction' => $modaction,
  9.             'reason' => $reason
  10.         ),
  11.         'modtids'        => $thread['tid'],
  12.         'modlog'        => array($thread, $other)
  13. );

  14. // ========= 合并操作邮件通知 =========
  15. if (!empty($other) && !empty($modaction)) {
  16.     $merged_threadlist = array($other);
  17.     send_topicadmin_notification_universal($merged_threadlist, $modaction);
  18. }
  19. // ========= 邮件通知结束 =========
复制代码


文件二:forum_topicadmin.php —— 添加 MRG 映射

  1. $action_map = array(
  2.     // ... 原有映射 ...
  3.     'MRG' => '合并',
  4. );
复制代码


文件三:forum_topicadmin.php —— 操作人免通知

  1. foreach ($users as $uid => $user) {
  2.     if ($uid == $_G['uid']) {
  3.         continue;  // 操作人自己的主题不发送邮件
  4.     }
  5.     // ... 邮件构建逻辑
  6. }
复制代码


文件四:lang_notification.php —— 新增语言项

  1. 'reason_merge_target' => '您的主题《{source_subject}》已被合并到主题《<a href="forum.php?mod=viewthread&tid={target_tid}">{target_subject}</a>》中。',
复制代码


3、最终实现效果

场景站内通知邮件通知
被合并主题的作者✅ 收到,含目标主题链接✅ 收到,含目标主题链接
目标主题的作者❌ 不通知❌ 不通知(如果为操作人则跳过)
操作人(管理员)❌ 不通知❌ 不通知


4、重要技术沉淀

需更新到固化摘要:

  1. 二十五、合并操作邮件通知(2026-07-08)

  2. 功能:主题被合并时,通知被合并主题的作者,包含目标主题名称和链接
  3. 涉及文件:
  4.   - source/include/topicadmin/topicadmin_merge.php
  5.   - source/module/forum/forum_topicadmin.php
  6.   - source/language/lang_notification.php
  7. 关键逻辑:
  8.   - 合并操作的英文代码为 MRG
  9.   - 通知发送给被合并主题的作者($other),而非目标主题作者
  10.   - 站内通知使用 reason_merge_target 语言项
  11.   - 操作人(管理员)不给自己发邮件
复制代码


踩坑点:

踩坑正确做法
误以为合并操作代码是 MERGE实际是 MRG
reasonvar 中只传 tid 和 subject需要传递 source_subject、target_tid、target_subject
通知发送给目标主题作者应发送给被合并主题作者($other)
操作人给自己发邮件增加 if ($uid == $_G['uid']) continue; 跳过


5、进一步优化可能性

  • 合并前询问:在合并操作前增加确认弹窗,让操作人选择是否发送通知
  • 批量合并:支持多个主题合并时,每个被合并主题的作者都收到通知
  • 模板增强:邮件模板中增加更详细的合并前后对比信息
  • 合并日志:在后台记录所有合并操作日志,便于追溯

不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图

GMT+8, 2026-10-2 01:30 , Processed in 0.096226 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表