向自定义角色添加自定义功能

时间:2018-05-07 13:01:06

标签: moodle

我正在编写一个名为" custom_block"的新块。我想添加" custom_capability"到" custom_role"。我尝试通过网络管理工具手动添加它,它可以正常工作。

现在,我想以编程方式将其添加到我的所有Moodle实例中,因此在blocks/custom_block/db/access.php内部看起来像这样:

'block/custom_block:custom_capability' => array(
        'riskbitmask' => RISK_SPAM | RISK_XSS,
        'captype' => 'write',
        'contextlevel' => CONTEXT_SYSTEM,
        'archetypes' => array(
            'student' => CAP_PREVENT,
            'teacher' => CAP_PREVENT,
            'editingteacher' => CAP_ALLOW,
            'custom_role' => CAP_ALLOW
        ),
    ), 

会引发error/moodle/invalidlegacy错误,因为' custom_role'不是原型(即使他们与基本的Moodle角色共享名称),但没有替代"角色"字段来定义这个。

那我怎么能实现这个目标呢?

限制:

  • 所有Moodle实例上都存在Custom_role。
  • Custom_role不会从原型继承。 "将该功能应用于原型并制作" custom_role"继承自原型" 但无法接受,因为该功能可以从侧面有效地应用于从其继承的其他角色。
  • 必须以编程方式完成,想想数百个Moodle实例。
  • 它不需要通过access.php完成,但必须是可重复和可更新的。
  • 必须&#34;玩得好&#34;与Moodle。没有hacky SQL手动修改[mdl_role_capabilities](我已经知道hacky SQL),但答案&#34;除了hacky SQL&#34; 之外别无其他方式,缺少任何其他方法。< / LI>
  • 与Moodle 2.8的兼容性是理想的,但遗漏的是,另一个(更新的)版本的解决方案也将被接受。

1 个答案:

答案 0 :(得分:0)

您可能需要向blocks/custom_block/db/install.php

添加类似的内容
if ($roleid = $DB->get_field('role', 'id', array('shortname' => 'custom_role') {
    $context = \context_system::instance();
    assign_capability('block/custom_block:custom_capability', CAP_ALLOW,
        $roleid, $context);
}