"Возможности" в плигинах.

"Возможности" в плигинах.

от Yevhen Matasar -
Количество ответов: 4

Здравствуйте! Я пишу небольшой модуль, у меня возникла проблема с добавлением возможностей (capabilities). Нашел в документации страницу Access API, сделал как написано. Мне нужно что бы только преподаватели могли просматривать детализированную информацию. Я добавляю в access.php строки:

    'block/myblock:viewdetails' => array(
 
        'captype' => 'write',
        'contextlevel' => CONTEXT_BLOCK,
        'archetypes' => array(
            'teacher' => CAP_ALLOW,
            'editingteacher' => CAP_ALLOW,
        ),
    ),

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

Check whether a user has a particular capability in a given context. For example:

$context = context_module::instance($cm->id);
has_capability('mod/folder:managefiles', $context)

Первая строка не совсем понятна, оставил как есть. Далее пишу в файле block_myblock.php:

$context = context_module::instance($cm->id);
if (has_capability('block/myblock:viewdetails', $context)) {...}

Меняю версию блока, загружаю, обновляю. Теперь проверяю и мне выдает ошибку "Не удалось найти запись в таблице course_modules базы данных.".

Объясните, пожалуйста, что я делаю не так. И правильно ли я вообще понял.

В ответ на Yevhen Matasar

Re: "Возможности" в плигинах.

от Yevhen Matasar -

Так, частично разобрался. context_module::instance нужно заменить на context_block::instance. А вот откуда взять id? $cm->id нету такого вообще. Если записать id, который указан в таблице mdl_block_instances, то все работает, отлично.

В ответ на Yevhen Matasar

Re: "Возможности" в плагинах

от Vadim Tabunshchik -
Изображение пользователя Developers

Ну да, context_module::instance - "это совсем не из той оперы" улыбаюсь Это относится к модулям, а вы блок пишете. Поэтому и $cm здесь не прокатит, попробуйте так:

$context = context_block::instance($instance->id);

Хотя, если нужно кому-то показать весь блок, а от кого-то скрыть, достаточно делать это в контексте курса:

$context = context_course::instance($COURSE->id);

Вот документация: Add check to the block for the capability

В ответ на Yevhen Matasar

Re: "Возможности" в плигинах.

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

Eugene Matasar, ключевой элемент в системе безопасности moodle - контекст. Контексты бывают разные, иерархически включатся один в другой, поэтому при назначении какого-то права в контексте верхнего уровня они наследуются на дочерние. Иерархия такая: контекст системы - контекст катеогрии курса - контекст курса - контекст модуля курса. Есть ещё контексты ползователей, они внутри контекста системы и контектсы блока, они находятся внутри того контектса, где вставлен блок. 

Поэтому классов контекстов несколько, у каждого свой конструктор, читайте комментарии в коде, какие именно параметры нужно указать

В ответ на Vadim Dvorovenko

Re: "Возможности" в плигинах.

от Yevhen Matasar -

Вернулся к этой теме сегодня. В общем, разобрался.

В коде блока нужно использовать $this->context. Спасибо, ваши подсказки очень помогли.