SlideShare a Scribd company logo
1 of 28
с точки зрения программиста
12th Central and Eastern
European Software
Engineering Conference in
Russia – CEE-SECR 2016October 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/
с точки зрения программистаOctober 28-30, 2016
Как всегда – Introduction
Moodle — система управления курсами (электронное обучение), также
известная как система управления обучением или виртуальная
обучающая среда (англ.). Является аббревиатурой от англ. Modular
Object-Oriented Dynamic Learning Environment (модульная
объектно-ориентированная динамическая обучающая среда).
Представляет собой свободное (распространяющееся по лицензии
GNU GPL) веб-приложение, предоставляющее возможность создавать
сайты для онлайн-обучения.
с точки зрения программиста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
с точки зрения программистаOctober 28-30, 2016
Забегая вперед…
Какие навыки нужны Moodle-разработчику
 Владение ООП PHP
 Хорошее владение SQL
 Умение тестировать код
 Терпение
с точки зрения программистаOctober 28-30, 2016
Архитектура. Абстракция
Классическая трехслойная архитектура
Model (DB)-Library-View (index.php)
с точки зрения программистаOctober 28-30, 2016
Архитектура. Абстракция
moodledata – папка для хранения динамических файлов Moodle
(картинки, кеши, загруженные файлы итп)
Разработчик вправе строить свои слои,
подключать свои библиотеки, г*вн*кодить итд.
Нет строгой
архитектуры
зависимостей и связок
* разработчик только изучивший PHP * профессиональный (ленивый) разработчик
с точки зрения программистаOctober 28-30, 2016
Архитектура. Модули в ядре
М – модульность
Все кроме шаблонов (тем) и админки в ядре
Moodle – это модули
• Moodle – это главный модуль
• Тест – модуль
• Авторизация – модуль
• Блок с информацией – модуль
• Отчеты – модуль
• итд
* модули в папке /mod – это часть модулей, просто они официально называются «Модули»
с точки зрения программистаOctober 28-30, 2016
Архитектура. Типы модулей
Дополнительные модули (плагины) делятся по типам (модульность). Каждый тип модуля имеет
свою папку «точку входа» (могут отличаться) и набор обязательных файлов и папок
https://docs.moodle.org/dev/Plugin_types
* входная точка модуля – (как правило) конструктор класса, имеющего родительский класс
с точки зрения программистаOctober 28-30, 2016
Дополнительные модули
Алгоритм разработки дополнительного модуля (плагина)
 Выбор типа плагина согласно задаче
 Продумывание архитектуры кода (опционально – только для больших плагинов), изучение
базового класса
 Заполнение базовой (необходимой) структуры модуля (version.php, lang/en, «точка входа»),
наименования
 Заход в «точку входа»
 Программирование
for ($i=1;$i<={уверенность в качестве кода и отладке};$i++) {
 Тестирование
 Отладка
}
 «Причесывание» кода
 Production
с точки зрения программистаOctober 28-30, 2016
Дополнительные модули. Пример. Блок (Block) feedback
/blocks/feedback/db
/blocks/feedback
/blocks/feedback/lang/en
с точки зрения программиста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';
с точки зрения программиста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
с точки зрения программиста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
с точки зрения программистаOctober 28-30, 2016
Дополнительные модули. Пример. Блок (Block) feedback.
Локализация
block_feedback.php («входная» точка, обязательно для блоков)
class block_feedback extends block_list { //родительский класс block_base или block_list
public 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
с точки зрения программистаOctober 28-30, 2016
Подведем итог по дополнительным модулям и архитектуре
Недостатки
Нет единой архитектуры разных модулей. «Входные точки» могут
отличаться принципиально
Модули очень сильно изолированы в рамках своих задач
Нет «перехватчиков» данных или «крючков» (аналогия с add_filter()
и add_action() в WordPress)
Нет первоначальной автозагрузки
Много проблем с обслуживанием локализации
с точки зрения программистаOctober 28-30, 2016
Подведем итог по дополнительным модулям и архитектуре
Преимущества
Единая архитектура обязательных файлов и логики в
них
ООП (в рамках модуля)
Много примеров в core-модулях
с точки зрения программистаOctober 28-30, 2016
База данных
Поддерживаемые драйверы MySQL, PostgreSQL, MSSQL, Oracle
Количество таблиц БД в ядре ~320
Количество активно используемых таблиц 20- 40
Документация по Data API https://docs.moodle.org/dev/Data_manipulatio
n_API
с точки зрения программиста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-запросу
с точки зрения программиста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)
с точки зрения программиста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-запросу
с точки зрения программиста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)
с точки зрения программиста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
с точки зрения программиста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
Совет. Только после полного завершения
работ по модулю приступайте к полной
локализации
с точки зрения программиста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
с точки зрения программистаOctober 28-30, 2016
Объект $CFG
Объект $CFG содержит в себе конфигурационные данные и
данные из БД
Вызов: global $CFG;
HTTP(s) адрес текущего Moodle: $CFG->wwwroot
Серверный адрес текущего Moodle: $CFG->dirroot
Серверный адрес к папке moodledata: $CFG->dataroot
Полный список ключей и значений объекта: print_r($CFG);
с точки зрения программиста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
с точки зрения программиста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с
с точки зрения программистаOctober 28-30, 2016
Конец.
Спасибо за внимание!
$moodledev = array(
‘author’ => ‘Igor Sazonov’
,’position’ => ‘programmer’
,’company’ => ‘LMSTech’
,’website’ => ‘https://lmstech.ru’
,’city’ => ‘St. Petersburg’
,’email’ => ‘sovletig@gmail.com’
,’facebook’ => ‘https://www.facebook.com/igor.sazonov.3’
,’spb.group’ =>
‘https://www.facebook.com/groups/elearning.spb/’
);

More Related Content

What's hot

Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0
Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0
Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0Сообщество eLearning PRO
 
Использование e-learning в последипломном медицинском образовании
Использование e-learning в последипломном медицинском образованииИспользование e-learning в последипломном медицинском образовании
Использование e-learning в последипломном медицинском образованииZalim Balkiz
 
Разработка и применение УМК с помощью сервиса UDUTU.COM
Разработка и применение УМК с помощью сервиса UDUTU.COMРазработка и применение УМК с помощью сервиса UDUTU.COM
Разработка и применение УМК с помощью сервиса UDUTU.COMasfadell24
 
Практикум Web программирование
Практикум Web программированиеПрактикум Web программирование
Практикум Web программированиеRauan Ibraikhan
 

What's hot (9)

1zapuskprogrammyi
 1zapuskprogrammyi 1zapuskprogrammyi
1zapuskprogrammyi
 
Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0
Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0
Moodle в электронном обучении: компоненты, возможности, инструменты Веб 2.0
 
Система Competentum.ИНСТРУКТОР
Система Competentum.ИНСТРУКТОРСистема Competentum.ИНСТРУКТОР
Система Competentum.ИНСТРУКТОР
 
Использование e-learning в последипломном медицинском образовании
Использование e-learning в последипломном медицинском образованииИспользование e-learning в последипломном медицинском образовании
Использование e-learning в последипломном медицинском образовании
 
Drupal Modules
Drupal ModulesDrupal Modules
Drupal Modules
 
Разработка и применение УМК с помощью сервиса UDUTU.COM
Разработка и применение УМК с помощью сервиса UDUTU.COMРазработка и применение УМК с помощью сервиса UDUTU.COM
Разработка и применение УМК с помощью сервиса UDUTU.COM
 
АЭК. Модуль 4
АЭК. Модуль 4АЭК. Модуль 4
АЭК. Модуль 4
 
Практикум Web программирование
Практикум Web программированиеПрактикум Web программирование
Практикум Web программирование
 
АЭК. Модуль 1
АЭК. Модуль 1АЭК. Модуль 1
АЭК. Модуль 1
 

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

C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.Igor Shkulipa
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.Igor Shkulipa
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.Igor Shkulipa
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsNoveo
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЯковенко Кирилл
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.Igor Shkulipa
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
компоненты E learn для Plone
компоненты E learn для Ploneкомпоненты E learn для Plone
компоненты E learn для PloneSergey Greger
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
IOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureIOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureVadim Novitskiy
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 

Similar to LMS Moodle с точки зрения программиста (20)

Backbone js
Backbone jsBackbone js
Backbone js
 
C# Web. Занятие 16.
C# Web. Занятие 16.C# Web. Занятие 16.
C# Web. Занятие 16.
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Symfony 3
Symfony 3Symfony 3
Symfony 3
 
Drupal Migrate
Drupal MigrateDrupal Migrate
Drupal Migrate
 
Лекция #7. Django ORM
Лекция #7. Django ORMЛекция #7. Django ORM
Лекция #7. Django ORM
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Android - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, genericsAndroid - 02 - annotations, exceptions, io, generics
Android - 02 - annotations, exceptions, io, generics
 
Лекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-frameworkЛекция #6. Введение в Django web-framework
Лекция #6. Введение в Django web-framework
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
компоненты E learn для Plone
компоненты E learn для Ploneкомпоненты E learn для Plone
компоненты E learn для Plone
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Genome
GenomeGenome
Genome
 
IOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureIOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows Azure
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 

More from CEE-SEC(R)

Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...CEE-SEC(R)
 
Проектный офис и аналитик
Проектный офис и аналитикПроектный офис и аналитик
Проектный офис и аналитикCEE-SEC(R)
 
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсамОнлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсамCEE-SEC(R)
 
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...CEE-SEC(R)
 
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...CEE-SEC(R)
 
«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентамиCEE-SEC(R)
 
Машинное обучение на каждый день
Машинное обучение на каждый деньМашинное обучение на каждый день
Машинное обучение на каждый деньCEE-SEC(R)
 
Process и Case Management в информационной системе:
Process и Case Management в информационной системе: Process и Case Management в информационной системе:
Process и Case Management в информационной системе: CEE-SEC(R)
 
Проблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестированияПроблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестированияCEE-SEC(R)
 
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...CEE-SEC(R)
 
Ай-трекинг в UX исследованиях
Ай-трекинг в UX исследованияхАй-трекинг в UX исследованиях
Ай-трекинг в UX исследованияхCEE-SEC(R)
 
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...CEE-SEC(R)
 
Технологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследованияТехнологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследованияCEE-SEC(R)
 
Субъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятияхСубъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятияхCEE-SEC(R)
 
Шаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в VirtuozzoШаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в VirtuozzoCEE-SEC(R)
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииCEE-SEC(R)
 
Семантическое ядро рунета
Семантическое ядро рунетаСемантическое ядро рунета
Семантическое ядро рунетаCEE-SEC(R)
 
Разработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательствРазработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательствCEE-SEC(R)
 
IT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартаповIT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартаповCEE-SEC(R)
 
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»CEE-SEC(R)
 

More from CEE-SEC(R) (20)

Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...Подбор и адаптация методологий разработки ПО под различные типы производствен...
Подбор и адаптация методологий разработки ПО под различные типы производствен...
 
Проектный офис и аналитик
Проектный офис и аналитикПроектный офис и аналитик
Проектный офис и аналитик
 
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсамОнлайн-революция: от ранних репозиториев – к современным МООС-курсам
Онлайн-революция: от ранних репозиториев – к современным МООС-курсам
 
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
Массовый параллелизм для гетерогенных вычислений на C++ для беспилотных автом...
 
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
Как компании с вузами вместе ИТ специалиста готовили или Чем ИТ компания може...
 
«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами«Знак качества» как инструмент анализа восприятия продукта клиентами
«Знак качества» как инструмент анализа восприятия продукта клиентами
 
Машинное обучение на каждый день
Машинное обучение на каждый деньМашинное обучение на каждый день
Машинное обучение на каждый день
 
Process и Case Management в информационной системе:
Process и Case Management в информационной системе: Process и Case Management в информационной системе:
Process и Case Management в информационной системе:
 
Проблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестированияПроблемы процесса разработки с точки зрения тестирования
Проблемы процесса разработки с точки зрения тестирования
 
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
Как ЧПУ станку в домашней мастерской не превратиться в мульт героев “двое из ...
 
Ай-трекинг в UX исследованиях
Ай-трекинг в UX исследованияхАй-трекинг в UX исследованиях
Ай-трекинг в UX исследованиях
 
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
Настоящее и будущее решений для разработки кросс-платформенных мобильных гибр...
 
Технологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследованияТехнологичный подход к повышению продуктивности – кейсы и исследования
Технологичный подход к повышению продуктивности – кейсы и исследования
 
Субъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятияхСубъектно-ориентированные информационные системы на предприятиях
Субъектно-ориентированные информационные системы на предприятиях
 
Шаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в VirtuozzoШаблоны контейнеров в Virtuozzo
Шаблоны контейнеров в Virtuozzo
 
Apache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализацииApache Storm: от простого приложения до подробностей реализации
Apache Storm: от простого приложения до подробностей реализации
 
Семантическое ядро рунета
Семантическое ядро рунетаСемантическое ядро рунета
Семантическое ядро рунета
 
Разработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательствРазработка требований для противоречащих законодательств
Разработка требований для противоречащих законодательств
 
IT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартаповIT-Лаборатория: кузница кадров и стартапов
IT-Лаборатория: кузница кадров и стартапов
 
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»Законы создания IT команд и следствия законов для IT проектов «на пальцах»
Законы создания IT команд и следствия законов для IT проектов «на пальцах»
 

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

  • 1. с точки зрения программиста 12th Central and Eastern European Software Engineering Conference in Russia – CEE-SECR 2016October 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/
  • 2. с точки зрения программистаOctober 28-30, 2016 Как всегда – Introduction Moodle — система управления курсами (электронное обучение), также известная как система управления обучением или виртуальная обучающая среда (англ.). Является аббревиатурой от англ. Modular Object-Oriented Dynamic Learning Environment (модульная объектно-ориентированная динамическая обучающая среда). Представляет собой свободное (распространяющееся по лицензии GNU GPL) веб-приложение, предоставляющее возможность создавать сайты для онлайн-обучения.
  • 3. с точки зрения программиста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
  • 4. с точки зрения программистаOctober 28-30, 2016 Забегая вперед… Какие навыки нужны Moodle-разработчику  Владение ООП PHP  Хорошее владение SQL  Умение тестировать код  Терпение
  • 5. с точки зрения программистаOctober 28-30, 2016 Архитектура. Абстракция Классическая трехслойная архитектура Model (DB)-Library-View (index.php)
  • 6. с точки зрения программистаOctober 28-30, 2016 Архитектура. Абстракция moodledata – папка для хранения динамических файлов Moodle (картинки, кеши, загруженные файлы итп) Разработчик вправе строить свои слои, подключать свои библиотеки, г*вн*кодить итд. Нет строгой архитектуры зависимостей и связок * разработчик только изучивший PHP * профессиональный (ленивый) разработчик
  • 7. с точки зрения программистаOctober 28-30, 2016 Архитектура. Модули в ядре М – модульность Все кроме шаблонов (тем) и админки в ядре Moodle – это модули • Moodle – это главный модуль • Тест – модуль • Авторизация – модуль • Блок с информацией – модуль • Отчеты – модуль • итд * модули в папке /mod – это часть модулей, просто они официально называются «Модули»
  • 8. с точки зрения программистаOctober 28-30, 2016 Архитектура. Типы модулей Дополнительные модули (плагины) делятся по типам (модульность). Каждый тип модуля имеет свою папку «точку входа» (могут отличаться) и набор обязательных файлов и папок https://docs.moodle.org/dev/Plugin_types * входная точка модуля – (как правило) конструктор класса, имеющего родительский класс
  • 9. с точки зрения программистаOctober 28-30, 2016 Дополнительные модули Алгоритм разработки дополнительного модуля (плагина)  Выбор типа плагина согласно задаче  Продумывание архитектуры кода (опционально – только для больших плагинов), изучение базового класса  Заполнение базовой (необходимой) структуры модуля (version.php, lang/en, «точка входа»), наименования  Заход в «точку входа»  Программирование for ($i=1;$i<={уверенность в качестве кода и отладке};$i++) {  Тестирование  Отладка }  «Причесывание» кода  Production
  • 10. с точки зрения программистаOctober 28-30, 2016 Дополнительные модули. Пример. Блок (Block) feedback /blocks/feedback/db /blocks/feedback /blocks/feedback/lang/en
  • 11. с точки зрения программиста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';
  • 12. с точки зрения программиста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
  • 13. с точки зрения программиста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
  • 14. с точки зрения программистаOctober 28-30, 2016 Дополнительные модули. Пример. Блок (Block) feedback. Локализация block_feedback.php («входная» точка, обязательно для блоков) class block_feedback extends block_list { //родительский класс block_base или block_list public 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
  • 15. с точки зрения программистаOctober 28-30, 2016 Подведем итог по дополнительным модулям и архитектуре Недостатки Нет единой архитектуры разных модулей. «Входные точки» могут отличаться принципиально Модули очень сильно изолированы в рамках своих задач Нет «перехватчиков» данных или «крючков» (аналогия с add_filter() и add_action() в WordPress) Нет первоначальной автозагрузки Много проблем с обслуживанием локализации
  • 16. с точки зрения программистаOctober 28-30, 2016 Подведем итог по дополнительным модулям и архитектуре Преимущества Единая архитектура обязательных файлов и логики в них ООП (в рамках модуля) Много примеров в core-модулях
  • 17. с точки зрения программистаOctober 28-30, 2016 База данных Поддерживаемые драйверы MySQL, PostgreSQL, MSSQL, Oracle Количество таблиц БД в ядре ~320 Количество активно используемых таблиц 20- 40 Документация по Data API https://docs.moodle.org/dev/Data_manipulatio n_API
  • 18. с точки зрения программиста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-запросу
  • 19. с точки зрения программиста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)
  • 20. с точки зрения программиста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-запросу
  • 21. с точки зрения программиста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)
  • 22. с точки зрения программиста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
  • 23. с точки зрения программиста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 Совет. Только после полного завершения работ по модулю приступайте к полной локализации
  • 24. с точки зрения программиста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
  • 25. с точки зрения программистаOctober 28-30, 2016 Объект $CFG Объект $CFG содержит в себе конфигурационные данные и данные из БД Вызов: global $CFG; HTTP(s) адрес текущего Moodle: $CFG->wwwroot Серверный адрес текущего Moodle: $CFG->dirroot Серверный адрес к папке moodledata: $CFG->dataroot Полный список ключей и значений объекта: print_r($CFG);
  • 26. с точки зрения программиста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
  • 27. с точки зрения программиста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с
  • 28. с точки зрения программистаOctober 28-30, 2016 Конец. Спасибо за внимание! $moodledev = array( ‘author’ => ‘Igor Sazonov’ ,’position’ => ‘programmer’ ,’company’ => ‘LMSTech’ ,’website’ => ‘https://lmstech.ru’ ,’city’ => ‘St. Petersburg’ ,’email’ => ‘sovletig@gmail.com’ ,’facebook’ => ‘https://www.facebook.com/igor.sazonov.3’ ,’spb.group’ => ‘https://www.facebook.com/groups/elearning.spb/’ );