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

CourseControllerData.js

Данный класс создан для более удобной работы с данными курса в elearning виджетах.

Причины добавления

  1. Разделение данных по страницам - Данные курса общие для всех страниц курса. То есть если один и тот же квиз будет вставлен на две страницы курса, то у него будет общий прогресс, если не добавить разделение сохранения данных по страницам. CourseControllerData как раз добавляет разбиение сохраненных данных по страницам
  2. Обновление переменных-объектов в курсе - С помощью api курса есть возможность только целиком определить значение переменной, что не подходит для сохранение данных отдельного виджета для отдельной страницы, так как прогресс всех frameset виджетов хранится в frameset переменной, а quiz виджеты в quiz переменной. Данный класс решает эту проблему, изменяя только состояние одного виджета в общем объекте с данными

Структура данных

Данные курса хранятся в виде JSON объекта. В поле variables хранятся кастомные данные курса, в них входят frameset и quiz данные с разделением по страницам.

{
"variables": {
"frameset": {
"5815": {
"7c3c7f5": {...},
},
"5830": {
"c37cdd1": {...},
}
},
"quiz": {
"5815": {
"d0c43d9": {...},
"b7amf8f": {...}
},
"5830": {
"cbd13c7": {...},
}
}
}
}

API

Примеры созданы для структуры данных выше

constructor(dataId, pageId= null)

Для создания контроллера требуется передать два параметра:

  1. dataId - имя переменной, в которой будут храниться данные. Сейчас используются frameset для всех frameset виджетов и quiz для всех виджетов-банков вопросов
  2. pageId - id страницы для которой будет сохраняться состояние. Если не передан Id страницы, то он берется из конфига Elementor'а
new CourseControllerData('quiz', '5815') // Создание контроллера для управления данными квизов на странице 5815

getData(id)

По id данных получает состояние. Так как CourseControllerData используется для сохранения данных виджетов, то id данных - это id виджета

const dataController = new CourseControllerData('quiz', '5815');
const data = data->getData('cbd13c7') // Получение данных квиза с id cbd13c7 на странице 5815

setData(id, value)

По id сохраняет актуальное состояние. Так как CourseControllerData используется для сохранения данных виджетов, то id данных - это id виджета, а value - это данные из WidgetBase::getDataForSaving

const dataController = new CourseControllerData('quiz', '5815');
const data = data->setData('cbd13c7', {...}) // Обновление данных квиза с id cbd13c7 на странице 5815

Применение

CourseControllerData используется как часть класса WidgetBase для сохранения и получения данных виджета. В каждом elearning виджете есть свойство framesData, которое инициализируется в конструкторе виджета.

Данные в конструктор CourseControllerData передаются на основе данных виджета:

  • dataId - У частей виджета типа WidgetType есть статическое свойство courseControllerDataName, которое равно frameset для FrameSet и quiz для QuestionBank. Это свойство и передается на место dataId
  • pageId - У каждого виджета в настройках указан id текущей страницы, который и передается в конструктор

Получение данных происходит в методе WidgetBase::getData(widgetId = null, dataContainer = null) - метод по умолчанию получает данные текущего виджета и основывается на методе CourseControllerData::get. Опционально можно перед