你能改变moodle中$ OUTPUT-> main_content()的内容吗?

时间:2017-08-15 01:56:43

标签: php templates moodle

我知道与此相关的类似问题。我的任务比css可以处理的任务复杂得多。

在其中一个课程模板中,例如,页面的整个内容区域似乎由3行代码处理......

        echo $OUTPUT->course_content_header();
        echo $OUTPUT->main_content();
        echo $OUTPUT->course_content_footer();

假设您需要对课程的内部内容添加一些重大更改。需要重新构建由$OUTPUT->main_content()

明确处理的标记,数据等的东西

其他答案追溯到libs / outputrenderers.php,但如果你仔细研究,你就会发现:

public function main_content() {
    // This is here because it is the only place we can inject the "main" role over the entire main content area
    // without requiring all theme's to manually do it, and without creating yet another thing people need to
    // remember in the theme.
    // This is an unfortunate hack. DO NO EVER add anything more here.
    // DO NOT add classes.
    // DO NOT add an id.

    return '<div role="main">'.$this->unique_main_content_token.'</div>';
}

...追溯$this->unique_main_content_token,你什么都没得到。

在某个地方,在所有这些混乱中,必须有一些东西正在组装所有的数据和标记。我不仅需要覆盖子主题中的main_content()函数。所有这些都会给我一个空白的名单。我需要知道它是如何拉动数据来生成页面所以我可以访问诸如课程标题,用户状态等之类的内容。另外还要注入我自己的修改,而不是试图插入css绝对定位或后加载js操纵。如果必须的话,我会变脏,但在我必须把它砍成碎片之前,我宁愿理解系统。

有没有人知道在哪里可以找到$OUTPUT->main_content()的html的确切位置,一般情况下还是课程?

1 个答案:

答案 0 :(得分:1)

Moodle与他们所称的&#34;渲染器&#34;一起工作。方法main_content是用户指示主要内容在其主题中呈现的位置的方式。

Moodle呈现页面的方式是让开发人员在第一次调用$OUTPUT->header()后回显他们想要的任何内容,然后他们必须以$OUTPUT->footer()结束输出。在引擎盖下,themer提供的布局文件分为两部分,一部分由$OUTPUT->header()回显,其余部分由$OUTOUT->footer()回显。

所以不幸的是,你无法捕获所有内容,除非您覆盖上面提到的方法并引入自己的输出缓冲。但是,按照惯例,输出应该由渲染器生成,您可以在主题中覆盖它们。无论您前往何种方案,主题都可能是一个良好的开端。

另外,根据您要实现的目标,例如更改课程的布局,您可能更好地查看其他插件类型,例如&#34;课程格式&#34;。

我希望这会有所帮助。

为了澄清,要覆盖渲染器,您必须创建一个新主题,然后创建一个渲染器类。如果要覆盖core以上的渲染器,比如mod_scorm等插件的渲染器,则必须创建特定名称的渲染器类。

示例:

class theme_yourtheme_core_renderer extends core_renderer { 
    // Overridden core renderer methods here.
}
class theme_yourtheme_mod_scorm_renderer extends mod_scorm_renderer {
    // Overridden scorm renderer methods here.
}

我建议您阅读下面的文档,但可能会令人困惑。我还建议您浏览其他主题的代码,这些代码在使用渲染器方面非常有创意。