ADR-004: Sidebar de gamificación vía overrides de theme + mini-bloque (Alcance 1)
Estado: Aceptado | Fecha: 2026-07-14 | Autores: Equipo Campus Virtual
Contexto
El Alcance 1 (Gamificación) era deliberadamente no-code: block_xp Community + badges nativas + block_stash, solo configuración. El diseño Figma del Gamification Sidebar (node 19829-3930) rediseña el drawer del curso con 3 tarjetas: la gema de experiencia (datos de block_xp), la colección de logros del curso (badges ganadas/bloqueadas) y un CTA de insignias. Ese nivel de presentación no es alcanzable solo con configuración, y las reglas del proyecto prohíben tocar core o el código de plugins de comunidad.
Opciones consideradas
Opción 1: Fork de block_xp
- Ventajas: control total sobre plantillas y renderer.
- Desventajas: rompe la vía de actualización del plugin (v19 → v20 exigiría re-aplicar el fork); pasa a ser código propio con la superficie completa del plugin; contradice la preferencia por community plugins sin modificar.
Opción 2: block_badges core para la colección de logros
- Ventajas: cero código nuevo.
- Desventajas: solo lista insignias ganadas vía
core_badges_renderer::print_badges_list(renderer compartido con perfil y mybadges); no muestra bloqueadas, contador ni CTA; restylearlo afectaría otras páginas.
Opción 3 (elegida): overrides de theme para block_xp + mini-bloque nuevo
- Card 1:
theme_cdigitalya usatheme_overridden_renderer_factory; el renderer legacy de block_xp (block_xp_renderer, no namespaced) se extiende con la clase autoloadedtheme_cdigital\output\block_xp_renderer(override delevel_name(), delegando al padre cuando$force=true), más copias adaptadas deblock_xp/xp-widget.mustacheyblock_xp/progress-bar.mustacheen el theme. - Cards 2+3: bloque nuevo
block_pccntr8203403_logros(solo lectura sobrebadgeslib.php:badges_get_badgescon$perpage=0+badges_get_user_badges), sin settings, sin AMD, sin styles propios. - Estilos:
theme/cdigital/scss/gamification.scssconcatenado entheme_cdigital_get_main_scss_content(); Lexend auto-hospedada.
Decisión
Opción 3. El motor de gamificación sigue siendo configuración (block_xp + badges nativas); el código nuevo se limita a la capa de presentación en el theme y a un bloque de solo lectura, ambos actualizables de forma independiente de block_xp.
Consecuencias
- Acoplamiento blando al contrato interno de block_xp: las plantillas copiadas consumen las variables que exporta
xp_widget::export_for_template()y el override depende de la firma delevel_name(). Si v20 las cambia, la tarjeta degrada al aspecto por defecto (sin pérdida de datos ni errores fatales). - Checklist de upgrade de block_xp (ejecutar en cada actualización del plugin):
- Diff de
blocks/xp/templates/xp-widget.mustacheyprogress-bar.mustachecontra las copias entheme/cdigital/templates/block_xp/. - Verificar la firma de
block_xp_renderer::level_name()y que el renderer siga siendo legacy (no namespaced); si migra a namespaced, adaptar la clase del theme. - Verificar que
xp()siga envolviendo los puntos en.block_xp-xp .pts/.sign(el SCSS los recolorea). - Purga de cachés + smoke test visual en el curso piloto.
- Diff de
- El bloque de logros solo depende de APIs públicas estables de badges (
badgeslib.php), sin riesgo equivalente.