Поделиться в соцсетях:

При разработке дополнительного функционала для Moodle одному из наших клиентов потребовалось проверять пользователя на наличие у него только роли «Студент» для заданного курса, при этом если у данного пользователя могла быть роль преподавателя или администратора, то функция должна была возвращать false. В Moodle есть две подобные функции, но они выполняют еще несколько ненужных для нас задач, поэтому мы написали свою функцию. Вот что получилось.

Сперва, чтобы построить запрос, нужно выяснить какие таблицы базы данных Moodle участвуют в цикле формирования проверки роли пользователя к конкретному курсу, в данном случае это 5 таблиц:

  • role_assignments — таблица связей контекстов, пользователей и ролей
  • user_enrolments — таблица связей подписок и пользователей
  • role — таблица ролей
  • context — таблица контекстов
  • enrol — таблица подписок

Нам надо связать эти пять таблиц, в конечном итоге мы получим несколько записей связанных таблиц, а количество этих записей — это количество ролей пользователя в конкретном курсе. При этом надо учесть возможность проверки только лишь одной единственной роли, например, у пользователя по курсу может быть несколько ролей, а нам нужны лишь те пользователи у которых только одна роль, например, «Студент».

Составим SQL-запрос

Тут мы пишем «голый» SQL-запрос, учитывая что у нас по-умолчанию префикс таблиц mdl_, допустим что у нас пользователь с внутренним id = 10, id курса = 3, а необходимая роль для проверки это student.

SELECT * FROM mdl_role_assignments AS ra LEFT JOIN mdl_user_enrolments AS ue ON ra.userid = ue.userid LEFT JOIN mdl_role AS r ON ra.roleid = r.id LEFT JOIN mdl_context AS c ON c.id = ra.contextid LEFT JOIN mdl_enrol AS e ON e.courseid = c.instanceid AND ue.enrolid = e.id WHERE r.shortname = 'student' AND ue.userid = '10' AND e.courseid = '3';

Как видно из запроса, мы можем подставлять 3 переменные, по которым будет производиться выборка данных:

  • наименование роли (по-умолчанию доступно 6 ролей: manager, coursecreator, editingteacher, teacher, student, guest)
  • id пользователя
  • id курса

Соответственно, можно написать функцию с параметрами для такого запроса. Не забываем о Moodle data API и делаем правильно оформленные SQL-запросы на основе глобального объекта $DB.

<?php
function lmstech_is_user_has_role_in_course($user_id, $course_id, $single = true, $role = 'student') {
    global $DB;
    
    $sql = "SELECT * FROM {role_assignments} AS ra LEFT JOIN {user_enrolments} AS ue ON ra.userid = ue.userid LEFT JOIN {role} AS r ON ra.roleid = r.id LEFT JOIN {context} AS c ON c.id = ra.contextid LEFT JOIN {enrol} AS e ON e.courseid = c.instanceid AND ue.enrolid = e.id WHERE r.shortname = ? AND ue.userid = ? AND e.courseid = ?";

    $result = $DB->get_records_sql($sql, array( $role, $user_id, $course_id ));
    if ( $result ) {
        if ( $single ) {
            if ( count( $result ) == 1 ) {
                return true;
            } else {
                return false;
            }
        }
        return true;
    }
    return false;
}
?>

    Разберем параметры

  • $user_id — внутренний id конкретного пользователя
  • $course_id — внутренний id необходимого курса
  • $single — переменная, которая проверяет является ли представленная роль у пользователя в данном курсе единственной (true/false, по-умолчанию true)
  • $role — наименование роли (по-умолчанию student)

Пример использования

<?php
//курс с id=3, пользователь с id=12, должен быть только coursecreator-ом
if ( lmstech_is_user_has_role_in_course(12, 3, true, 'coursecreator') ) {
    echo 'да!';
}
?>
Комментарии 1
  • Kinoshnik
      

    Элемент курса, позволяющий студенту оценить собственную работу перед ее отправкой на проверку. В настоящее время практически не используется, так как его функции унаследованы и развиты в элементе курса «Семинар».

Добавить комментарий для Kinoshnik Кликните сюда чтобы отменить ответ ×

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Ждем обратной связи для взаимовыгодного сотрудничества

Наша работа ориентирована на b2b сегмент. Мы стремимся качественно предоставлять весь спектр услуг, связанный с LMS Moodle, чтобы доходы клиентов и их удовлетворенность нашей работой были максимальными. Если у Вас возникли вопросы или предложения — пишите.

Откроется всплывающее окно

Напишите нам
Технологии программирования Moodle: CSS3, AngularJS, Bootstrap

© 2014–2016, ООО «Вебкор». Все права защищены.