覆盖插件渲染器 moodle

Overriding plugin renderer moodle

我有站点 运行 Moodle 2.9.3+,我试图自定义一个现有插件的渲染器,所以我发现了这个:

How to override a renderer such that the functionality of the overridden renderer also remains available?

我在我的主题 core_renderer.php 中添加了以下内容

include_once($CFG->dirroot . "/course/format/topcoll/renderer.php");

但是当我尝试这样做时

class topcoll_local_renderer extends format_topcoll_renderer {
  protected function section_header($section, $course, $onsectionpage, $sectionreturn = null) {
...
  }
}

它运行了,但它没有加载修改后的函数。我还需要做其他事情吗?修改后的功能是 运行 当我直接将代码更改到插件中时没有问题,但不是这样。我将不胜感激任何可能的提示。

谢谢

嗯,你确定脚本包含没有错误吗?如果您在 ini 设置中关闭了 error_reporting,您将看不到 E_WARNING PHP 可能正在提高。将其设置为开,或改用 require_once()。有关差异,请参阅对此 SO post 的已接受回复:Difference between require, include and require_once?

您需要做两件事来让主题渲染器覆盖核心渲染器:

  1. 您需要编辑主题的 config.php 以添加行:$THEME->rendererfactory = 'theme_overridden_renderer_factory';
  2. 您需要将渲染器命名为 class 'theme_NAMEOFTHEME_format_topcoll_renderer'(并像您所做的那样扩展 'format_topcoll_renderer')。

theme_overridden_renderer_factory 的工作原理是扩展实例化渲染器的过程,以查找与名称 'theme_NAMEOFTHEME_NAMEOFRENDERER' 匹配的 class - 只要 class 存在,那么应该使用它(否则使用原始渲染器)。

有关详细信息,请参阅 https://docs.moodle.org/dev/Overriding_a_renderer