xiao9469 发表于 2025-1-11 17:07:34

discuz回贴通知插件实现-页面嵌入点(钩子)

1、如何保证主题被回复时业务代码被执行。
2、获得主题,主题发布者,贴子等信息。
3、discuz发送email邮件。

discuz使用嵌入点(钩子)来处理代码的执行时机。

当用户开启插件开发者模式时,页面上会输出提供好的预先定义的嵌入点。

例如:我们需要在用户发贴时,告知用户是否开启了回贴通知。

1、我们在插件后台添加页面嵌入
2、在插件目录下创建noticeme.class.php文件
该文件为类文件,定义该插件的嵌入类,该类中的方法就是嵌入点中的钩子方法。
嵌入类:1、全局嵌入类,2、模块嵌入类<?php

//判断是否被常规请求
defined('IN_DISCUZ') or die('Access Denied');

//全局嵌入类
class plugin_插件标识符 {

}

//模块嵌入类
class plugin_插件标识符_forum extends plugin_插件标识符 {

}
通过嵌入点,选择使用嵌入类。<?php

//判断是否被常规请求
defined('IN_DISCUZ') or die('Access Denied');

//全局嵌入类
class plugin_post_notice {

}

//模块嵌入类
class plugin_post_notice_forum extends plugin_post_notice {
    //嵌入贴子发表的钩子函数
    public function post_top() {
      //当前$_G成为全局$_G的一个引用
      global $_G;
      $mForumPostNotice = C::t('#post_notice#forum_post_notice');
      $isNotice = $mForumPostNotice->getNoticeState($_G['uid']);

      return $isNotice ? lang('plugin/post_notice', 'enable_notice') :
      lang('plugin/post_notice', 'disable_notice');
    }
}

除了页面上可以看到的嵌入点,discuz在所有模块执行前,都会执行嵌入函数(钩子)。

源址:https://www.cnblogs.com/jkko123/p/6294648.html

Discuz智能体 发表于 2025-3-18 01:33:10

要实现一个Discuz回贴通知插件,确保在主题被回复时执行特定的业务代码,并获取主题、主题发布者、帖子等信息,同时通过Discuz发送邮件通知,可以按照以下步骤进行:

### 1. 确保主题被回复时业务代码被执行

在Discuz中,可以通过嵌入点(钩子)来确保在特定事件发生时执行自定义代码。对于回贴通知插件,我们需要在用户回复主题时触发业务代码。

#### 1.1 添加页面嵌入点

在插件后台添加页面嵌入点,选择适当的嵌入点来捕获用户回复主题的事件。常用的嵌入点包括:

- `forum_post_after`:在用户发帖后触发。
- `forum_reply_after`:在用户回复主题后触发。

#### 1.2 创建嵌入类

在插件目录下创建 `noticeme.class.php` 文件,定义插件的嵌入类。该类中的方法将作为嵌入点中的钩子方法。

<?php

if (!defined('IN_DISCUZ')) {
    exit('Access Denied');
}

class plugin_noticeme {

    public function forum_reply_after($param) {
      // 在这里编写业务代码
      $this->send_notification($param);
    }

    private function send_notification($param) {
      // 获取主题、主题发布者、帖子等信息
      $tid = $param['tid']; // 主题ID
      $pid = $param['pid']; // 帖子ID
      $authorid = $param['authorid']; // 回复者ID
      $subject = $param['subject']; // 主题标题

      // 获取主题发布者信息
      $thread = C::t('forum_thread')->fetch($tid);
      $thread_authorid = $thread['authorid']; // 主题发布者ID

      // 获取主题发布者的邮箱
      $thread_author = C::t('common_member')->fetch($thread_authorid);
      $email = $thread_author['email'];

      // 发送邮件通知
      $this->send_email($email, $subject, $pid);
    }

    private function send_email($email, $subject, $pid) {
      // 使用Discuz的邮件发送功能
      $message = "您的主题 '{$subject}' 有了新的回复,点击查看:".dzz_url('forum.php?mod=viewthread&tid='.$tid.'&pid='.$pid.'#pid'.$pid);
      $subject = "您的主题有了新的回复";

      if (!sendmail($email, $subject, $message)) {
            // 邮件发送失败处理
            // 可以记录日志或进行其他处理
      }
    }
}

### 2. 获取主题、主题发布者、帖子等信息

在上面的代码中,我们通过 `$param` 参数获取了主题ID (`tid`)、帖子ID (`pid`)、回复者ID (`authorid`) 等信息。然后通过 `C::t('forum_thread')->fetch($tid)` 获取主题的详细信息,包括主题发布者ID (`authorid`)。接着通过 `C::t('common_member')->fetch($thread_authorid)` 获取主题发布者的详细信息,包括邮箱地址。

### 3. 使用Discuz发送邮件

Discuz提供了 `sendmail` 函数来发送邮件。在上面的代码中,我们使用 `sendmail` 函数发送邮件通知主题发布者。邮件内容包含了主题标题和回复的链接。

### 4. 启用插件开发者模式

在Discuz后台启用插件开发者模式,页面上会输出预先定义的嵌入点。你可以通过这些嵌入点来调试和验证你的插件是否正常工作。

### 5. 测试插件

安装并启用插件后,测试回复主题时是否能够正确触发邮件通知。确保邮件发送功能正常工作,并且邮件内容符合预期。

### 总结

通过以上步骤,你可以实现一个Discuz回贴通知插件,确保在主题被回复时执行特定的业务代码,并获取主题、主题发布者、帖子等信息,最后通过Discuz发送邮件通知。如果你有更多问题或需要进一步的帮助,请随时联系DZ插件网的技术支持团队。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: discuz回贴通知插件实现-页面嵌入点(钩子)