You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle技术咨询:如何创建带触发邮件按钮的简单Module活动

在Moodle中创建带邮件触发按钮的自定义模块活动

一、核心实现思路

要完成这个需求,你需要搭建一个符合Moodle插件规范的极简活动模块,核心包含两部分:模块基础框架(让Moodle识别并加载),以及点击按钮触发邮件发送的逻辑处理。

二、具体实现步骤

1. 创建模块基础目录结构

在Moodle的mod/目录下新建文件夹emailbutton,至少包含以下文件:

  • version.php:插件版本信息(Moodle识别插件的核心文件)
  • db/access.php:权限控制配置
  • lib.php:模块核心功能函数
  • view.php:前端页面(显示按钮并处理点击逻辑)

2. 编写version.php

示例代码(需对应你的Moodle版本调整requires值):

<?php
defined('MOODLE_INTERNAL') || die();

$plugin->component = 'mod_emailbutton';
$plugin->version = 2024052000;
$plugin->requires = 2022041900; // 对应Moodle 4.1版本,可根据实际修改
$plugin->maturity = MATURITY_STABLE;
$plugin->release = '1.0';

3. 配置权限(db/access.php)

设置基础权限,允许教师添加、学生查看模块:

<?php
defined('MOODLE_INTERNAL') || die();

$capabilities = [
    'mod/emailbutton:addinstance' => [
        'riskbitmask' => RISK_XSS,
        'captype' => 'write',
        'contextlevel' => CONTEXT_COURSE,
        'archetypes' => [
            'editingteacher' => CAP_ALLOW,
            'manager' => CAP_ALLOW
        ],
        'clonepermissionsfrom' => 'moodle/course:manageactivities'
    ],
    'mod/emailbutton:view' => [
        'captype' => 'read',
        'contextlevel' => CONTEXT_MODULE,
        'archetypes' => [
            'student' => CAP_ALLOW,
            'teacher' => CAP_ALLOW,
            'manager' => CAP_ALLOW
        ]
    ]
];

4. 实现前端页面与按钮逻辑(view.php)

这个页面负责显示按钮,并处理点击后的邮件发送:

<?php
require_once('../../config.php');
require_once($CFG->dirroot.'/mod/emailbutton/lib.php');

$id = required_param('id', PARAM_INT);
$cm = get_coursemodule_from_id('emailbutton', $id, 0, false, MUST_EXIST);
$course = $DB->get_record('course', ['id' => $cm->course], '*', MUST_EXIST);
$moduleinstance = $DB->get_record('emailbutton', ['id' => $cm->instance], '*', MUST_EXIST);

require_login($course, true, $cm);
$context = context_module::instance($cm->id);
require_capability('mod/emailbutton:view', $context);

// 处理按钮点击请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['send_email'])) {
    $admin = get_admin();
    if ($admin) {
        // 组装邮件内容
        $subject = "来自课程【{$course->fullname}】的触发请求";
        $message = "用户【{$USER->fullname}】(ID: {$USER->id}) 点击了邮件触发按钮。";
        // 使用Moodle内置函数发送邮件
        email_to_user($admin, $USER, $subject, $message);
        // 跳转并提示成功
        redirect($PAGE->url, get_string('emailsent', 'mod_emailbutton'), null, \core\output\notification::NOTIFY_SUCCESS);
    } else {
        redirect($PAGE->url, get_string('adminnotfound', 'mod_emailbutton'), null, \core\output\notification::NOTIFY_ERROR);
    }
}

// 设置页面基本信息
$PAGE->set_url('/mod/emailbutton/view.php', ['id' => $cm->id]);
$PAGE->set_title(format_string($moduleinstance->name));
$PAGE->set_heading(format_string($course->fullname));

echo $OUTPUT->header();
echo $OUTPUT->heading(format_string($moduleinstance->name));
// 输出按钮表单
echo '<form method="post" action="">';
echo '<button type="submit" name="send_email" class="btn btn-primary">发送邮件给管理员</button>';
echo '</form>';
echo $OUTPUT->footer();

5. 补充lib.php基础函数

Moodle模块需要标准的实例管理函数:

<?php
defined('MOODLE_INTERNAL') || die();

function emailbutton_add_instance($data, $mform) {
    global $DB;
    $data->timecreated = time();
    $data->timemodified = time();
    return $DB->insert_record('emailbutton', $data);
}

function emailbutton_update_instance($data, $mform) {
    global $DB;
    $data->timemodified = time();
    $data->id = $data->instance;
    return $DB->update_record('emailbutton', $data);
}

function emailbutton_delete_instance($id) {
    global $DB;
    return $DB->delete_records('emailbutton', ['id' => $id]);
}

6. 添加语言包文件

在mod/emailbutton/lang/zh_cn/目录下创建mod_emailbutton.php,定义提示文字:

<?php
defined('MOODLE_INTERNAL') || die();

$string['pluginname'] = '邮件触发按钮';
$string['modulename'] = '邮件触发按钮';
$string['modulenameplural'] = '邮件触发按钮';
$string['emailsent'] = '邮件已成功发送给管理员!';
$string['adminnotfound'] = '未找到管理员账户,无法发送邮件。';
$string['emailbutton:addinstance'] = '添加邮件触发按钮活动';
$string['emailbutton:view'] = '查看邮件触发按钮';

7. 安装并测试模块

  • 登录Moodle后台,刷新页面(或进入「站点管理」->「插件」->「安装插件」),系统会自动检测到新模块
  • 在目标课程中添加「邮件触发按钮」活动
  • 切换到学生账号点击按钮,检查管理员邮箱是否收到邮件

三、进阶优化建议

  • 添加按钮点击日志,便于追踪操作记录
  • 在模块设置中支持自定义收件人(不限于管理员)
  • 增加防重复提交机制(比如添加CSRF令牌)
  • 优化邮件内容,补充课程链接、模块链接等上下文信息

内容的提问来源于stack exchange,提问作者Ganesh Venkatakrishnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:45:59