无法覆盖 Moodle 中的渲染器

Cannot override a renderer in Moodle

我已经尝试遵循 Moodle documentation 如何覆盖渲染器,但由于某种原因它不起作用。这是我所做的:

  1. /theme/ 目录中创建了一个名为 overridetest 的文件夹。

  2. /theme/ 目录中创建了一个名为 config.php 的文件:

<?php

    $THEME->name = 'overridetest';
    $THEME->parents = array('standard', 'base');
    
    $THEME->rendererfactory = 'theme_overriden_renderer_factory';
    
    $THEME->sheets = Array('overridetest');
  1. /theme/ 目录中创建了一个 renderers.php 文件:
<?php

    class theme_overridetest_core_renderer extends core_renderer
    {
        public function heading($text, $level = 2, $classes = 'main', $id = null)
        {
            $content = html_writer::start_tag('div', array('class' => 'headingcontainer'));
            $content .= html_writer::empty_tag('img', array('src' => $this->pix_url('headingpic', 'theme'), 'alt' => '', 'class' => 'headingimage'));
            $content .= parent::heading($text, $level, $classes, $id);
            $content .= html_writer::end_tag('div');
            
            return $content;
        }
    }
  1. 创建目录 /theme/overridetest/pix/ 并包含图像 headingpic.png

  2. 创建了一个目录 /theme/overridetest/style/ 并包含了一个名为 overridetest.css:

    的文件
.headingcontainer .headingimage
{
    float: left;
    margin-right: 1em;
}

.headingcontainer h2,

.headingcontainer h3,

.headingcontainer h4,

.headingcontainer h5,

.headingcontainer h6
{
    text-align: left;
}

但是,这似乎不起作用。我做错了什么吗?

这可能与您使用的 Moodle 版本有关。您在此处展示的方法适用于旧版 Moodle(根据文档,低于 2.8)。

对于较新的版本,您必须覆盖插件中的渲染器。在您的情况下,如果您要滚动自定义主题,则可以在自己的主题中覆盖它。

假设您创建了自己的主题 mycustomtheme(最简单的是创建 Boost child 主题 https://docs.moodle.org/dev/Creating_a_theme_based_on_boost) .

您可以通过执行以下操作来覆盖标题功能:

  • 安装您的 mycustomtheme 插件(以管理员身份登录时访问主页)
  • 站点管理>外观>主题>主题选择器
  • 中注册mycustomtheme为主主题
  • 打开主题编辑器模式(在站点管理 > 外观 > 主题 > 主题设置
  • /theme/mycustomtheme/classes/output/
  • 中创建名为 core_renderer.php 的文件
<?php

namespace theme_mycustomtheme\output;

use html_writer;

defined('MOODLE_INTERNAL') || die;

class core_renderer extends \core_renderer {
    public function heading($text, $level = 2, $classes = 'main', $id = null) {
        $content = html_writer::start_tag('div', array('class' => 'headingcontainer'));
        $content .= html_writer::empty_tag('img', array(
                    'src' => $this->image_url('headingpic', 'theme'), 
                    'alt' => '', 'class' => 'headingimage'));
        $content .= parent::heading($text, $level, $classes, $id);
        $content .= html_writer::end_tag('div');
        return $content;
    }
}