Найти в Дзене
ИТ Дилетант

Обходим ограничения плагина Configurable Reports в LMS Moodle

Заказчик использует систему управления обучением Moodle и плагин Configurable Reports через который создает дополнительные и нестандартные отчеты по запросу руководства. Появилась необходимость сделать SQL запрос для плагина Configurable Reports который будет отображать список администраторов сайта (аналог страницы Администрирование > Пользователи > Права > Администраторы сайта) без организации доступа к панели администратора средствами LMS Moodle. Список администраторов LMS Moodle хранит в глобальной переменной $CFG->siteadmins значение которой может определяться через файл config.php или храниться в базе данных в таблице {config} в строке с параметром name = siteadmins. В нашем случае используется второй метод, поэтому мы можем создать нужный отчет через плагин Configurable Reports. Проблема с который мы столкнемся, это необходимость подставить значение из таблицы {config} в запрос к таблице {user}. Стандартный подход с использованием вложенного запроса здесь не сработает, т.к. из

Заказчик использует систему управления обучением Moodle и плагин Configurable Reports через который создает дополнительные и нестандартные отчеты по запросу руководства.

Появилась необходимость сделать SQL запрос для плагина Configurable Reports который будет отображать список администраторов сайта (аналог страницы Администрирование > Пользователи > Права > Администраторы сайта) без организации доступа к панели администратора средствами LMS Moodle.

Список администраторов LMS Moodle хранит в глобальной переменной $CFG->siteadmins значение которой может определяться через файл config.php или храниться в базе данных в таблице {config} в строке с параметром name = siteadmins. В нашем случае используется второй метод, поэтому мы можем создать нужный отчет через плагин Configurable Reports.

Проблема с который мы столкнемся, это необходимость подставить значение из таблицы {config} в запрос к таблице {user}. Стандартный подход с использованием вложенного запроса здесь не сработает, т.к. из таблицы {config} мы получаем список в виде строки содержащей ID пользователей разделенные запятыми. В LMS Moodle данный список перед использованием обрабатывается PHP функцией exlplode. К сожалению, при составлении запроса SQL для плагина Configurable Reports, нет возможности использовать функции PHP или похожие конструкции в рамках SQL. При попытке их создания плагин выводит сообщение об ошибке: В запросе используется одно из запрещенных слов (alter, create, delete, drop, grant, insert, into, truncate, update, set, vacuum, reindex, discard, lock).

Так как нам нет необходимости обрабатывать список ID пользователей из таблицы {config} и требуется его просто подставить в запрос, то мы можем использовать функцию INSTR которая осуществляет поиск по строке. Для поиска будем использовать шаблон в виде ID пользователя окруженного запятыми. Также, для корректной работы функции INSTR, будем используем CONCAT и добавим запятые в начале и конце строки со списком ID пользователей из таблицы {config}.

SELECT
CONCAT(u.lastname, ' ', u.firstname, ' ', u.middlename) as 'ФИО'
FROM
{user} u
WHERE
INSTR(
CONCAT(',',CAST((SELECT c.value FROM {config} c WHERE c.name = 'siteadmins') as CHAR),','),
CONCAT(',', u.id, ',')
)
ORDER BY u.lastname, u.firstname, u.middlename


Данный способ выглядит очень неуклюже, но в рамках заданных ограничений позволяет быстро решить поставленную задачу без необходимости средствами SQL разбивать строку по разделителю или создавать дополнительные функции.