LMS quiz storage
Сборка skin:
cd wp2lms-turbo-blocks-mos && npm run build(неwp2lms-turbo-pulse/ не корневойbuild:core).
Контракт
Section titled “Контракт”Pulse банк и проверочные вопросы пишут в те же ключи, что Elementor-виджеты wp2lms-pro:
| Store | widgetId | Когда |
|---|---|---|
quiz |
wp2Id банка |
init / ответ / finish / reset |
questions |
wp2Id вопроса |
submit любого типа вопроса |
Типы вопросов: choice, open, sort, match, classify.
Хранение через нативные globals wp2lms-pro:
getCourseControllerData(dataId, pageId)→getData/setDataaddQuizScore/updateQuizScorepageIdизwp2lmsProConfig.pageId(fallbackelearningConfig.pageId)
В курсе (isCourse()) данные уходят в parent.courseController.data; вне курса — в localStorage['quiz'|'questions'] в форме { [pageId]: { [widgetId]: state } }.
События: quiz:passed (finish), quiz:reset (retry / «Начать сначала»). Pulse-события question-bank:continue|close без изменений (consumers — pro / course UI).
Shape questions по типу
Section titled “Shape questions по типу”Общий каркас (Elementor-совместимый):
{ isQuestionCompleted: true, attemptsLeft: 0, attemptStatus: 0, nextButtonClicked: false, // true после клика «Далее» в банке answers: [], // choice: 1-based индексы; иначе [] points: 0 | 1, showCorrectAnswersButton: false,}Расширения (не ломают Elementor readers):
| Тип | Поля |
|---|---|
| open | answer, answerType (text | number) |
| sort | order: string[] (id элементов в ответе пользователя) |
| match | matchAnswers: { [promptId]: answerId } |
| classify | placement: { [itemId]: categoryId | null } |
Scene / page.progress банк не трогает (намеренно).
Percent
Section titled “Percent”scorePercent считается через Math.ceil (как Elementor / buildQuizState), и в UI банка, и в LMS store.
Resume UX
Section titled “Resume UX”| Состояние LMS | showStart |
После hydrate |
|---|---|---|
finished |
любой | экран results |
mid (receivedAnswersCounter > 0) |
on | start («В процессе», «Продолжить» + «Начать сначала»); continue без wipe, restart = wipe + новый порядок + сразу quiz |
| mid | off | сразу quiz |
| пусто | on/off | start или quiz по showStart |
Retry на results → wipe LMS + новая попытка. Start при уже finished no-op (restart только через Retry). На старте mid-quiz «Начать сначала» сбрасывает прогресс без подтверждения и открывает первый вопрос.
Стабильные ключи
Section titled “Стабильные ключи”Persist только для стабильных wp2Id (isStableLmsId). Ephemeral fallback q-{index} — только UI, в LMS не пишется.
Runtime-only (не в LMS store)
Section titled “Runtime-only (не в LMS store)”selectedOptionWp2Ids остаётся в Alpine resultPayload / событиях банка; в questions store не сериализуется (чтобы не ломать Elementor readers).
Ассеты Turbo static
Section titled “Ассеты Turbo static”Wp2lmsProFrontendAssets всегда подключает wp2lmsProConfig + pro functions.min.js на static (до skin Alpine). Tripetto переиспользует тот же resolver.
- Core headless:
wp2lms-turbo/assets/src/assessment/(lms-quiz.js, compare-*, registry) - Blocks adapters:
assets/src/frontend/question-bank.js— hydrate / score / events; слушаетchoice|open|sort|match|classify-question:answered|next question-choice.js/question-open.js/question-sort.js/question-match.js/question-classify.js— persist вопроса
Ассеты:
- Blocks
assets/build/turbo.js— подключается Core только приrequiresAlpineна странице - Core
wp2lms-turbo/assets/build/sortable.js— только если компоненты декларируютfrontendScripts: ["sortable"](Sort/Classify)
Open / sort / match / classify допускаются внутри банка (editor + transformer).
Новый тип вопроса + банк: AI_ASSESSMENT_BLOCKS.md.
Resolved-by-design (не долг)
Section titled “Resolved-by-design (не долг)”- Legacy prompt-блоки (
choice-question-prompt/open-question-prompt) — migrate shims,inserter: false. inQuestionBankFlag— GutenbergprovidesContextplumbing.bankQuestionNumber— только editor (List View / заголовок).
# unit (mock LMS)npm test --prefix wp2lms-turbo-pulse
# e2e (нужен предварительный build:core + build skin + browsers)npm run build:corenpm run build --prefix wp2lms-turbo-blocksnpx playwright install chromium --with-deps # один разnpm run test:e2e --prefix wp2lms-turbo-pulseE2E поднимает fixture tests/e2e/fixtures/quiz-lms.html (генератор копирует Core sortable.js + Blocks turbo.js) и проверяет:
- localStorage → reload hydrate → reset (retry)
- mid-quiz «Начать сначала» со стартового экрана
- persist расширений sort (
order) / match (matchAnswers) / classify (placement) nextButtonClickedпосле «Далее»