提问人:phchon 提问时间:11/11/2023 更新时间:11/21/2023 访问量:34
如何呈现新菜单以在 moodle 中显示菜单栏
How to render a new menu to display a menu bar in moodle
问:
我正在尝试将经典主题自定义为主题(称为主题主题)作为主题提升的子主题。
我想在我的 moodle 中获取所有带有链接的课程,以将它们显示为所有站点的菜单。它看起来像图片中的黑色菜单栏。 (https://i.stack.imgur.com/V46n[在此处输入图像描述](https://i.stack.imgur.com/oW8RI.png)t.png)
菜单栏在文件“theme/theant/templates/navbar.mustache”中定义如下
<nav class="fixed-top navbar navbar-bootswatch navbar-expand moodle-has-zindex">
<div class="fixed-subtop navbar" style="background-color: #333333; color: white;">
<ul>
{{#allcourses_menu}}
<li><a href="{{courselink}}"> "{{coursename}}"</a></li>
{{/allcourses_menu}}
</ul>
</div>
navbar.mustache 由模板文件“theme/theant/templates/column.mustache”通过代码调用:
{{> theme_theant/navbar }}
在文件“theme/theant/renderers.php”中,我写道(基于教程 https://docs.moodle.org/dev/Extending_the_theme_custom_menu)
class theme_theant_core_renderer extends \core_renderer {
protected function render_allcourses_menu($allcourse_menu = null) {
global $CFG;
require_once($CFG->dirroot.'/lib/datalib.php');
$allcourses = get_courses();
$allcourses_menu = array();
foreach ($allcourses as $course) {
array_push($allcourses_menu, array("coursename"=>($course->shortname),
"courselink"=>(new moodle_url('/course/view.php', array('id' => $course->id)))));
}
return $allcourses_menu;
}
}
但是,我不知道如何将 $allcourses_menu 呈现给模板调用它。
我尝试将其放在布局文件“主题/theant/布局/列.php”中,如下所示
$allcourse_menu = $theme_theant_core_renderer::render_allcourses_menu();
....
$templatecontext = [
..........
'allcourses_menu'=> $allcourse_menu,
];
echo $OUTPUT->render_from_template('theme_theant/columns', $templatecontext);
但是,我得到了一个错误。
我的问题是:
- 我在“主题/theant/渲染器.php”中的代码有什么问题吗?代码的位置是否正确?
- 如何渲染 $allcourses_menu 以根据需要显示?
感谢您的帮助。 干杯
姜。
答:
0赞
HadiZ
11/21/2023
#1
- 你能补充一下你得到的错误吗?
- 将类 moodle_url 中的对象添加到要呈现的数组中不会自动字符串化该对象。这意味着
您将整个对象发送到 Mustache 模板
的 URL 本身。我通常做这样的事情
"courselink"=>(new \moodle_url('/course/view.php', array('id' => $course->id))) . ''
- 在你的代码中,你有,我不确定你是如何声明的,但如果你想调用一个静态方法只是为了最小化代码并清理它,我建议直接使用类名本身。
$allcourse_menu = $theme_theant_core_renderer::render_allcourses_menu();
$theme_theant_core_renderer
评论
0赞
phchon
11/22/2023
我通过在布局文件中添加一些代码来修复它。更详细,我在布局/列中添加了代码.php ' $all_courses_menu = array();$all_courses = get_courses();foreach ($all_courses as $course) { if ($course->id !== SITEID) { array_push($all_courses_menu, array(“coursename”=>($course->shortname), “courselink”=>(new moodle_url('/course/view.php', array('id' => $course->id))))); } } ..... $templatecontext = [ ....'all_courses_menu'=> $all_courses_menu, ];'效果很好。但是,我想创建一个可以在其他地方调用的新文件。
评论