Добавление настраиваемой возможности в настраиваемую роль - PullRequest
0 голосов
/ 07 мая 2018

Я программирую новый блок с именем «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), но нет альтернативного поля "роль", чтобы определить это.

Так как мне этого добиться?


Ограничения:

  • Custom_role уже существует во всех экземплярах Moodle.
  • Custom_role не наследует и не может наследовать от архетипа. "Примените возможность к архетипу и сделайте так, чтобы" custom_role "наследовал от архетипа" работает, но не приемлемо, потому что эта возможность будет побочно применяться к другим ролям, унаследованным от него.
  • Должно быть сделано программно, вспомните сотни экземпляров Moodle.
  • Это не нужно делать через access.php, но оно должно повторяться и обновляться.
  • Должен "хорошо играть" с Moodle. Нет хакерского SQL, модифицирующего вручную [mdl_role_capabilities] (я уже знаю хакерский SQL), но ответ «нет другого пути, кроме хакерского SQL», будет принят, без какого-либо другого.
  • Идеальная совместимость с Moodle 2.8 была бы идеальной, но в противном случае было бы также принято решение для другой (более новой) версии.

1 Ответ

0 голосов
/ 21 мая 2018

Возможно, вам понадобится добавить что-то вроде этого к 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);
}
...