如何渲染新菜单以在moodle中显示菜单栏

问题描述 投票:0回答:1

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

我想在我的moodle中获取所有课程及其链接,以便在所有网站中将它们显示为菜单。它看起来就像图片中的黑色菜单栏。 (https://i.sstatic.net/V46n[在此处输入图像描述](https://i.sstatic.net/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 渲染到模板调用它。

我尝试将其放入布局文件“theme/theant/layout/column.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. 我的“theme/theant/renderers.php”代码有什么错误吗?代码位置正确吗?
  2. 如何渲染 $allcourses_menu 以根据需要显示?

感谢您的帮助。 干杯

春。

php moodle moodle-theme
1个回答
0
投票
  1. 您能否添加您遇到的错误?
  2. 将 Moodle_url 类中的对象添加到要渲染的数组中不会自动字符串化该对象。这意味着 您将整个对象发送到胡子模板 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
    ,但如果您想调用静态方法只是为了最小化代码并清理它,我建议直接使用类名本身.
© www.soinside.com 2019 - 2024. All rights reserved.