Доступ к блоку по роли Преподавателя

Доступ к блоку по роли Преподавателя

от Данияр Нугуманов -
Количество ответов: 2

Добрый день. При разработке блока возникла проблема с ограничением доступа

Мне нужно чтобы блок был доступен для Преподавателей и Администраторов

В блок добавил настройки /db/access.php


$capabilities = array(

    'block/record_studio:addinstance' => array(

        'riskbitmask' => RISK_XSS,

        'captype' => 'write',

        'contextlevel' => CONTEXT_COURSE,

        'archetypes' => array(

            'editingteacher' => CAP_ALLOW,

            'manager' => CAP_ALLOW

        ),

        'clonepermissionsfrom' => 'moodle/course:manageactivities'

    ),

);


На сайте блок доступен для всех.

Подскажите как сделать нужное мне ограничение доступа

Блок будет установлен по умолчанию в Домашнюю страницу


Moodle 2.7.14 (Build: 20160509) 

В ответ на Данияр Нугуманов

Re: Доступ к блоку по роли Преподавателя

от Vadim Tabunshchik -
Изображение пользователя Developers
В блок добавил настройки /db/access.php

access.php только добавляет новые разрешения для роли, кот. вы можете управлять на странице редактирования соответствующей роли.

'clonepermissionsfrom' => 'moodle/course:manageactivities'

Это что такое в блоке? В блоке должны «клонироваться только 2 разрешения: moodle/site:manageblocks и/или moodle/my:manageblocks

чтобы блок был доступен для Преподавателей и Администраторов

Для Администратора не нужно ничего настраивать, блок ему и так будет доступен всегда и везде.

С преподавателем сложнее, так как роль преподавателя назначается в контексте курса (модуля), а блок вы хотите использовать в личном кабинете. Это совсем другой контекст системы, тут преподавателей не бывает.

Выбор, кому что и где показывать, осуществляется проверкой наличия у пользователя того или иного права в том или ином контексте.

Т. е., сначала определяете контекст, где находится в данное время пользователь в системе, потом проверяете у него разрешение на необходимое действие, есть разрешение - показываете блок, нет - не показываете.

Попробуйте такой access.php, если блок будете использовать только на домашней странице:

defined('MOODLE_INTERNAL') || die();

$capabilities = array(

    'block/record_studio:myaddinstance' => array(
        'captype' => 'write',
        'contextlevel' => CONTEXT_SYSTEM,
        'archetypes' => array(
            'editingteacher' => CAP_ALLOW
        ),

        'clonepermissionsfrom' => 'moodle/my:manageblocks'
    ),
);

А в файле block_record_studio.php нужно прописать в выводе содержимого блока (function get_content) проверку права на добавление данного блока на домашнюю страницу:

$context = $this->page->context;

if (has_capability('block/record_studio:myaddinstance', $context)) {

Тут содержимое блока

}

Не забудьте в этом же файле указать, что блок может добавляться только на домашнюю страницу:

    public function applicable_formats() {
        return array('my' => true);
    }
В ответ на Vadim Tabunshchik

Re: Доступ к блоку по роли Преподавателя

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

Лучше не трогать права блоков с предопределенными названиями addinstance и myaddinstance.

Они отвечают за право добавления блока на любую страницу и на dashboard соответственно. То есть эти права должны быть обязательно определены в access.php, плюс должны быть созданы соответствующие строки в языковом файле, но для чего-то другого их лучше не использовать. Если эти права не будут определены, то каждый раз, когда будете пытаться добавить на любую страницу блок система будет пытаться проверить эти права, но не будет находить их описания.

Но для ограничения прав на просмотр (а добавлять на страницы отличные от dashboard могут одни, а просматривать другие, плюс можно делать переназначения прав на уровне блока), лучше использовать отдельное право view и проверять уже его при формировании контента блока.


С другой стороны, если вы уверены, что Ваш блок может ставиться только на dashboard, который у каждого свой, и в перспективе не будет ставиться ни на какие другие страницы, то можете определить applicable_formats указанным выше образом и тогда вообще не нужно проверять права в коде формирования контента. Раз смог добавить блок на страницу, значит и права на просмотр есть.