Moodle 4.1:如何通过主题模板与渲染器控制日历添加事件按钮
解决方案
一、通过主题渲染器重写权限检查逻辑
在你的主题目录下创建/修改 classes/renderer.php,继承核心日历渲染器并自定义按钮显示逻辑:
<?php namespace theme_yourthemename; defined('MOODLE_INTERNAL') || die(); class renderer extends \core_calendar_renderer { public function render_calendar_add_button($context = null) { // 检查用户是否在任意课程中拥有calendar:manageownentries权限 $haspermission = false; $courses = enrol_get_users_courses($USER->id, true, 'id'); foreach ($courses as $course) { $coursecontext = \context_course::instance($course->id); if (has_capability('calendar:manageownentries', $coursecontext)) { $haspermission = true; break; } } return $haspermission ? parent::render_calendar_add_button($context) : ''; } }
二、结合模板控制按钮显示
如果需要更灵活的UI控制,可以同时重写模板:
- 在主题目录下创建模板路径
templates/core_calendar/add_button.mustache,复制核心模板内容并添加条件判断:
{{#if haspermission}} <div class="calendar-add-button"> <a href="{{addurl}}" class="btn btn-primary"> {{#str}}add{{#str_params}}event{{/str_params}}{{/str}} </a> </div> {{/if}}
- 回到渲染器,修改方法传递权限变量:
public function render_calendar_add_button($context = null) { $data = $this->get_template_data_for_add_button(); // 获取核心模板数据 $haspermission = false; $courses = enrol_get_users_courses($USER->id, true, 'id'); foreach ($courses as $course) { $coursecontext = \context_course::instance($course->id); if (has_capability('calendar:manageownentries', $coursecontext)) { $haspermission = true; break; } } $data->haspermission = $haspermission; return $this->render_from_template('core_calendar/add_button', $data); }
关键注意事项
- 将
theme_yourthemename替换为你实际使用的主题名称 - 权限检查逻辑可按需调整:比如只检查当前课程权限,或指定教师角色ID
- 修改后必须清除Moodle缓存(站点管理 → 开发 → 清除缓存)才能生效
- 确保当前站点已启用该主题
内容的提问来源于stack exchange,提问作者lalit mittal
相关产品推荐
相关产品推荐

