ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Moodle `core_courseformat` 子系统升级指南:从 4.5 到 5.3 的课程格式插件 API 演进与迁移要点

Moodle `core_courseformat` 子系统升级指南:从 4.5 到 5.3 的课程格式插件 API 演进与迁移要点 教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载本指南以 public/course/format/UPGRADING.md 为核心骨架结合当前仓库中core_courseformat子系统public/course/format/classes的源码实现与测试用例系统梳理 Moodle 4.55.3dev 之间课程格式course format插件领域发生的全部 API 新增、变更、弃用与移除事项。阅读完本文你将掌握base、cmactions、sectionactions等核心类的新方法与迁移路径线性导航linear navigation特性的启用方式与底层设置机制活动选择器activity chooser与课程编辑流程的归并方向以及升级自有课程格式插件到 Moodle 6.0 前必须完成的清理清单。一、总览这份升级文档讲什么core_courseformat是 Moodle 中承载课程格式这一插件类型的子系统。课程格式决定课程页面如何组织内容例如 topics 按主题分节、weeks 按周分节、singleactivity 只展示单个活动其插件类必须继承\core_courseformat\base声明见 public/course/format/classes/base.php。该子系统还包含课程编辑时的一系列动作类actions以及负责输出课程页面的渲染器与输出类。UPGRADING.md按版本5.3dev、5.2、5.1、5.0、4.5记录了该子系统的演进。整体脉络可以概括为三条主线动作逻辑集中化把原本分散在course/lib.php、course/view.php、course/mod.php中的课程编辑操作移动、删除、复制、改分组模式、设标记等逐步收敛到core_courseformat\local\cmactions课程模块动作与core_courseformat\local\sectionactions小节动作两个类中并统一由 public/course/format/update.php 这个非 Ajax 入口和core_courseformat_course_updateWeb 服务承载。前端技术栈迁移课程编辑界面从旧式 YUI 模块迁移到基于组件的component-based架构活动选择器全部代码迁入core_courseformat子系统Reactive组件初始化从id选择器改为#id选择器。体验与性能优化新增线性导航、活动概览overview集成、受限制活动的独立访问页等特性同时通过减少无谓的数据库查询例如set_visibility不再返回受影响资源列表来优化性能。二、5.3dev线性导航与内联帮助5.3dev 的三个新增点都围绕课程线性导航linear navigation与格式设置表单展开。2.1uses_linear_navigation()格式是否支持线性导航升级文档指出新增\core_courseformat\base::uses_linear_navigation()方法用于判断某个格式是否支持线性导航。该方法在 public/course/format/classes/base.php 中定义默认返回false需要启用该特性的格式应重写此方法返回true可以借助一个格式设置项来开关。从仓库源码看内置的 topics 格式已经接入该机制。在 public/course/format/topics/lib.php 中format_topics重写了uses_linear_navigation()同时在 public/course/format/topics/settings.php 中通过\core\lang_string(linearnavigationsettings, core_courseformat)等字符串为站点级设置界面提供了启用线性导航的开关weeks 格式在 public/course/format/weeks/lib.php 也调用了相同的辅助方法。2.2 线性导航的底层实现linearnavigationsettings与线性导航配套的核心实现位于 public/course/format/classes/local/linearnavigationsettings.php从中可以还原完整的设置机制设置项名称为enablelinearnav常量SETTING_ENABLE_LINEAR_NAV见该文件第 30 行默认值为启用SETTING_ENABLE_LINEAR_NAV_DEFAULT 1见第 33 行类型为PARAM_BOOL。get_course_format_options_default()返回该格式选项的默认值与类型供格式在get_format_options()中合并使用。get_course_format_options_edit_form()返回编辑表单定义使用select元素呈现否 / 是下拉框并通过inline_help linearnavigationsettings把帮助文本作为设置项下方的静态文本展示——这正是升级文档中提到的inline_help标志的具体应用实例该标志在格式设置元素定义中出现或为true时帮助文本以内联方式渲染在设置项下方。show_navigation_footer()第 129 行起负责决定是否在活动页显示导航底栏只有当当前页面处于某个活动$page-cm ! null、页面尚未有 sticky footer、且页面允许显示导航底栏时才会显示。该逻辑由 public/course/format/classes/hook_listener.php 中的 hook 监听器调用。此外还有一个针对新建课程的 hookafter_form_definition_after_data第 99 行起当站点管理员在格式层面对enablelinearnav做了默认配置后新建课程时该默认值会被自动写入表单元素。测试方面public/course/format/tests/local/linearnavigationsettings_test.php 覆盖了show_navigation_footer()与is_linear_navigation_enabled()两个方法的判定逻辑。2.3 新增两个 Behat 测试步骤升级文档还提到为简化线性导航的测试新增了两个 Behat 步骤课程线性导航应当/不应当可见course linear navigation should/should not be visible。这意味着插件作者在编写 Behat 场景时可以直接断言线性导航底栏的显隐状态而无需自己实现复杂的 UI 模拟。2.4 5.3dev 对插件作者的迁移建议若你的格式希望支持线性导航重写uses_linear_navigation()返回true并建议复用linearnavigationsettings提供的设置定义与默认值逻辑参考 topics 的实现。若你在自己的格式设置表单中自定义帮助文本可以改用inline_help标志让帮助直接以内联静态文本呈现。三、5.2动作类 API 大扩充5.2 是core_courseformat动作层扩充最集中的一个版本几乎全部新增都在cmactions与sectionactions两个类中。3.1cmactions新增移动、删除、分组、复制core_courseformat\local\cmactions定义于 public/course/format/classes/local/cmactions.php5.2 新增的方法均可在此文件中找到对应实现move_before(int $cmid, int $beforecmid)第 645 行把某个课程模块移动到另一个课程模块之前。实现要点先调用delete_mod_from_section()从原小节移除再通过course_add_cm_to_section(..., $beforecm, ...)以插入到目标模块之前的方式加入目标小节随后用update_visibility_in_section()处理跨小节移动时的可见性同步例如移入隐藏小节时自动隐藏模块并保存visibleold以便小节恢复可见时还原。需要注意FEATURE_CAN_DISPLAY为 false 的模块只能放在第 0 节若被移动到非 0 小节会抛出coding_exception。move_end_section(int $cmid, int $targetsectionid)第 684 行把课程模块移动到目标小节的末尾移动后对原小节与目标小节分别执行purge_course_section_cache_by_id()并重建课程缓存。delete(int $cmid, bool $async false)第 260 行完整的模块删除流程——依次调用模块自身的delete_instance、清理试题引用、文件区、日历事件、成绩项、博客关联、完成与可用性数据、标签、能力覆盖与本地角色分配最后删除course_modules记录并从小节序列中移除触发course_module_deleted事件并重建缓存。若$async为 true 且存在插件通过course_module_background_deletion_recommendedhook 建议后台删除则转入delete_async()第 569 行以 adhoc task\core_course\task\course_delete_modules方式异步执行。set_groupmode(int $cmid, int $groupmode)第 239 行设置模块的分组模式$groupmode取值应为NOGROUPS、SEPARATEGROUPS、VISIBLEGROUPS常量之一值未变化时返回false变化时更新course_modules.groupmode并重建缓存。duplicate(int $cmid, ?int $targetsectionid null, ?string $newname null)第 409 行用于取代旧course/lib.php中复制逻辑的新实现。其原理是即时备份 即时恢复用\backup_controllerbackup::TYPE_1ACTIVITY、MODE_IMPORT备份单个活动再用\restore_controllerTARGET_CURRENT_ADDING恢复然后从 restore 任务中定位新 cmid默认追加语言字符串duplicatedmodule即 (copy)后缀重命名并将副本移动到原模块之后优先用move_before插到原模块的后一个模块之前否则用move_end_section最后复制权限覆盖与本地角色并触发course_module_created事件。3.2sectionactions新增标记、可见性、移动core_courseformat\local\sectionactions定义于 public/course/format/classes/local/sectionactions.php5.2 新增set_marker与remove_all_markers分别用于把某个小节设置为课程的当前小节标记、以及清除全部标记。set_visibility(section_info $sectioninfo, bool $visible)第 242 行设置小节可见性并同步该小节内所有活动的可见性。实现中在值未变化时直接返回升级文档特别强调该方法不返回受影响的资源列表以省去一次无用的数据库查询——这是 5.2 针对性能的一次刻意设计调用方不应依赖其返回值。move_after取代旧的move_section_to逻辑的新的小节移动方法。move_at将小节移动到指定位置create_from_object()内部在插入新小节后也会用move_at把小节挪到目标位置见该文件第 66-72 行。配合这些方法sectionactions中还有create()第 171 行、create_delegated()第 144 行创建由组件/插件托管的委托小节等既有能力可供参考。3.3 受限制活动的新页面与统一错误消息5.2 创建了一个基于路由routing的受限页面供用户查看活动信息只有存在可见限制restriction的活动才会出现在该页面同时公开函数course_section_cm_unavailable_error_message()被修改为对所有受限活动返回相同的消息。这意味着当学生因活动可用性限制availability无法访问某个活动时界面呈现统一的不可用提示且可以被路由页面承载而不是散落在各模块各自的错误文案中。3.4activityoverviewbase与activityname_exporter的可见性变更activityoverviewbase类中的$cm属性改为 public 可见性定义于 public/course/format/classes/activityoverviewbase.php允许直接访问课程模块实例。activityname_exporter新增available属性使外部 API 能返回活动相对当前用户的可用状态。overviewtable类新增两个 public 静态方法is_cm_displayable判断课程模块是否应出现在概览表中is_cm_available判断课程模块对当前用户是否可访问从而是否应渲染为链接。3.5 子小节Subsection改为内联展示5.2 起子小节delegated sections例如mod_subsection不再使用独立的子页面而是始终在其所属小节内以内联形式展示委托小节不再显示描述文本。这简化了用户在课程页内的浏览路径也与删除活动后仍保留小节结构的编辑模型保持一致。3.6 5.2 的弃用与移除清单弃用set_section_visible函数改用sectionactions::set_visibility。弃用move_section_to逻辑改用sectionactions::move_after/move_at。弃用并移除所有仅内部使用的reorder_sections用法。正式移除四个 API对应 MDL-87425\core_courseformat\output\local\content\section\availability::availability_info()位于 public/course/format/classes/output/local/content/section/availability.php\core_courseformat\base::get_section_number()位于 public/course/format/classes/base.php\core_courseformat\stateactions::section_move()位于 public/course/format/classes/stateactions.php\core_courseformat\output\section_renderer\core_course_renderer::render_activity_information()位于 public/course/renderer.php。四、5.1活动选择器归并与概览输出体系成型4.1 活动选择器改用core_courseformat_get_section_content_items5.1 起活动选择器activity chooser通过core_courseformat_get_section_content_items获取某个小节可用的模块列表而不是直接从模块清单中过滤。这一变更让格式插件能够精确控制在某个小节里能添加哪些活动。同时对应 MDL-86337活动选择器的全部代码——模板、JavaScript 以及主输出类——都迁入core_courseformat子系统其中core_course\output\activitychooserbutton被移动到core_courseformat\output\local\activitychooserbutton。如果你的主题对活动选择器相关元素做过覆盖override必须按新路径更新代码。4.2 概览输出体系overviewdialog与overviewaction5.1 新增两个概览输出类core_courseformat\output\local\overview\overviewdialog在课程概览页创建对话框元素可组合展示标题、描述以及一组标签值形式的条目。core_courseformat\output\local\overview\overviewaction创建带徽章badge的动作按钮本质是扩展action_link类为按钮文本右侧追加一个徽章使重要动作在课程概览中更醒目由于结构统一也更方便通过 Web 服务导出这类信息。此外core_courseformat\local\overview\overviewfactory新增activity_has_overview_integration方法用于判断某模块是否支持概览集成。4.3 活动概览中的分组过滤与错误处理在activityoverviewbase类中对应 MDL-85852新增三个能力needs_filtering_by_groups()返回当前模块下用户是否需要按分组过滤get_groups_for_filtering()返回用户应配合 groups API 使用的具体过滤条件has_error()当用户试图查看一个设置为独立分组SEPARATE_GROUPS的模块、但自己不属于任何分组时抛出异常。同时activityname类的构造函数新增可选参数$nogroupserror并新增set_nogroupserror()设置器用于在构造后修改该值。4.4modinfo新工具方法对应 MDL-86021modinfo新增get_instance_of()通过模块名 实例 id 直接获取某个cm的实例取代过去仅为了取单个实例而调用get_course_and_cm_from_instance()/get_instances_of()的写法sort_cm_array()按课程页面中的出现顺序对 cm 数组排序。4.5 5.1 的弃用maxsections与numsectionsmaxsections设置被弃用并计划在 Moodle 6.0 移除配套的格式基类方法get_max_sections同步弃用。升级文档明确建议如果格式确实需要最大小节数限制请在自己的格式插件中实现自定义设置项。addsection输出的get_num_sections_data方法不再使用$maxsections参数若你的格式重写了该方法应给参数加上默认值0以兼容新实现。课程格式的numsections选项逐个小节递增/递减课程小节数被弃用也将在 Moodle 6.0 移除。五、5.0编辑流程统一到update.php5.0 是迁移动作最大的一版核心是把课程编辑的非 Ajax 入口统一收编。5.1 新增course/format/update.php非 Ajax 入口新增 public/course/format/update.php URL作为core_courseformat_course_updateWeb 服务的非 Ajax 替代入口。它使用与 Web 服务相同的参数。由此带来的行为变化非 Ajax 删除活动与 Ajax 删除保持一致过去某些格式通过非 Ajax 方式绕过回收站recycle bin删除活动5.0 起非 Ajax 删除也走course/format/update.php全部删除都会经过回收站旧的绕过方式失效。一系列原本通过course/view.php与course/mod.php的 get 动作被弃用包括indent、duplicate、hide、show、stealth、delete、groupmode与marker高亮。插件代码中的直接编辑 URL 应全部替换为course/format/update.php。core_courseformat\base::get_non_ajax_cm_action_url弃用改用get_update_url。5.2 缓存与会话缓存的新控制方式新增core_courseformat\base::invalidate_all_session_caches当课程发生变化需要让所有用户的课程编辑器缓存失效时使用它与仅重置当前用户的session_cache_reset互补。新增after_course_content_updatedhook在通过编辑操作更新课程内容如模块被修改后触发供插件监听课程内容变更。5.3get_generic_section_name统一小节命名方式新增core_courseformat\base::get_generic_section_name用于获知某个格式如何命名其小节。插件应通过该方法获取小节名称而不是直接对可能不存在的sectionnamer字符串调用get_string。5.4 5.0 的弃用与移除状态动作section_move及其相关函数最终弃用改用section_move_afterbase::get_section_number/set_section_number最终弃用改用get_sectionnum/set_sectionnum。YUI 编辑模块全部课程编辑 YUI 模块弃用未使用组件架构components的课程格式必须在 6.0 前完成迁移。Web 服务改名core_courseformat_create_module弃用改用core_courseformat_new_module状态 mutationaddModule主要用于创建mod_subsection实例弃用改用newModule所有使用data-actionaddModule的格式链接必须改为data-actionnewModule并补充data-sectionid属性指定目标小节 ID。菜单项定义方式用数组定义课程菜单项的方式弃用。所有扩展小节或活动控制菜单的格式如format_NAME\output\courseformat\content\section\controlmenu、format_NAME\output\courseformat\cm\section\controlmenu应返回标准的action_menu_link对象。页面覆盖方式用于覆盖课程视图页的externservercourse.php特性弃用改用 hook例如\core_course\hook\before_course_viewed。React 组件初始化选择器弃用元素 ID 选择器统一使用querySelector并采用#id形式例如用#id而非id。移除core_courseformat\output\local\content\section\availability::availability_info()protected完全移除改用get_availability_data()无 JavaScript 的移动活动/小节旧 UI 从操作下拉菜单中移除唯一支持的移动方式是课程编辑器中的 move 操作旧式链接仍可使 move here 元素出现但会显示弃用提示非 Ajax 移动将在 6.0 移除。5.5 5.0 的修复小节折叠 HTML ID课程格式模板中小节折叠/展开相关的 HTML ID 被修正从按小节序号改为按小节 id避免因序号变化导致 ID 不稳定core_courseformat/local/content/section/header#collapssesection{{num}}→#collapsesectionid{{id}}core_courseformat/local/content/section/content#coursecontentcollapse{{num}}→#coursecontentcollapseid{{id}}如果你在主题或 JavaScript 中依赖这些 ID需要同步更新。六、4.5铺垫性的输出类与表单能力4.5 的变更相对温和但为后续版本奠定了基础\core_courseformat\output\local\state\cm构造函数新增可选参数$istrackeduser若调用方已为课程模块所属课程预先计算好是否被追踪用户可直接传入避免一次额外函数调用性能优化。新增core_courseformat_create_moduleWeb 服务用于在课程中创建新模块实例支持 quickcreate 特性——它是 5.0 中core_courseformat_new_module的前身。给\core\output\html_writer的三个方法新增$disabled参数select()、select_optgroup()、select_option()便于渲染禁用状态的下拉选项。新增基类\core_courseformat\output\local\content\basecontrolmenucm\controlmenu与section\controlmenu均改为继承它课程小节改用动作菜单action menu展示可用操作该菜单由\core_courseformat\output\local\content\cm\delegatedcontrolmenu渲染类渲染。七、插件迁移速查从你的格式出发结合 public/course/format/README.txt 中关于格式插件结构的说明与上述各版本变更可以整理出面向格式插件作者的迁移速查表场景旧写法已弃用/移除新写法当前推荐移动小节stateactions::section_move/move_section_to/reorder_sectionssectionactions::move_after/move_at小节可见性set_section_visible()函数sectionactions::set_visibility()小节序号访问base::get_section_number()/set_section_number()get_sectionnum()/set_sectionnum()模块可见性直接改course_modules.visiblecmactions::set_visibility()复制模块course/lib.php旧复制逻辑cmactions::duplicate()创建模块Web 服务core_courseformat_create_modulecore_courseformat_new_module创建子小节state mutationaddModulenewModuledata-sectionid非 Ajax 编辑 URLcourse/view.php、course/mod.php的 get 动作course/format/update.php参数与core_courseformat_course_update一致小节折叠 ID#collapssesection{{num}}、#coursecontentcollapse{{num}}#collapsesectionid{{id}}、#coursecontentcollapseid{{id}}菜单项定义数组形式标准action_menu_link对象覆盖课程视图页externservercourse.phphook如\core_course\hook\before_course_viewed最大小节数maxsections设置 /get_max_sections()插件自定义设置项6.0 前必须迁移八、结语core_courseformat子系统在 4.5 到 5.3dev 之间完成了从分散的课程编辑逻辑 YUI 旧界面到集中动作类 组件化界面 统一更新入口的转型。对课程格式插件作者而言最重要的两个时间节点是5.0 起所有非 Ajax 编辑操作必须走course/format/update.php以及6.0 前必须完成 YUI 编辑模块、maxsections/numsections与旧移动 UI 的迁移。建议在升级每个大版本时对照 public/course/format/UPGRADING.md 原文逐一核对弃用告警并利用 5.3dev 新增的线性导航 Behat 步骤为新特性补充回归测试。相关实现细节可继续阅读 public/course/format/classes/base.php、public/course/format/classes/local/cmactions.php、public/course/format/classes/local/sectionactions.php 以及 public/course/format/classes/local/linearnavigationsettings.php 等源码文件。赞分享教育后端前端【免费下载链接】moodleMoodle - the worlds open source learning platform项目地址https://gitcode.com/gh_mirrors/mo/moodle点击查看免费下载相关推荐Moodle core_availability 子系统升级指南从 renderer 到 Mustache 模板的 API 迁移实践Moodle core_availability 子系统升级指南从 renderer 到 Mustache 模板的 API 迁移实践 导读 本文以 publi教育后端前端从 5.0 到 5.1Moodle AI 子系统core_ai升级要点与扩展开发指南从 5.0 到 5.1Moodle AI 子系统core_ai升级要点与扩展开发指南 本文以仓库内的 public/ai/UPGRADING.md htt教育后端前端Moodle factor_sms 升级指南从内置 AWS SNS 网关迁移到 core_sms 子系统Moodle factor_sms 升级指南从内置 AWS SNS 网关迁移到 core_sms 子系统 本文围绕 Moodle 多因素认证插件 factor教育后端前端上一篇Windows平台Java版本管理神器JVMS完全指南下一篇30-seconds-of-code 前端指南深入解析 script 的 async 与 defer 属性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表