DzzOffice 通知功能(notification_add)调用
通知系统是 DzzOffice 协同办公平台的核心功能之一,它能够及时向用户推送各类重要信息,如审核结果、新内容提醒、任务分配等。本文将系统讲解 DzzOffice 通知功能的调用方法,结合实际案例分析,帮助开发者快速掌握通知系统的实现技巧。
一、通知功能核心方法解析
DzzOffice 的通知功能主要通过dzz_notification::notification_add
静态方法实现,主要流程包括:
- 向指定用户(
$uid
)添加系统通知; - 支持重复通知控制(根据系统配置判断是否更新已有通知,而非新建);
- 自动更新用户的 “未读提醒数”(
newprompt
); - 可关联语言包实现多语言通知,支持自定义跳转链接。
1.1 方法定义
public static function notification_add($uid, // 接收通知的用户UID$type, // 通知类型(需唯一)$note, // 语言包键名(用于获取通知内容)$notevars = [],// 通知变量数组(替换语言包中的占位符)$category = 0, // 通知分类(默认0,无需自定义时可留空)$langfolder = ''// 语言包路径(指定自定义语言文件位置)
)
1.2 核心方法参数详解
参数名 | 作用 | 类型 | 是否必填 | 说明与示例 |
---|---|---|---|---|
$uid | 指定接收通知的用户 | int | 是 | 必须是有效的用户 UID,需确保用户存在(方法内部会通过 getuserbyuid 验证)。示例:1001(用户 UID 为 1001) |
$type | 通知类型标识 | string | 是 | 用于区分不同业务场景,建议保持唯一(避免重复通知误判)。命名建议:业务标识_唯一ID ,示例:article_publish_5 (5 为文章 ID) |
$note | 语言包键名 | string | 是 | 语言包模式下关联模板的核心标识,用于匹配通知标题、正文、跳转链接等模板。示例:article_publish (对应语言包中该键的模板) |
$notevars | 通知变量数组 | array | 否 | 包含语言包变量、自定义内容、业务关联信息等动态数据。示例:['title' => '实名认证', 'url' => 'verify.php'] |
$category | 通知分类 | int | 否 | 用于对通知归类,默认值为0 。示例:1 (归类为"系统通知") |
$langfolder | 语言包路径 | string | 否 | 指定自定义语言包所在文件夹,默认使用系统默认路径。示例:dzz/article 对应 dzz/article/language/zh-cn/lang.php ) |
1.3 $notevars 数组关键字段详解
$notevars 数组用于传递动态内容,关键字段如下:
参数名 | 作用 | 类型 | 是否必填 | 说明与示例 |
---|---|---|---|---|
from_id | 业务关联ID | int/string | 否 | 关联具体业务对象(如应用ID、订单ID),0表示系统通知。示例:102 (关联ID为102的应用) |
from_idtype | 业务类型标识 | string | 否 | 描述from_id 的类型,用于区分业务场景。示例:'app' (表示from_id 是应用ID) |
note_title | 自定义通知标题 | string | 否 | 传递此参数则不调用语言包的$note_title 模板。示例:'新消息提醒' |
note_message | 自定义通知正文 | string | 否 | 传递此参数则不调用语言包的$note 模板。示例:'您有一条新的好友请求' |
note_wx | 自定义微信通知内容 | string | 否 | 传递此参数则不调用语言包的$note_wx 模板。示例:'微信端新消息提醒' |
note_url | 自定义跳转链接 | string | 否 | 传递此参数则不调用语言包的$note_redirecturl 模板。示例:'home.php?mod=msg' |
其他自定义键 | 语言包变量 | mixed | 否 | 需与语言包中的{xxx} 占位符对应。示例:语言包有{title} 则需传递'title' => '审核任务' |
二、调用方法详解
方法一:使用语言包动态生成内容(推荐)
通过语言包定义通知模板,notification_add
方法会自动根据 $note
标识匹配模板,并使用 $notevars
中的变量替换占位符,适用于多语言场景或需统一管理的通用通知。
步骤:
- 定义语言包(如
lang.php
):
$lang = array(// 通知正文模板({title}和{url}为占位符,将被$notevars替换)'profile_moderate' => '有新的待处理{title},<a href="{url}">现在处理</a>',// 微信通知模板'profile_moderate_wx' => '有新的待处理{title}',// 跳转链接模板'profile_moderate_redirecturl' => '{url}',// 通知标题模板'profile_moderate_title' => '{title} 审核提醒',
);
- 调用通知方法:
// 获取管理员用户列表(示例:向管理员发送审核通知)
foreach (C::t('user')->fetch_all_by_adminid(1) as $value) {if ($value['uid'] != $_G['uid']) { // 排除当前用户$notevars = array('from_id' => 0, // 0 表示系统通知'from_idtype' => 'app', // 关联类型为应用'url' => 'admin.php?mod=member&op=verify&vid=' . $vid, // 跳转链接变量{url}'author' => getglobal('username'), // 发送人'authorid' => getglobal('uid'), // 发送人 ID'dataline' => dgmdate(TIMESTAMP), // 时间'title' => $_G['setting']['verify'][$vid]['title'], // 审核标题变量{title});dzz_notification::notification_add($value['uid'], // 接收人 ID'profile_moderate_' . $vid, // 通知类型'profile_moderate', // 语言包标识$notevars);}
}
优点:
- 多语言支持:通过切换语言包即可适配不同语言环境(如中文、英文),无需修改代码。
- 维护便捷:通知模板集中管理,修改语言包可批量更新所有相关通知内容。
- 动态灵活:同一模板可通过不同
$notevars
生成多样化内容(如不同审核类型的通知)。
缺点:
- 依赖语言包:若语言包缺失
$note
对应的键,会导致内容显示异常(如直接显示键名)。 - 模板限制:需提前规划占位符,不适合完全个性化的临时通知场景。
方法二:自定义内容(不依赖语言包)
直接通过 $notevars
的 note_title
、note_message
等字段指定内容,无需语言包支持,适用于个性化、临时或无需多语言的场景。
示例:
// 新用户注册欢迎通知(自定义内容)
$welcomemsgtitle = "欢迎加入平台!";
$welcomemsgtxt = "亲爱的用户,感谢您的注册,点击 <a href='home.php'>进入首页</a> 开始使用。";$notevars = array('from_id' => 0, // 系统通知'from_idtype' => 'welcomemsg', // 欢迎消息类型'note_title' => $welcomemsgtitle, // 自定义标题(不调用语言包)'note_message' => $welcomemsgtxt, // 自定义正文(不调用语言包)'note_url' => 'home.php', // 自定义跳转链接
);dzz_notification::notification_add($result['uid'], // 接收人 ID(新注册用户 ID)'register_welcomemsg_' . $result['uid'], // 通知类型'register_welcomemsg', // 语言包标识(此处被自定义内容覆盖,可留空)$notevars
);
优点:
- 灵活度高:可完全自定义通知内容,适合临时、个性化场景。
- 无依赖:无需维护语言包,降低前期配置成本。
- 快速实现:直接写死内容,无需考虑占位符与变量的对应关系。
缺点:
- 多语言适配困难:需手动处理不同语言,无法通过语言包批量切换。
- 代码冗余:通知内容分散在代码中,修改需逐个调整,维护成本高。
两种方法的对比与适用场景
维度 | 方法一(语言包) | 方法二(自定义内容) |
---|---|---|
多语言支持 | 支持(推荐) | 不支持(需手动处理) |
维护成本 | 低(集中管理语言包) | 高(内容分散在代码中) |
灵活度 | 中等(依赖模板) | 高(完全自定义) |
适用场景 | 通用通知(如审核提醒、任务通知) | 临时/个性化通知(如注册欢迎、活动) |
三、进阶技巧
3.1 通知去重逻辑
系统通过 $_G['setting']['notificationrepetition']
控制重复通知行为:
- 若关闭(默认):当
from_id
、from_idtype
、uid
、type
完全相同时,视为重复通知,会更新已有通知的from_num
(累计次数)和时间戳,而非新建通知。 - 若开启:允许重复发送,每次调用都会新增一条通知。
3.2 $type 唯一性设计
$type
是判断通知唯一性的核心参数之一,建议按以下规则命名:
// 格式:业务标识 + 唯一ID(避免不同业务的通知被误判为重复)
$type = 'task_assign_' . $taskid; // 任务分配通知(关联任务ID)
$type = 'doc_share_' . $docid . '_' . $uid; // 文档分享通知(关联文档ID和接收人ID)
3.3 应用关联与系统通知
- 关联应用时,通过
C::t('app_market')->fetch_appid_by_mod
获取应用 ID 并赋值给from_id
,from_idtype
设为'app'
。 - 系统通知直接将
from_id
设为0
,from_idtype
可设为'system'
或留空。
四、总结
DzzOffice 通知功能通过语言包模式和自定义模式,满足了不同场景下的通知需求。核心是理解 $notevars
与语言包的变量替换逻辑,以及 $type
和 from_id
的唯一性约束。
- 对于需长期维护、多语言支持的通用通知(如审核提醒、任务通知),推荐使用语言包模式。
- 对于临时、个性化的通知(如注册欢迎、活动推送),推荐使用自定义模式。
根据业务场景灵活选择,可在灵活性与可维护性之间取得平衡,充分发挥通知系统的价值。