Перейти к основному содержимому

WP2 Wrapper

WP2 Wrapper или Оболочка - это js приложение для управление курсами. Найти исходники можно здесь (доступ по инвайтам). Собранный вариант входит в состав плагина Sber Static Builder. Последнюю актуальную версию документации WP2 Wrapper можно найти внизу этого документа

В WordPress настройки оболочки (стили, меню, загрузка, доп. контент, постобработка, переводы) редактируются в Внешний вид → Плеер курса. Значения синхронизируются с ACF options Static Builder и применяются при сборке пакета; live-превью кастомайзера обновляет layout/меню/переводы без применения CSS/JS-сниппетов постобработки к HTML страниц.

Оболочка выполняет несколько важных для курса функций:

  • Отображение страниц курса - каждая страница находится в изолированной среде с помощью iframe тега, но может передавать данные в общий Store при помощи вызова window.parent.courseController.data... (см. документацию WP2 Wrapper)
  • Сохранение данных курса между сессиями - данные курса сохраняются даже после закрытия страницы курса. В самом простом варианте это реализовано с помощью сохранения в local storage. В elearning виджетах для упрощенной работы с данными оболочки добавлен класс CourseControllerData.js
  • Управление модальными окнами, панелями (jsPanel), медиа контентом (Player.js), сброс прогресса курса и другие моменты, с которыми можно ознакомиться ниже

По умолчанию в WordPress сайте courseController не добавляется на странице, его можно получить только на странице в сборке Static Builder плагина. Так как все страницы курса находятся в iframe элементах, а courseController в главном окне, то для получения courseController'а нужно обратиться к родительскому окну с помощью window.parent

Обновление данных

При каждом обновлении данных в WP2 Wrapper у всех страниц курса тригерится событие message, которое можно отловить с помощью window.addEventListener("message", () => {}). Это событие можно отлавливать вручную либо автоматически получать обновленные данные с помощью store.js

Документация

config.settings

ПолеЗначениеОписание
debounceSaveDataMs30000Число в миллисекундах, ограничивающее частоту сохранение прогресса. Значение по умолчанию 30000. Отсрочка сбрасывается если сохранение происходит немедленно, например при: завершении курса, достижении страницей 100%, сохранении данных, открытии новой страницы.
preloaderMinimumDisplayTimeMs1000Минимальное время показа прелоадера при загрузке курса или загрузке любой из страниц
useDefaultPreloaderfalseПри false прелоадер берется из svg файла: ./static/load.svg. При true включается вшитый в курс прелоадер.
autoPreloadNextPagetrueАвтоматическая подгрузка следующей страницы
autoCompleteCoursetrueАвтоматически завершить курс когда все страницы достигли 100%
pageAnimation.typehorizontalSlideАнимация переключения между страницами. Для выключения анимации использовать "none"
banBrowserstrueОтключает запуск курса в IE и Safari
pageProgressTypepercentЗначения: percent / check. Способ отслеживания прогресса страниц
translations.enabletrueВключить мультиязычность
translations.showChangeLanguageButtonstrueОтображать кнопку смены языка в тулбаре
translations.defaultLanguageruЯзык, используемый при старте курса
translations.languagesobjectОбъект с доступными языками вида {"ru": "Русский"}

Настройки макета

config.modules.layout

ПолеЗначениеОписание
enableMenutrue/falseВключить отображение бокового меню
enableMenuResizingtrue/falseВключить возможность изменения ширины меню за бок на экранах больше 576 пикселей ширины
enableToolbartrue/falseВключить отображение верхней панели
enableProgresstrue/falseВключить отображение полосы прогресса в верхней панели
enableBottomBartrue/falseВключить отображение нижней панели
navigation"free"/"restricted"Навигация между страницами. Free - обучаемый может перейти на любую страницу. Restricted - следующая страница заблокирована, пока не пройдена предыдущая.
useSectionsInMenutrue/falseВключить отображение секций в меню
showLogotrue/falseПоказать логотип в меню

Данные

Сохранение данных

window.parent.courseController.data.set({id, value, immediate});
ПараметрТипОбязательноОписание
idstringДаКлюч по которому сохранить данные
valuestring
number
object
ДаДанные для сохранения
immediatebooleanНетСохранить данные на сервер немедленно. По умолчанию установлено в false.

Получение данных

window.parent.courseController.data.get({id, selector});
ПараметрТипОбязательноОписание
idstringДа, если не передан selectorКлюч по которому лежат данные
selectorfunctionДа, если не передан idФункция селектор, возвращающая нужное значение: (state) => state.some.deep.data
window.parent.courseController.data.getAll();

Получение данных через подписку на переменную

window.parent.courseController.data.subscribe({id, pageId});
ПараметрТипОбязательноОписание
idstringДаКлюч по которому лежат данные
pageId stringДаСтраница для которой происходит подписка на переменную
После подписки на страницу будет приходить postMessage с event.data.type === "data.update", а в event.data.payload - переменная

Страницы

Сообщение "Страница загружена"

window.parent.courseController.page.ready({id});

Каждая страница обязательно должна вызывать этот метод когда страница готова для показа пользователю (все ресурсы загружены, необходимые данные получены итп).

ПолеТипОбязательноОписание
idstringДаid страницы

Загрузить страницу

window.parent.courseController.page.load({id});
ПолеТипОбязательноОписание
idstringДаid страницы, которую надо добавить на загрузку

Открыть страницу

window.parent.courseController.page.open({id, anchor});
ПолеТипОбязательноОписание
idstringДаid страницы, которая будет открыта
anchorstringНетЯкорная ссылка в формате #anchor

Открыть следующую/предыдущую страницу

window.parent.courseController.page.next();
window.parent.courseController.page.previous();

Сохранить прогресс страницы

window.parent.courseController.page.progress.set({id, percent});
ПолеТипОбязательноОписание
idstringДаid страницы
percentnumberДаЧисло от 0 до 100

Сохранение происходит если новое значение прогресса больше, чем уже сохраненное.

Получить прогресс страницы

window.parent.courseController.page.progress.get({id});
ПолеТипОбязательноОписание
idstringДаid страницы

Возвращаемое значение

Число от 0 до 100

Открыть конкретную страницу курса при запуске курса

Работает только в local. Scorm и xApi не поддерживаются. Для открытия передать в URL курса передать параметр pageId с id открываемой страницы. Например: https://my-awesome-course.ru/?pageId=pageId2

Курс

Завершение курса

window.parent.courseController.course.complete();

Перезапуск курса с начала

window.parent.courseController.course.restart();

Закрыть курс

window.parent.courseController.course.close();

Установить язык курса

window.parent.courseController.course.language({code});
ПолеТипОбязательноОписание
codestringДаКод языка (Ключ языка в конфиге курса в объекте translations.languages)

Боковые модальные окна

Событие "Страница бокового модального окна загружена"

window.parent.courseController.modal.ready({id});

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

ПолеТипОбязательноОписание
idstringДаid модальной страницы, которая будет открыта. Страница должна находиться в конфиге.

Открыть боковое модальное окно

window.parent.courseController.modal.open({id, index, isResizable, width, backgroundColor});
ПолеТипОбязательноЗначение по умолчаниюОписание
idstringДаid модальной страницы, которая будет открыта
indexnumberНет100Порядковый индекс. Отсчет индекса идет справа налево. Если индекс больше количества открытых страниц - новая страница открывается в конце. Если индекс равен индексу одной из открытых страниц - страница по этому индексу будет заменена на новую.
isResizablebooleanНетtrueМожет ли пользователь менять ширину страницы перетаскиванием за бок
widthstringНет50%Ширина открываемой страницы. Может быть в % или в px
backgroundColorstringНет#ffffffЗаливка контейнера модалки

Настройки модальных окон

window.parent.courseController.modal.params({maxWidth, blockMainContent, hideOnBlockClick, blur, backgroundColor});
ПолеТипОбязательноЗначение по умолчаниюОписание
maxWidthnumberНет90Число от 1 до 100, максимальная ширина контейнера со всеми модалками в процентах от ширины страницы
blockMainContentbooleanНетfalseЗаблокировать ли основной контент курса, если модалки открыты
hideOnBlockClickbooleanНетfalseЗакрывать ли модалки по нажатию на блокировщик основного контента
blurnumberНет0Число от 0 от 10. Размытие блокировщика основного контента
backgroundColorstringНет#00000032Заливка блокировщика основного контента

Закрыть боковое модальное окно

window.parent.courseController.modal.close({id});
ПолеТипОбязательноОписание
idstringДаid модальной страницы, которая будет закрыта.

Закрыть все боковые модальные окна

window.parent.courseController.modal.closeAll();

Сохранить прогресс модалки

window.parent.courseController.modal.progress.set({id, percent});
ПолеТипОбязательноОписание
idstringДаid модалки
percentnumberДаЧисло от 0 до 100

Сохранение происходит если новое значение прогресса больше, чем уже сохраненное.

Получить прогресс модалки

window.parent.courseController.modal.progress.get({id});
ПолеТипОбязательноОписание
idstringДаid страницы

Возвращаемое значение

Число от 0 до 100

jsPanel

Для работы: window.courseConfig.modules.jsPanel.enable: true

Открыть окно jsPanel

window.parent.courseController.jsPanel.open({src, title, id, width, height});
ПолеТипОбязательноЗначение по умолчаниюОписание
srcstringДа, если не установлено idsrc страницы для открытия
idstringДа, если не установлено srcid jsPanel для открытия
titlestringДаЗаголовок страницы
widthstringНет450pxШирина
heightstringНет300pxВысота

Аудио

Отправка api команды

window.parent.courseController.audio.api(command, parameter);

Вызов предоставляет доступ к инстансу аудиоплеера, а также включает показ плеера в dom при передаче любой команды, кроме destroy.
Информация по api: https://playerjs.com/docs/ru=apicommands
Команда destroy также скроет плеер в dom.

xApi

Публичного метода courseController.sendAnswered(...) нет. Логика sendAnswered живёт во внутреннем xapiService и на window.courseController не экспонирована.