无法覆盖 Moodle 中的渲染器
Cannot override a renderer in Moodle
我已经尝试遵循 Moodle documentation 如何覆盖渲染器,但由于某种原因它不起作用。这是我所做的:
在 /theme/
目录中创建了一个名为 overridetest 的文件夹。
在 /theme/
目录中创建了一个名为 config.php
的文件:
<?php
$THEME->name = 'overridetest';
$THEME->parents = array('standard', 'base');
$THEME->rendererfactory = 'theme_overriden_renderer_factory';
$THEME->sheets = Array('overridetest');
- 在
/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;
}
}
创建目录 /theme/overridetest/pix/
并包含图像 headingpic.png
。
创建了一个目录 /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;
}
}
我已经尝试遵循 Moodle documentation 如何覆盖渲染器,但由于某种原因它不起作用。这是我所做的:
在
/theme/
目录中创建了一个名为 overridetest 的文件夹。在
/theme/
目录中创建了一个名为config.php
的文件:
<?php
$THEME->name = 'overridetest';
$THEME->parents = array('standard', 'base');
$THEME->rendererfactory = 'theme_overriden_renderer_factory';
$THEME->sheets = Array('overridetest');
- 在
/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;
}
}
创建目录
/theme/overridetest/pix/
并包含图像headingpic.png
。创建了一个目录
的文件/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
插件(以管理员身份登录时访问主页) - 在站点管理>外观>主题>主题选择器 中注册
- 打开主题编辑器模式(在站点管理 > 外观 > 主题 > 主题设置)
- 在
/theme/mycustomtheme/classes/output/
中创建名为
mycustomtheme
为主主题
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;
}
}