28
с точки зрения программиста 12 th Central and Eastern European Software Engineering Conference in Russia – CEE-SECR 2016 ctober 28-30, 2016 $meta = array( ‘author’ => ‘Igor Sazonov’ ,’position’ => ‘programmer’ ,’company’ => ‘LMSTech’ ,’website’ => ‘https://lmstech.ru ,’city’ => ‘St. Petersbur ); https://www.facebook.com/groups/elearning.spb/

LMS Moodle с точки зрения программиста

Embed Size (px)

Citation preview

Page 1: LMS Moodle с точки зрения программиста

с точки зрения программиста

12th Central and Eastern European Software Engineering Conference in Russia – CEE-SECR 2016

October 28-30, 2016

$meta = array(‘author’ => ‘Igor Sazonov’,’position’ => ‘programmer’,’company’ => ‘LMSTech’,’website’ => ‘https://lmstech.ru’,’city’ => ‘St. Petersburg’

);https://www.facebook.com/groups/elearning.spb/

Page 2: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Как всегда – Introduction

Moodle — система управления курсами (электронное обучение), также известная как система управления обучением или виртуальная обучающая среда (англ.). Является аббревиатурой от англ. Modular Object-Oriented Dynamic Learning Environment (модульная объектно-ориентированная динамическая обучающая среда). Представляет собой свободное (распространяющееся по лицензии GNU GPL) веб-приложение, предоставляющее возможность создавать сайты для онлайн-обучения.

Page 3: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Как всегда – Introduction

Официальный сайт https://moodle.org/

Год основания 2003

Текущая версия 3.1.2 (28.10.2016)

Язык программирования PHP

База данных Реляционная: MySQL, PostgreSQL, MSSQL, Oracle

Основатель Martin Dougiamas

Лицензия GNU GPL v2

Page 4: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Забегая вперед…

Какие навыки нужны Moodle-разработчику

Владение ООП PHP Хорошее владение SQL Умение тестировать код Терпение

Page 5: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Архитектура. Абстракция

Классическая трехслойная архитектура

Model (DB)-Library-View (index.php)

Page 6: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Архитектура. Абстракция

moodledata – папка для хранения динамических файлов Moodle (картинки, кеши, загруженные

файлы итп)

Разработчик вправе строить свои слои, подключать свои библиотеки,

г*вн*кодить итд.Нет строгой архитектуры

зависимостей и связок

* разработчик только изучивший PHP* профессиональный (ленивый) разработчик

Page 7: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Архитектура. Модули в ядреМ – модульностьВсе кроме шаблонов (тем) и админки в ядре Moodle – это модули• Moodle – это главный модуль• Тест – модуль• Авторизация – модуль• Блок с информацией – модуль• Отчеты – модуль• итд

* модули в папке /mod – это часть модулей, просто они официально называются «Модули»

Page 8: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Архитектура. Типы модулейДополнительные модули (плагины) делятся по типам (модульность).

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

https://docs.moodle.org/dev/Plugin_types

* входная точка модуля – (как правило) конструктор класса, имеющего родительский класс

Page 9: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Дополнительные модулиАлгоритм разработки дополнительного модуля

(плагина) Выбор типа плагина согласно задаче Продумывание архитектуры кода (опционально – только для

больших плагинов), изучение базового класса Заполнение базовой (необходимой) структуры модуля

(version.php, lang/en, «точка входа»), наименования Заход в «точку входа» Программированиеfor ($i=1;$i<={уверенность в качестве кода и отладке};$i++) { Тестирование Отладка} «Причесывание» кода Production

Page 10: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Дополнительные модули. Пример. Блок (Block) feedback

/blocks/feedback/db

/blocks/feedback

/blocks/feedback/lang/en

Page 11: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Дополнительные модули. Пример. Блок (Block) feedback. Код

Документация: https://docs.moodle.org/dev/Blocks

version.php (обязательный файл)$plugin->version = 2016022800;$plugin->requires = 2013111805; // Requires Moodle 2.6.5 or later$plugin->cron = 1; //optional$plugin->release = '1.0.0 (Build: 2016022800)'; //optional$plugin->maturity = MATURITY_STABLE; //optional$plugin->component = ‘block_feedback';

Page 12: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Дополнительные модули. Пример. Блок (Block) feedback. Код

Документация: https://docs.moodle.org/dev/Blocks

db/install.php (необязательно)function xmldb_block_feedback_install() { //your magic}

db/uninstall.php (необязательно)function xmldb_block_feedback_uninstall() { //your magic}

Подробнее: https://docs.moodle.org/dev/Upgrade_API#Other_things_that_can_be_in_the_db_folder

Page 13: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Дополнительные модули. Пример. Блок (Block) feedback. Локализация

lang/en/block_feedback.php (обязательно хотя бы en)

$string['pluginname'] = 'Feedback';$string[‘feedback_title'] = 'Feedback block title';

* совет: если хотите переводить плагин, не переводите на другие языки, пока полностью не закончите разработку и отладку

Документация: https://docs.moodle.org/dev/Blocks

Page 14: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Дополнительные модули. Пример. Блок (Block) feedback. Локализация

block_feedback.php («входная» точка, обязательно для блоков)

class block_feedback extends block_list { //родительский класс block_base или block_listpublic function init() {

$this->title = get_string(‘feedback_title’, ‘block_feedback’); //заголовок}

public function get_content() {$this->content = ‘I am block!’;return $this->content;

}}

Документация: https://docs.moodle.org/dev/Blocks

Page 15: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Подведем итог по дополнительным модулям и архитектуре

НедостаткиНет единой архитектуры разных модулей.

«Входные точки» могут отличаться принципиально

Модули очень сильно изолированы в рамках своих задач

Нет «перехватчиков» данных или «крючков» (аналогия с add_filter() и add_action() в WordPress)

Нет первоначальной автозагрузкиМного проблем с обслуживанием локализации

Page 16: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Подведем итог по дополнительным модулям и архитектуреПреимущества

Единая архитектура обязательных файлов и логики в них

ООП (в рамках модуля)Много примеров в core-модулях

Page 17: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

База данныхПоддерживаемые драйверы MySQL, PostgreSQL, MSSQL,

OracleКоличество таблиц БД в ядре ~320Количество активно используемых таблиц

20- 40

Документация по Data API https://docs.moodle.org/dev/Data_manipulation_API

Page 18: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

База данных. Moodle Data API

Глобальный объект $DBДокументация: https://docs.moodle.org/dev/Data_manipulation_API

global $DB; //подгружаем объектПолучение единственной записи. Будет возвращен ОБЪЕКТ типа stdClass! Префикс от таблицы Moodle не нужен!

$user = $DB->get_record('user', array('firstname'=>'Martin', 'lastname'=>'Dougiamas')); //выборка по полям из одной таблицы mdl_user

$user = $DB->get_record_sql('SELECT * FROM {user} WHERE id = ?', array(1)); //выборка по нативному SQL-запросу

Page 19: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

База данных. Moodle Data API

Глобальный объект $DBДокументация: https://docs.moodle.org/dev/Data_manipulation_API

Получение нескольких записей. Будет возвращен массив ОБЪЕКТов типа stdClass!

get_records($table, array $conditions=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0)get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)

Page 20: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

База данных. Moodle Data API

Глобальный объект $DBДокументация: https://docs.moodle.org/dev/Data_manipulation_API

global $DB;

Получение единственной записи. Будет возвращен ОБЪЕКТ типа stdClass! Префикс от таблицы Moodle не нужен!

$user = $DB->get_record('user', array('firstname'=>'Martin', 'lastname'=>'Dougiamas')); //выборка по полям из одной таблицы mdl_user

$user = $DB->get_record_sql('SELECT * FROM {user} WHERE id = ?', array(1)); //выборка по нативному SQL-запросу

Page 21: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

База данных. Moodle Data API

Глобальный объект $DBДокументация: https://docs.moodle.org/dev/Data_manipulation_API

Получение нескольких записей. Будет возвращен массив ОБЪЕКТов типа stdClass!

get_records($table, array $conditions=null, $sort='', $fields='*', $limitfrom=0, $limitnum=0)get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)

Page 22: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

База данных. Moodle Data API. ТонкостиСоветы, тонкости, кейсы

Если Вы используете нативные запросы (а Вы из будете использовать =), тестируйте их еще хотя бы на одном драйвере, например MySQL + PostgreSQL

ВАЖНО. При выборке нескольких записей (из нескольких таблиц с помощью JOIN) и нативном запросе (например методом get_records_sql) возвращается массив с ключами первого поля выборки, поэтому необходимо обеспечить уникальность первого ключа и явно указывать нужные поля выборки (вместо SELECT *)

При insert-запросах пользоваться транзакциями Слабая поддержка большого количества insert-запросов

(настройка MySQL не помогает, отрабатывает не более 50 insert-запросов в цикле)

$DB->insert_record($table, $dataobject, $returnid=true, $bulk=false)$bulk не участвует в жизни метода (MySQL)

Документация: https://docs.moodle.org/dev/Data_manipulation_API

Page 23: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Локализация. String API

Обязательная папка lang в модуле содержит подпапки локализаций/lang

/en – английский язык/ru – русский язык/es – испанский язык

итд, список всех кодов: https://github.com/moodle/moodle/blob/master/lang/en/countries.php

Документация: https://docs.moodle.org/dev/String_API

Совет. Только после полного завершения работ по модулю приступайте к полной локализации

Page 24: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Локализация. String API

Внутри папок – php-файл локализации (массив $string) с названием модуля, например block_feedback.php

$string[‘denegnet’] = ‘Вы держитесь! Хорошего настроения!’;

//в кодеecho get_string(‘denegnet’, ‘block_feedback’) === print_string(‘denegnet’, ‘block_feedback’)

Документация: https://docs.moodle.org/dev/String_API

Page 25: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Объект $CFG

Объект $CFG содержит в себе конфигурационные данные и данные из БДВызов: global $CFG;

HTTP(s) адрес текущего Moodle: $CFG->wwwrootСерверный адрес текущего Moodle: $CFG->dirrootСерверный адрес к папке moodledata: $CFG->datarootПолный список ключей и значений объекта: print_r($CFG);

Page 26: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

FrontEnd (JavaScript) Базовый JS-фреймворк – YUI (Yahoo User Interface).

http://yuilibrary.com/ RIP since 2014. Документация - https://docs.moodle.org/dev/YUI

С версии 2.9 (май 2015) в Moodle внедрена поддержка jQuery из ядра, НО! через AMD-модули, подключаемые через RequireJS: http://requirejs.org/. Все подключаемые из вне скрипты/библиотеки должны поддерживать AMD. Поддержка в Moodle – папка amd с подпапками build (production) и src (development)require(['jquery', ‘block_feedback/timer'], function(jQuery, timer) {…});

Документация: https://docs.moodle.org/dev/Javascript_Modules Доступ к информационным объектам через javascript-переменную-

объект M, например к данным из $CFG данные можно получить через строку M.cfg.wwwroot

Page 27: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Безопасность Защищаем входные данные от XSS-атак

Функция clean_param($param, $type). $param – входные данные, $type – ожидаемый тип данных

Возможные типы данных: http://xref-diff.mukudu-dev.net/moodle26/lib/moodlelib.php.source.html#l765

Совет. Если не знаете точно ожидаемый тип данных – используйте PARAM_CLEAN

Проверка Session Key. В сессию записывается хешированная строка в зависимости от ID текущего пользователя confirm_sesskey( $sesskey = NULL ) – проверка $sesskey из параметра

или из $_POST[‘sesskey’] require_sesskey() – блокирует все вызовы, если confirm_sesskey()

выдала false В javascript – M.cfg.sesskey

Система контекстов - https://docs.moodle.org/dev/Access_APIс

Page 28: LMS Moodle с точки зрения программиста

с точки зрения программиста

October 28-30, 2016

Конец.

Спасибо за внимание!$moodledev = array(

‘author’ => ‘Igor Sazonov’,’position’ => ‘programmer’,’company’ => ‘LMSTech’,’website’ => ‘https://lmstech.ru’,’city’ => ‘St. Petersburg’,’email’ => ‘[email protected]’,’facebook’ =>

‘https://www.facebook.com/igor.sazonov.3’,’spb.group’ =>

‘https://www.facebook.com/groups/elearning.spb/’);