theme_cdigital
Componente: theme_cdigital (tema, hijo de Boost) · Ruta: public/theme/cdigital/
Versión: 2026081404 (release 0.1.0, madurez ALPHA) · Requiere: Moodle ≥ 4.5 ⚠ (ver Manifiesto)
Impacto: Tema · Plugin asociado: local_pccntr8203403_dashboard
Tema que reimplementa la apariencia del Campus Virtual siguiendo el diseño de Figma y renderiza el Dashboard de aprendizaje. Extiende Boost: hereda su comportamiento y sobreescribe layouts, plantillas, renderers, SCSS y strings.
Estructura
| Carpeta / archivo | Contenido |
|---|---|
config.php | Registro del tema, layouts, sistema de íconos |
lib.php | Renderers (theme_cdigital_core_course_renderer, core_renderer) y helpers de frontpage |
settings.php | Ajustes de administración — ver Ajustes del tema |
layout/ | frontpage.php, mycourses.php, mydashboard.php (+ drawers de Boost) |
templates/ | Plantillas Mustache (core overrides + componentes propios) |
classes/output/core_renderer.php | Inyecta el banner, arma la modal "Ver mi avance" (7 cards), inyecta el Drawer IA, sobrescribe navbar() para la miga de pan, y full_header()/course_content_footer() para la tarjeta "héroe" y la navegación del marco de secciones en vista de una sola sección |
classes/cdigitalnavbar.php | Construye el rastro de la miga de pan por familia de página, extendiendo theme_boost\boostnavbar |
classes/output/core/course_renderer.php | Override de coursecat_coursebox() (y de course_category(), coursecat_category(), coursecat_category_content()) para la card de resultados de búsqueda y la exploración de cursos por categorías, extiende theme_cdigital_core_course_renderer (lib.php) |
scss/preset/cdigital.scss | Punto de entrada SCSS (incluye Boost) |
scss/mixins.scss | @mixin cdigital-chevron-toggle() — mecanismo de chevron compartido por courseindex.scss, coursesections.scss y activitypage.scss; se concatena primero |
scss/coursesections.scss | Marco de secciones del curso (acordeón de borde redondeado + cabecera sombreada) y, en vista de una sola sección, tarjeta "héroe" + navegación |
scss/activitypage.scss | Marco del contenido de página de actividad (tarjeta de descripción, navegación de actividad, acordeón de mod_assign, tarjeta de archivos de mod_folder) |
amd/src/ | Módulos JS (ver abajo) |
pix/ | Imágenes e íconos (branding, íconos de la modal, ilustraciones) |
lang/{en,es}/ | Cadenas de idioma |
Features que renderiza
Cada una tiene su ficha en el Catálogo:
| Feature | Plantilla / punto de render |
|---|---|
| Fila "Contenido del curso" + insignias | course_content_header.mustache + full_header() |
| Banner "Tu desempeno academico" | course_info_banner.mustache + full_header() |
| Modal "Ver mi avance" | course_progress_modal.mustache + core_renderer |
| Stats Row del Area personal | stats_row.mustache + mydashboard.php |
| Welcome Hero | welcome_hero.mustache |
| Card "Continua donde quedaste" | continue_card.mustache |
| Card de curso | core_course/coursecard.mustache + AMD |
| Card de curso en resultados de búsqueda | course_search_card.mustache + course_search_header.mustache + course_search_hero.mustache + classes/output/core/course_renderer.php |
| Exploración de cursos por categorías | coursecategory_card.mustache + coursecategory_subcat.mustache + coursecategory_courserow.mustache + course_search_hero.mustache (compartido) + classes/output/core/course_renderer.php |
| Sección "Mis Cursos" del Área personal | miscursos_section.mustache + mydashboard.php + AMD miscursos_tabs.js |
| Drawer IA | aitutor_drawer.mustache + standard_after_main_region_html() + AMD aitutor.js |
| Bloque "Cursos que necesitan atención" | Solo SCSS: .cdigital-atencion* y override del chrome de bloque en .cdigital-activitypanel (el markup lo aporta block_pccntr8203403_atencion) |
| Portada (frontpage) | frontpage.mustache + helpers de lib.php |
| Carrusel de banners de la portada | frontpage.mustache + theme_cdigital_get_banner_slides() + AMD banner_carousel.js |
| Miga de pan | classes/cdigitalnavbar.php + core_renderer::navbar() |
| Pestañas de secciones del curso (format_onetopic) | Solo SCSS: scss/coursetabs.scss (el markup lo aporta el plugin format_onetopic) |
| Marco de secciones del curso | scss/coursesections.scss (el markup del acordeón lo aporta core_courseformat, sin overrides de plantilla) + section_hero_row.mustache/section_navigation_row.mustache (plantillas propias, vista de una sola sección) |
| Marco del contenido de actividad | Solo SCSS: scss/activitypage.scss (el markup lo aportan core\output\activity_header, core_course\output\activity_navigation, formslib y mod_folder, sin overrides de plantilla) |
Módulos AMD
| Módulo | Función |
|---|---|
aitutor.js | Drawer IA: toggle open/close, envio de mensajes al proxy local_pccntr8203403_aitutor, render de respuestas, lectura de SCORM CMI |
banner_carousel.js | Carrusel de banners de la portada: rotación automática, flechas, puntos, pausa/reanudación y prefers-reduced-motion |
coursecard_favourite.js | Toggle de favorito en la card de curso (WS core core_course_set_favourite_courses) |
coursecard_teachers.js | Carga batcheada de nombres de docentes (WS ..._get_course_teachers) |
coursecategories.js | Sincroniza aria-expanded en las cards/filas de la exploración de cursos por categorías a partir de la clase collapsed que ya gestiona moodle-course-categoryexpander (sin listeners de clic propios) |
frontpage_header_scroll.js | Comportamiento del encabezado de la portada al hacer scroll |
miscursos_tabs.js | Filtro client-side por pestaña (Todos/En Curso/Completados) de la sección Mis Cursos |
mycourses_filters.js | Fila de filtros de /my/courses.php. No registra listeners propios: observa con MutationObserver los atributos data-grouping/data-display/data-sort que escribe view_nav.js de core |
repository.js | Wrappers de core/ajax para los WS anteriores |
Son nueve módulos y los nueve se entregan compilados en amd/build/.
Build: ver Build de assets.
Dependencias
- Consume las clases de datos del plugin local (
course_stats,student_stats,academic_alerts) desde su renderer y layouts, y su Web Serviceget_course_teachers. El otro Web Service del plugin,get_student_panel, no lo consume el tema: es para el servicio de IA externo. - Renderiza el Drawer IA e invoca la funcion
send_messagede local_pccntr8203403_aitutor via el modulo AMDaitutor.js. - Para secciones con equivalente nativo (Usuarios en linea, Insignias) usa bloques core
estilizados con CSS del tema (ADR-002). El
calendario es la excepción: además del SCSS lleva dos overrides de plantilla core
(
core_calendar/month_detailedymonth_navigation), copiados verbatim de la 501 y ampliados solo con clasescdigital-cal__*, para que el SCSS del tema no dependa de las clases presentacionales de core.
Acoplamiento con block_xp (Gamification Sidebar)
El tema sobrescribe el renderer y dos plantillas de block_xp para la Card 1 del Gamification
Sidebar: classes/output/block_xp_renderer.php, templates/block_xp/xp-widget.mustache y
templates/block_xp/progress-bar.mustache, más templates/blockxp_levelname.mustache
(ADR-004).
Son copias y extensiones que dependen del contrato interno del plugin: las variables de
contexto de sus plantillas y la firma de level_name. El acoplamiento es blando —el peor caso es
volver al aspecto por defecto, los datos de XP no corren riesgo— pero hay que vigilarlo.
| # | Riesgo | Mitigación |
|---|---|---|
| 1 | Un upgrade de block_xp renombra variables de contexto o cambia la firma de level_name | En cada actualización: diff de blocks/xp/templates/{xp-widget,progress-bar,level-badge}.mustache y de renderer.php::level_name contra las copias del tema |
| 2 | block_xp migra a un renderer con espacio de nombres | La factory dejaría de resolver la clase del tema en silencio: vuelve el aspecto por defecto sin ningún error |
| 3 | La caché de plantillas oculta el cambio | Purgar cachés y subir la versión del tema tras cualquier ajuste |
Parámetros de la instancia del bloque
Valores con los que se instala la Card 1 en la región lateral del curso, y que aplica el paso 3 del despliegue:
| Bloque | Región | Peso | Notas |
|---|---|---|---|
block_xp | side-pre | −2 | pagetypepattern='*', showinsubcontexts=1 |
block_pccntr8203403_logros | side-pre | −1 | — |
block_stash | side-pre | 0 | Sin cambios funcionales |
A nivel sitio: blocktitle = "Tu gema de experiencia", blockrankingsnapshot = 0,
blockdescription vacío. Si una instancia de curso trae una fila propia en mdl_block_xp_config,
esa fila pisa los valores por defecto y hay que alinearla.
Riesgos de actualización
- El tema sobreescribe plantillas core (
core_course/coursecard,core/header, etc.). Una actualización mayor de Moodle puede cambiar esas plantillas o el contexto que reciben; revisar los overrides tras cada upgrade de branch. - La miga de pan (
classes/cdigitalnavbar.php) sobrescribe un métodoprotecteddetheme_boost\boostnavbar(prepare_nodes_for_boost()), no una API pública. Checklist de upgrade en ADR-005. - La card de curso depende del flujo client-side de
block_myoverview(WS core +Templates.render); cambios en ese flujo afectan el override. Detalle en Card de curso. requiresdeclarado enversion.phpapunta a Moodle 4.5 (placeholder); alinear a 5.0/5.1.