教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载本文基于仓库中 enrol_guest 升级说明 展开。Moodle 5.0 将访客选课guest access插件中的enrol_guest_enrol_form表单类正式标记为弃用deprecated并推荐改用命名空间化的动态表单类enrol_guest\form\enrol_form。读完本文你将理解这次弃用的来龙去脉、新旧表单类在源码层面的实现差异以及第三方插件和自定义代码需要遵循的迁移路径。一、升级说明原文要点仓库中public/enrol/guest/UPGRADING.md是 Moodle 标准化的升级备注文档其中 5.0 版本段落的「Deprecated」部分记录了一条关键变更类enrol_guest_enrol_form已被弃用应改用enrol_guest\form\enrol_form该变更对应 Moodle 官方追踪器问题单 MDL-84142。这条备注虽短但指向了一次实质性的架构调整访客密码表单从「继承moodleform的传统 PHP 页面内表单」迁移为「基于core_form\dynamic_form的动态模态框表单」。下面结合仓库源码逐一印证。二、被弃用的旧类enrol_guest_enrol_form旧表单类定义在 locallib.php 中仓库源码对其标注了明确的弃用元数据#[\core\attribute\deprecated(replacement: enrol_guest\form\enrol_form::class, since: 5.0, reason: Now a dynamic form is used)] class enrol_guest_enrol_form extends moodleform {可以看到三个关键信息弃用属性使用 PHP 8 属性#[\core\attribute\deprecated]声明since: 5.0指明自 Moodle 5.0 起弃用替代类replacement明确指向新类enrol_guest\form\enrol_form弃用原因Now a dynamic form is used——即改用动态表单机制。此外该类的构造函数在初始化时会主动发出弃用通知public function __construct($actionnull, $customdatanull, $methodpost, ...) { \core\deprecation::emit_deprecation([$this, __FUNCTION__]); parent::__construct($action, $customdata, $method, $target, $attributes, $editable, $ajaxformdata); }这意味着任何仍通过new enrol_guest_enrol_form(...)实例化该类的代码在 Moodle 5.0 运行环境下都会收到运行时弃用告警同时类头注释也以deprecated since Moodle 5.0 - please use {see enrol_guest\form\enrol_form}提示开发者。从旧类实现看它本质上是一个典型的moodleform页面表单通过addElement(password, guestpassword, ...)渲染访客密码输入框携带隐藏字段id课程 ID与instance选课实例 ID在validation()中比对用户输入与实例密码并根据插件配置showhint决定返回「密码错误」还是「带首位字符提示的密码错误」提示文案。三、替代新类enrol_guest\form\enrol_form动态表单新表单类位于 classes/form/enrol_form.php命名空间为enrol_guest\form继承core_form\dynamic_form这与 Moodle 4.x 以来推广的动态表单Dynamic forms架构一致。declare(strict_types1); namespace enrol_guest\form; use core\context\course as context_course; use core_form\dynamic_form; ... class enrol_form extends dynamic_form {3.1 表单定义与验证逻辑新类在definition()中定义了与旧类基本一致的表单字段密码输入 隐藏的id、instance参数并复用了完全相同的密码验证策略public function validation($data, $files) { $errors parent::validation($data, $files); $instance $this-get_instance(); if ($instance-password ! ) { if ($data[guestpassword] ! $instance-password) { $plugin enrol_get_plugin(guest); if ($plugin-get_config(showhint)) { $hint core_text::substr($instance-password, 0, 1); $errors[guestpassword] get_string(passwordinvalidhint, enrol_guest, $hint); } else { $errors[guestpassword] get_string(passwordinvalid, enrol_guest); } } } return $errors; }该验证逻辑与旧类逐行一致业务行为没有变化变化的只是承载机制。3.2 实例获取与访问控制新类通过get_instance()从请求参数读取id课程 ID与instance选课实例 ID并调用enrol_get_instances($courseid, true)校验该访客选课实例确实存在且处于启用状态$instances enrol_get_instances($courseid, true); if (empty($instances[$instanceid]) || $instances[$instanceid]-enrol ! guest) { throw new \moodle_exception(invalidenrolinstance, enrol); } $this-instance $instances[$instanceid] ?? null;同时动态表单必须实现三个权限/路由钩子方法方法职责check_access_for_dynamic_submission()校验未选课用户是否至少能查看课程信息否则抛出coursehidden异常get_context_for_dynamic_submission()返回课程所属父级分类上下文category context用于未选课用户的权限判定get_page_url_for_dynamic_submission()返回动态提交回跳地址/enrol/index.php?id{courseid}instance{instanceid}3.3 提交处理process_dynamic_submission()是动态表单的提交入口调用插件主类的方法$enrol-mark_user_as_enrolled($instance, $this-get_data()-guestpassword)将用户标记为临时访客并写入$SESSION-wantsurl指定的原目标页面或课程首页 URL供前端跳转使用。四、前端流程从整页表单到模态框这次弃用的本质是访客密码输入从「独立整页表单」迁移到了「课程选课页面上的模态框Modal」交互。相关证据在插件前端模块 amd/src/enrol_page.jsexport function initEnrol(instanceId) { ... const button document.querySelector(button[typesubmit][data-instance instanceId ]); if (button) { button.addEventListener(click, (e) { e.preventDefault(); const modalForm new ModalForm({ modalConfig: { title: button.dataset.title, large: false }, formClass: button.dataset.form, args: {id: button.dataset.id, instance: instanceId}, saveButtonText: getString(loginguest, moodle), returnFocus: button, }); ... modalForm.show(); }); } }这段 JS 的逻辑是在课程选课页面查找带有data-instance属性的提交按钮点击后不再跳转到独立表单页而是弹出core_form/modalform模态框通过按钮上的data-form属性值为enrol_guest\form\enrol_form::class动态加载新表单类表单提交成功后根据返回 URL 重定向到课程页面。与之配合插件主类 lib.php 的enrol_page_hook()负责在需要密码的访客选课实例上渲染这个触发按钮并注册 JS 模块$button new single_button( $PAGE-url, get_string(loginguest, moodle), get, single_button::BUTTON_PRIMARY, [ data-id $instance-courseid, data-instance $instance-id, data-form enrol_guest\form\enrol_form::class, data-title $title, ]); $PAGE-requires-js_call_amd(enrol_guest/enrol_page, initEnrol, [$instance-id]);注意data-form已经直接指向了新表单类enrol_guest\form\enrol_form说明插件核心路径在 5.0 已完全切换到动态表单旧类仅保留以兼容第三方代码。五、为什么要迁移动态表单的优势从旧类继承moodleform到新类继承dynamic_form的迁移并非形式主义其收益体现在多个层面无需整页刷新密码校验、错误提示均在模态框内通过 AJAX 完成不打断用户在选课页面的操作流权限判定更精准动态表单提供专门的访问检查钩子check_access_for_dynamic_submission能够在提交前校验未选课用户是否有权看到课程统一表单基础设施Moodle 4.x 起core_form\dynamic_form成为官方推荐的动态交互表单基类新类遵循同一套命名空间规范pluginname\form\classname职责内聚旧类存放在插件根目录的locallib.php全局命名空间新类移入classes/form/并声明declare(strict_types1)更符合 Moodle 插件类自动加载autoload与 PSR 风格组织。从测试角度看仓库的 guest/tests 目录包含external_test.php、validate_password_test.php与 Behat 场景 guest_access.feature覆盖了访客访问及密码校验路径迁移后这些行为由新表单类继续支撑。六、第三方代码迁移指南对于在自定义插件或本地代码中直接使用旧表单类的开发者建议按以下步骤迁移替换类引用将new enrol_guest_enrol_form(...)或表单类常量引用替换为enrol_guest\form\enrol_form改用动态表单调用方式若你的场景是弹出模态框可参照 amd/src/enrol_page.js 使用core_form/modalform将formClass设为enrol_guest\form\enrol_form::class并传入{id: 课程ID, instance: 选课实例ID}作为参数移除对旧类构造函数的直接依赖旧类构造函数会调用\core\deprecation::emit_deprecation()发出运行时告警保留旧调用会污染日志必要时依赖消息路由若无法立即迁移可在升级前通过事件日志确认哪些路径仍在使用旧类逐一定位替换。七、相关配置与版本信息围绕访客选课表单插件的可配置项定义在 settings.php与表单验证逻辑直接相关配置项类型默认值对表单的影响enrol_guest/requirepasswordcheckbox0启用后新建访客选课实例必须设置密码表单密码必填enrol_guest/usepasswordpolicycheckbox0启用后密码需满足站点密码策略validation()会调用\core\authentication\password::check_policy()校验enrol_guest/showhintcheckbox0密码错误时是否提示密码首位字符passwordinvalidhint文案enrol_guest/defaultenrolcheckbox1新建课程时是否默认添加访客选课实例enrol_guest/statusselectadvanced禁用默认实例的启用/禁用状态插件版本定义见 version.php当前版本为2026042000要求 Moodle 版本不低于2026041000。在升级到 5.0 之后核心代码路径已完全基于动态表单旧的enrol_guest_enrol_form仅作为向后兼容的遗留类存在后续大版本可能被彻底移除。小结public/enrol/guest/UPGRADING.md中 5.0 的这条弃用备注背后是一次完整的表单架构现代化enrol_guest_enrol_formmoodleform整页表单被enrol_guest\form\enrol_formdynamic_form模态框表单取代。仓库源码明确印证了新旧两类的实现差异、前端 ModalForm 的接入方式以及插件配置的联动逻辑。第三方开发者应尽快将引用切换到新类以获得无整页刷新的用户体验、更精确的权限校验以及与 Moodle 官方表单基础设施的一致性。赞分享教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载相关推荐Moodle core_calendar 升级指南5.0/5.2 弃用与移除 API 全解析及迁移实战Moodle core_calendar 升级指南5.0/5.2 弃用与移除 API 全解析及迁移实战 本文以 public/calendar/UPGRADI教育后端前端Moodle 5.0 tool_brickfield 无障碍插件升级指南find_system_areas 弃用与 Chat/Survey 支持移除Moodle 5.0 tool_brickfield 无障碍插件升级指南find_system_areas 弃用与 Chat/Survey 支持移除 导读 t教育后端前端Moodle tool_mfa 插件升级指南5.0/5.2 渲染器重构、因子管理表迁移与语言字符串弃用全解析Moodle tool_mfa 插件升级指南5.0/5.2 渲染器重构、因子管理表迁移与语言字符串弃用全解析 本文围绕 Moodle https://link教育后端前端上一篇Gulp-file-include 项目常见问题解决方案下一篇Sub-Zero字幕搜索揭秘如何从10大提供商中智能匹配最佳字幕创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考