在moodle中删除课程模块时,如何运行一个函数?

How can I run a function when a course module is deleted in moodle?

我想 运行 单击此按钮并删除课程模块时的功能。

我该怎么做?

在db/events.php:

$observers = array(

    array(
        'eventname'   => '\core\event\course_module_deleted',
        'callback'    => 'mod_game_observer::course_module_deleted',
    ),
);

在classes/observer.php:

defined('MOODLE_INTERNAL') || die();


class mod_game_observer {

    /**
     * Observer for the even course_module_deleted.
     *
     * @param \core\event\course_module_deleted $event
     */
    public static function course_module_deleted(\core\event\course_module_deleted $event) {
        global $DB;
        //die(var_dump($event));
        $DB->delete_records_select("game_results", "cmid = ".$event->objectid);
        $DB->delete_records_select("game", "id = ".$event->other['instanceid']);
    }
}

查看 Moodle Events API 文档;它详细介绍了 Moodle 用于记录事件、observing/listening 事件以及在事件发生时触发回调函数的框架。

该文档还包括一个 core/standard 事件列表,如果您需要创建一个特定于您需要的自定义事件,事件 API 是可扩展的。

其中一个 existing/core 事件听起来与您的需求相关:core\event\course_module_deleted

以下是利用事件框架实现目标的几个常见步骤:

  • 确定与您的需要相关的 core/standard 活动,或者如果没有完全适合的活动则创建一个新活动
  • 了解随事件记录的数据,以便您可以 filter/target 与 course/course module/scenario/etc 相关的事件。您想采取行动的地方。
    • 执行此操作的一种方法是搜索现有的核心代码或插件以获取事件记录位置的示例
    • 或者,如果您有现有的 Moodle 站点,您可以访问站点管理 -> 报告 -> 事件列表并查看与事件相关的详细信息(例如 eventlist/eventdetail.php?eventname =%5Ccore%5Cevent%5Ccourse_module_deleted)
    • 您还可以在 Moodle 的日志存储中查看存储在事件数据库中的数据 table
  • 在插件中,创建一个 Moodle 观察器函数来监听您需要的事件;这些观察者被设计用来触发回调函数,回调函数可以包含事件发生时你想要执行的代码
    • 使用上面提到的示例事件,您将为 core\event\course_module_deleted 事件设置观察者。
    • 请确保您要 observe/listen 的事件已记录在您需要执行回调函数的代码中的 time/location 处;如果没有,您可能需要创建一个可以在正确的 location/at 正确的时间记录的自定义事件。在您的情况下,例如,如果您需要在用户选择“删除”后立即执行回调,但核心事件被记录到删除周期的更深处,您可能需要创建一个自定义事件并将其记录在选择删除时执行的代码的开头。
  • 按照 Moodle 的框架创建插件并将观察者添加到插件。这使观察者能够正确注册,以便观察者和与观察者关联的任何回调函数将正确执行。

希望这对您有所帮助 - 祝您好运!