如何呈现新菜单以在 moodle 中显示菜单栏

How to render a new menu to display a menu bar in moodle

提问人:phchon 提问时间:11/11/2023 更新时间:11/21/2023 访问量:34

问:

我正在尝试将经典主题自定义为主题(称为主题主题)作为主题提升的子主题。

我想在我的 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);

但是,我得到了一个错误。

我的问题是:

  1. 我在“主题/theant/渲染器.php”中的代码有什么问题吗?代码的位置是否正确?
  2. 如何渲染 $allcourses_menu 以根据需要显示?

感谢您的帮助。 干杯

姜。

Moodle Moodle-主题

评论


答:

0赞 HadiZ 11/21/2023 #1
  1. 你能补充一下你得到的错误吗?
  2. 将类 moodle_url 中的对象添加到要呈现的数组中不会自动字符串化该对象。这意味着 您将整个对象发送到 Mustache 模板 的 URL 本身。我通常做这样的事情"courselink"=>(new \moodle_url('/course/view.php', array('id' => $course->id))) . ''
  3. 在你的代码中,你有,我不确定你是如何声明的,但如果你想调用一个静态方法只是为了最小化代码并清理它,我建议直接使用类名本身。$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, ];'效果很好。但是,我想创建一个可以在其他地方调用的新文件。