Модификация существующих плагинов

Модификация существующих плагинов

от Алексей Пруглов -
Количество ответов: 15

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

Как правильно добавить туда ссылку? Вариант захардкодить не подходит. Как правильно реализовать данное дополнение?

Версия мудла 2.8.5

В ответ на Алексей Пруглов

Re: Модификация существующих плагинов

от Alexandre Scherbyna -

Непонятно, куда вы ссылку хотите добавлять? Что это за плагин вы не говорите. И язык совершенно незнаком. улыбаюсь

В ответ на Alexandre Scherbyna

Re: Модификация существующих плагинов

от Александр Козлов -

Плагин как я понял "Лекция", но зачем это кнопка, мне даже интересно...

В ответ на Александр Козлов

Re: Модификация существующих плагинов

от Алексей Пруглов -
1) сделал скриншот данной страницы на русском языке (язык предыдущего был шведский)


2) Что это за плагин? Данное меню выводится в moodle2\www\mod\lesson\renderer.php в функции add_page_links(lesson $lesson, $prevpageid=false)
3) Меня интересует как добавить в данное меню свой пункт, но через свой плагин (отдельный). т.к. в последствии хочется сделать решение для поставленных задач в виде отдельных плагинов. Например в Drupal для этого используется система хуков. Есть ли в moodle 2 что-то подобное? Как бы вы добавляли данный пункт меню? (ответ захардкодить не подходит, как я писал выше хочу сделать решение задачи в виде отдельного плагина)
В ответ на Алексей Пруглов

Re: Модификация существующих плагинов

от Александр Козлов -

Если не ошибаюсь этот плагин относится к группе mod т.е. вам сюда за документацией по этим плагинам https://docs.moodle.org/dev/Activity_modules

А в папке moodle2\www\mod\lesson\ уже ищете интересующий вас файл-текст и правите, но это наверно будет не правильно т.к. лучше наверно написать сперва нужный вам плагин, а потом при его установки он сам бы как то прописывался в стандартный плагин Moodle в данном случаи lesson. Или наверно ещё правильнее будет сделать на основе этого плагина свой плагин (связку плагинов), чтобы не было проблем при обновлении Moodle.

В ответ на Александр Козлов

Re: Модификация существующих плагинов

от Алексей Пруглов -
"Или наверно ещё правильнее будет сделать на основе этого плагина свой плагин (связку плагинов), чтобы не было проблем при обновлении Moodle." - меня интересует именно данный вопрос. Как это сделать? Как делается подобная связка плагинов?
В ответ на Алексей Пруглов

Re: Модификация существующих плагинов

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

Алексей, архитектура moodle не такая, как у drupal. Модуль moodle подразумевает некоторую законченность логики, поэтому никаких дополнительных точек входа в нем не предусмотрено. Если какой-то модуль подразумевает расширение, он реализует механизм подмодулей, с точным обозначением того, какие именно функции расширяется подмодулями.

У вас на картинке модуль Лекция (lesson). Чего вы такого хотите докрутить к этому модулю, если не секрет?

В общем случае нужно сделать следующее - скопировать папку mod\lesson в mod\lesson2, заменить везде в модуле, названиях функций, именах файлов в папке с языковым пакетом (за исключением вызовов get_string, чтобе не дублировать строки) lesson на lesson2. Новый модуля создаст новые таблицы в базе данных. После этого нужно будет сделать отдельный плагин (например типа блок) для конвертации уроков из модуля lesson в lesson2.

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

В ответ на Vadim Dvorovenko

Re: Модификация существующих плагинов

от Алексей Пруглов -
Вадим, спасибо за ответ. Понял принцип работы moodle (расширяемости). Насчет "У вас на картинке модуль Лекция (lesson). Чего вы такого хотите докрутить к этому модулю, если не секрет?" - не секрет, просто задача непонятная, но понятно что потребуется расширить тип лекции. Думаю сделать решение на основе модуля lesson и использованием его таблиц (сделав зависимость модулей чтобы не использовать конвертацию уроков).

Спасибо за помощь!
В ответ на Алексей Пруглов

Re: Модификация существующих плагинов

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

Вы не сможете просто так сделать новый модуль, который использует таблицы старого. Moodle требует, чтобы для каждого плагина типа элемент курса (лекция, тест, задание и т.п.) была создана таблица с именем, совпадающим с именем модуля. В этой таблице должно быть несколько предопределенных полей - посмотрите в базе данных на таблицы mdl_assign, mdl_quiz, mdl_lesson - во всех есть несколько одинаковых полей. А за эту таблицу у вас зацепятся, скорее всего, и все остальные

В ответ на Vadim Dvorovenko

Re: Модификация существующих плагинов

от Alexandre Scherbyna -
Вадим, тогда подскажите, как же все-таки сделать новый модуль, который работает с таблицами старого?

Есть идея создать упрощенную версию модуля Посещаемость (Attendance), чтобы он показывал посещение не по одному курсу, в котором находится, а по всем курсам. С точки зрения SQL переделка несложная. Нужно убрать в запросе фильтр по номеру курса.

Модуль проще оригинала, т.к. в нем остается единственная функция - отображение данных в хронологической последовательности: 1-я прара, 2-я пара, ... и "сплошной" подсчет баллов посещаемости по всем курсам. Ввода данных в переделанном модуле нет никакого, т.к. отметки о посещаемости вводятся в курсах дисциплин с помощью стандартных модулей.

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

В ответ на Alexandre Scherbyna

Re: Модификация существующих плагинов

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

Переделывать модуль сложно. Даже при простой замене в коде attendance на attendance2 потребуется ручная проверка всего кода, прежде чем модуль заработает точно также, но под новым именем. А там же пара из двух связанных модулей - блока и элемента курса.

Может быть попробовать ограничиться custom sql report, в дополнение к существующим модулям, раз сам sql-запрос уже есть

В ответ на Vadim Dvorovenko

Re: Модификация существующих плагинов

от Alexandre Scherbyna -

Его родной отчет можно прокручивать с помощью календаря, там есть кнопки: день, неделя, месяц и пр. Хотелось бы сохранить все это богатство в измененном отчете, отличающемся от стандартного только тем, что столбцы берутся не из одного курса, а из всех курсов, которые посещали эти студенты. Поэтому custom sql report - это не то.

А может попробовать этот измененный отчет в виде блока оформить? Установка блока же не предусматривает обязательного создания собственных таблиц, как для модуля?

В ответ на Alexandre Scherbyna

Re: Модификация существующих плагинов

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

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

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

В ответ на Vadim Dvorovenko

Re: Модификация существующих плагинов

от Alexandre Scherbyna -

Вы имеете в виду клонирование этого блока или любого? А как клонируется блок? Достаточно просто папку переименовать или что-то внутри нужно прописывать?

Если у вас Moodle используется для поддержки очных занятий, то я вам очень рекомендую этот модуль. Он позволяет отмечать присутствие студентов гораздо быстрее, чем обычный журнал. Сначала одним кликом можно отметить всех студентов, как присутствующих (или отсутствующих, если таковых больше), а затем еще по одному клику на каждого отсутствующего (или, наоборот, присутствующего) студента.

Модуль удобно отображает статистику посещаемости (день, неделя, месяц, все) и начисляет за нее баллы. Оценка "за посещаемость" попадает в журнал и может влиять на итоговую оценку по дисциплине. Перечень занятий создается быстро, особенно, если они проводятся регулярно, например, 2-я пара по понедельникам. Можно создавать лекционные занятия (для всех групп) и практические (для одной группы)...

В ответ на Alexandre Scherbyna

Re: Модификация существующих плагинов

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

Клонирование любого плагина, в том числе и блока делается примерно одинаково.

Копируется в новую папку. Пусть вместо attendance будет attendance2

По всех файлах делается переименование названий функций и классов, содержащих название модуля.

Переименовывается второй параметр вызовов к get_string и lang_string (в котором имя модуля передается). Но в этом случае, все строки плагина потом нужно будет переводить заново. Можно не менять второй параметр, но тогда нужно, чтобы в системе присутствовал и оригинальный модуль.

Для простоты можно сделать везде замену с block_attendance на block_attendance2, тогда переименуется в названиях классов и в вызовах get_string. Потом сделать замену 'block_attendance2' на 'block_attendance', тогда в get_string поменяются обратно, а названия классов останутся, так как они без кавычек, а тут в кавычках.

Потом нужно переименовать название файла в lang/en.

И исправить название component в version.php.

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