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
相关产品推荐
相关产品推荐

