Права на просмотр блока

Права на просмотр блока

от Pavel Chervov -
Количество ответов: 17

Добрый день!
Сделал блок, при создании блока делал папку db в ней файл access.php в нем

$block_helloworld_capabilities = array(
  'block/helloworld:view' => array(
      'captype'      => 'read',
      'contextlevel' => CONTEXT_SYSTEM,
      'legacy' => array(
            'guest'          => CAP_PREVENT,
            'student'        => CAP_PREVENT,
            'teacher'        => CAP_PREVENT,
            'editingteacher' => CAP_PREVENT,
            'coursecreator'  => CAP_PREVENT,
            'admin'          => CAP_ALLOW
    )
  )
);

 Захожу под админом права на просмотр блока есть.

Создал пользователя, захожу под ним, прав на просмотр блока естественно нет.

Зашел под админом в определение ролей ->Идентифицированный пользователь  поставил разрешить.

Захожу под созданным пользователем - прав на просмотр по-прежнему нет!

Что делать? В чем косяк?

 

Moodle 1.9.

Спасибо!

В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Создал пользователя, захожу под ним, прав на просмотр блока естественно нет.

Пользователя создали, а роль ему какую-нибудь и где-нибудь назначили?

Зашел под админом в определение ролей ->Идентифицированный пользователь  поставил разрешить.

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

Поэтому: Захожу под созданным пользователем - прав на просмотр по-прежнему нет!

Так как роли student, teacher, editingteacher, coursecreator в основе своей базируются на роли user, то я бы попробовал написать 'user' => CAP_PREVENT вместо указания всех ролей, а потом разрешения настроить для каждой роли в Админке:

'legacy' => array(
           'guest' => CAP_PREVENT,
           'user' => CAP_PREVENT,
           'admin' => CAP_ALLOW
       )

Или просто допишите user’а к своим строкам:

'legacy' => array(
            'user' => CAP_PREVENT,
            'guest' => CAP_PREVENT,
            'student' => CAP_PREVENT,
            'teacher' => CAP_PREVENT,
            'editingteacher' => CAP_PREVENT,
            'admin' => CAP_ALLOW
        )

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

 Vadim, добавил юзера к access, после этого зашел в опеределение роли Идентифицированный пользователь выставил разрешить всеравно не помогло!

В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Павел, попробуйте контекст поменять на 'contextlevel' => CONTEXT_BLOCK

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

Вадим, не помогло но всервно спасибо.

Мне этот блок надо показывать всем зарегистрированным.

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

В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Мне этот блок надо показывать всем зарегистрированным.

Я думал, что нужно как-то гибко настраивать разрешения через Capabilities, а если просто проверять, зарегистрирован или нет и показывать блок - тут всё проще, и создавать access.php, и "проверять существует ли id прльзователя" нет нужды.

Стандартная функция Мудл: isloggedin() - проверка, авторизовался пользователь на сайте или нет (понятно, если авторизовался, то такая уч. запись существует, id - естественно, тоже существует улыбаюсь), isguestuser() - пользователь "Гость" или нет.

Отсюда следует, что содержимое блока можно выводить так:

function get_content() {
        global $CFG;
        
        if ($this->content !== NULL) {
            return $this->content;
    }

// Если нужно, определяем контекст: В данном случае - контекст курса
$context = get_context_instance(CONTEXT_COURSE, $this->page->course->id);

// Показываем блок только вошедшим на сайт и НЕгостю, можно "прикрутить" нужное разрешение (has_capability)
        if (isloggedin() and !isguestuser() and has_capability('сapabilities', $context)) {

    $this->content = new stdClass;

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

Вместо сapabilities - указываете нужное разрешение для роли в нужном контексте, например: moodle/user:viewdetails

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

Я сделал вот так, по грубому =)

$context = get_context_instance(CONTEXT_SYSTEM);
$this->content = new stdClass;

$obj_ses = (object)$_SESSION;
$userid = $obj_ses->USER->id;
if ($userid !== 0){
$this->content->text = get_string('welcome', 'block_controlpanel');
}

Чем такой способ плох?

Щас Буду разбираться с тем способом, который вы предложили. Спасибо!

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

Так и не смог до конца понять кто такой "Гость" а кто "Зарегистрированный пользователь" в Moodle

Также непонятно зачем проверять контекст в моем случае и почему на уровне курса а не на уровне системы?

 

Вадим, подскажите?

 

Спасибо!

В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Так и не смог до конца понять кто такой "Гость" а кто "Зарегистрированный пользователь" в Moodle

в думах Теперь я не понял, как это Вы не поняли улыбаюсь

Гость - тот, кто может пользоваться главной страницей сайта и курсами, в которых разрешен гостевой доступ, куда он может попасть после нажатия кнопки "Зайти гостем". Ему же авторизоваться не нужно, кнопку нажал - и зашел в курс. Ему нужно блок показывать? Если нет - тогда и делаем проверку !isguestuser() (т. е., НЕ является гостем).

Зарегистрированный пользователь - пользователь, имеющий учетную запись (логин и пароль) на сайте. Для такого пользователя блок выводим только после его авторизации на сайте - isloggedin().
И не нужно никаких проверок id, причем, в виде "костыля" $_SESSION. Тем более, что "Гость" id в системе имеет и он явно !== 0, а это значит, что ЛЮБОЙ может видеть Ваш блок после входа с гостевой учеткой.
Используйте стандартные функции Мудл.

зачем проверять контекст в моем случае

Это Вам виднее, нужно проверять или нет, Вы же блок создаете. В своем коде строкой $context = get_context_instance(CONTEXT_SYSTEM); Вы контекст тоже указали, но не вижу, где использовали.

А я просто привел пример, как использовать контекст (при необходимости) для проверки наличия у пользователя нужных разрешений: …and has_capability('сapabilities', $context), где $context=get_context_instance(CONTEXT_COURSE, $this->page->course->id);

почему на уровне курса а не на уровне системы

А зачем на уровне системы? Чем меньше прав, возможностей и т. д., тем безопасней. Главная страница сайта - тоже курс, поэтому CONTEXT_COURSE - вполне достаточно.

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

Вадим, спасибо, теперь понятно на счет Гостя и Юзера, но недоконца понятно на счет проверки контекста

Как я понимаю нижеследующим мы записываем в переменную уровень контекста (в данном случае доступ к главной страничке)

$context = get_context_instance(CONTEXT_COURSE, $this->page->course->id);

Как я понимаю в переменную $context должен записаться массив или объект или строка или число или true/false. Я решил его напечатать чтобы понять что там -

выдает ошибку

Notice: Undefined property: block_controlpanel::$page inD:\xampp\htdocs\moodle\moodle\blocks\controlpanel\block_controlpanel.phpon line 22

возможно это из-за того что у меня врубле режим отладки.

Если же я вместо id укажу 1 (id курса главной странички) то у меня страница не загружаеться вообще.

Могли бы вы прояснить что на счет  get_context_instance(CONTEXT_COURSE, $this->page->course->id);

Спасибо!

В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Павел, покажите весь код файла block_controlpanel.php, без него я точно не скажу. Скорее всего, Вы забыли указать глобальные переменные, например:

    function get_content() {
        global $CFG, $USER, $PAGE, $COURSE;
        if ($this->content !== NULL) {
            return $this->content;
        }
        if (!empty($this->instance->pageid)) {
            $context = get_context_instance(CONTEXT_COURSE, $this->instance->pageid);
..................

Если $PAGE не объявите, будет Notice: Undefined property: block_controlpanel::$page

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

Вадим вот пожалуйста, посмотрите

 

во вложении, тиак будет понятнее

В ответ на Pavel Chervov

Re: Права на просмотр блока

от Pavel Chervov -
В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Павел, в прошлом сообщении я писал:

if (!empty($this->instance->pageid)) {
            $context = get_context_instance(CONTEXT_COURSE, $this->instance->pageid);

А Вы не исправили улыбаюсь

Но сначала Вам нужно определиться, нужен вообще context или нет.

Если блок нужно показывать абсолютно всем зарегистрированным (и студентам, и преподам с правом редактирования и без оного, и создателям курсов и т.д.) и на любой странице сайта, где могут быть блоки (т. е., не нужно определять, где, на какой странице и пользователю с какими сapabilities, показывать блок, а где - скрывать), то context указывать смысла нет. Достаточно 2-х условий: пользователь - не Гость и авторизовался на сайте. Эти строки с контекстом вообще нужно убрать.

В прикрепленном файле есть закомментированные строки, если экранирование убрать, то блок будет доступен только преподавателям с правом редактирования в их курсах, на главной странице сайта блок будет видеть только админ. Студентам блок вообще не будет виден. Т. е., определять контекст нужно тогда, когда необходимо проверить разрешения у пользователя в том или ином контексте, и в результате - показывать ему "что-то" или нет. Поизучайте исходники в каталоге moodle/blocks, где используется функция get_context_instance.

В ответ на Vadim Tabunshchik

Re: Права на просмотр блока

от Pavel Chervov -

Вадим, спасибо вам большое за ответы и за советы, теперь все работает и все стало ясно. Спасибо!

В ответ на Pavel Chervov

Re: Права на просмотр блока

от Pavel Chervov -

Вадим, все же есть еще пару вопросов:

сейчас у меня в блоке информация статичная

 $this->content->text = get_string('welcome', 'block_controlpanel');

но это пока. Задумка такая что блок будет показывать определенную форму в зависимости от того какие локальные права есть у пользователя. В связи с этим есть 2 вопроса:

1) Как лучще выводить эту форму

a) $this->content->text = display_need_form($_SESSION['USER']->id) //моя функция принимает id смотрит в базу, анализирует и выдает нужную форму;

или

в) вместо $this->content->text = вставить мою функцию а уже в теле функции в зависимости от прав пользователя записывать в свойство text мою форму, например вот так

//если у пользователя с переданным id роль препод то печатем форму для препода

$this->content->text = display_prepod_form();

?

...........................................................................................................

2) в каком месте моего сценрия block_contolpanel.php правильнее подключать мою библиотеку mylib.php с функциями для этого блока ?

внутри описания функции get_content() или в самом начале файла.

Спасибо!

В ответ на Pavel Chervov

Re: Права на просмотр блока

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

Павел, я не программист на РНР + не знаю ваших целей и задач, назначения блока и много ещё чего. улыбаюсь

Но, исходя из моего опыта работы с Мудл, могу посоветовать:

  1. напишите отдельно скрипт controlpanellib.php, где будут описаны все классы, методы, функции, необходимые для работы блока.
  2. подключите его в block_controlpanel.php: require_once('controlpanellib.php'); обычно поключается выше того места, где используется какая-то функция из lib.
    Вот пример - файл moodle\blocks\activity_modules\block_activity_modules.php:
            require_once($CFG->dirroot.'/course/lib.php'); //подключение файла moodle/course/lib.php
            $modinfo = get_fast_modinfo($course); // использование функции get_fast_modinfo, описанной в lib.php
  3. еще один файл - форма, выводимая преподавателю, controlpanelform.php, например.
  4. форму в файле block_controlpanel.php вывести можно так:
    $this->content->items[] = '<a href="'.$CFG->wwwroot.'/blocks/controlpanel/controlpanelform.php">'.get_string('controlpanelform','block_controlpanel') .'</a>';

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