【问题标题】:Overriding plugin renderer moodle覆盖插件渲染器moodle
【发布时间】:2016-05-13 04:23:26
【问题描述】:

我有一个运行 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) {
...
  }
}

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

谢谢

【问题讨论】:

  • 由于无法查看所有代码,因此很难就此提供任何建议 - 我建议您可能扩展了错误的类或访问了输入错误的成员变量或其他东西。
  • 在相关问题中...我可以覆盖 Moodle 的核心功能吗?同样,我更改了核心功能并且它在那里工作,但我希望在我的主题上定制它,这样我可以根据我选择的主题更好地控制。谢谢:)
  • @davosmith 感谢您的帮助!
  • @theruss 感谢您的帮助!
  • 如果核心函数在渲染器中,您可以覆盖它。如果它是 Moodle 中其他地方的随机函数,那么您将需要寻找已经在该函数中实现的某种钩子(或者干脆放弃并编辑核心文件)。

标签: php moodle


【解决方案1】:

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

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

theme_overridden_​​renderer_factory 通过扩展实例化渲染器的过程来查找与名称“theme_NAMEOFTHEME_NAMEOFRENDERER”匹配的类 - 只要该类存在,就应该使用它(否则使用原始渲染器)。

更多详情请见https://docs.moodle.org/dev/Overriding_a_renderer

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 2014-01-31
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2020-09-30
      • 1970-01-01
      相关资源
      最近更新 更多