Arquitectura de Plugins
Ubicación de los Plugins
Los plugins se almacenan en public/plugin/. Cada plugin tiene su propio directorio:
public/plugin/
├── Bbb/ # Integración con BigBlueButton
├── Zoom/ # Integración con Zoom
├── Onlyoffice/ # Edición de documentos con OnlyOffice
├── XApi/ # xAPI/Tin Can
├── ... # los plugins incluidos se encuentran en public/plugin/Estructura de un Plugin
Un directorio típico de un plugin contiene:
public/plugin/MyPlugin/
├── plugin.php # REQUERIDO — asigna $plugin_info
├── install.php # Script de instalación
├── uninstall.php # Script de desinstalación
├── index.php # Punto de entrada para renderizado de regiones (si aplica)
├── admin.php # Interfaz de administración (opcional)
├── lang/ # Archivos de traducción (códigos de idioma: en_US.php, fr_FR.php, …)
├── src/
│ ├── MyPluginPlugin.php # Clase principal del plugin (extiende Plugin)
│ ├── Entity/ # Entidades de Doctrine (detectadas automáticamente)
│ ├── Repository/ # Repositorios de Doctrine
│ └── EventSubscriber/ # Suscriptores de eventos de Symfony (registrados automáticamente)
├── templates/ # Plantillas Twig
└── resources/ # Recursos CSS/JSClase del Plugin
Cada plugin extiende la clase base Plugin (public/main/inc/lib/plugin.class.php) y sigue el patrón singleton:
Propiedades Clave de la Clase
$isCoursePlugin
bool
Registra el plugin como una herramienta de curso
$isAdminPlugin
bool
Añade una página de interfaz de administración
$isMailPlugin
bool
Se integra con el sistema de correo
$addCourseTool
bool
Añade un ícono a la página principal del curso
$course_settings
array
Define campos de configuración por curso
Ciclo de Vida del Plugin
Instalación — El administrador activa el plugin, lo que ejecuta
install.phpConfiguración — Los ajustes se definen y gestionan a través del panel de administración; se almacenan en
access_url_rel_plugin(soporta multi-tenant)Ejecución — El plugin inyecta contenido en regiones de visualización o reacciona a eventos de la plataforma
Desactivación — El plugin se desactiva, pero sus datos se preservan
Desinstalación — Ejecuta
uninstall.phppara limpiar datos y tablas
Regiones de Visualización
Los plugins inyectan HTML en 18 regiones predefinidas del frontend de Vue al sobrescribir renderRegion():
Regiones disponibles: content_bottom, content_top, course_tool_plugin, footer_center, footer_left, footer_right, header_center, header_left, header_main, header_right, login_bottom, login_top, main_bottom, main_top, menu_administrator, menu_bottom, menu_top, pre_footer.
Integración con Symfony
Suscriptores de Eventos
Los archivos que terminan en EventSubscriber.php ubicados dentro de src/EventSubscriber/ se registran automáticamente mediante PluginEventSubscriberPass. Implementan EventSubscriberInterface y reaccionan a eventos definidos en src/CoreBundle/Event/Events.php.
Dado que la clase del plugin (MyPluginPlugin) no es un servicio de Symfony, no puede ser inyectada automáticamente en el constructor del suscriptor. En su lugar, usa el singleton create():
Entidades de Doctrine
Las entidades de Doctrine ubicadas en src/Entity/ son detectadas automáticamente por PluginEntityPass. Usa atributos de PHP 8 para el mapeo. El espacio de nombres debe seguir Chamilo\PluginBundle\{PluginName}. Usa prefijos únicos para los nombres de las tablas (por ejemplo, my_plugin_*) para evitar colisiones.
Servicio PluginHelper
Para acceder al estado de los complementos desde los servicios principales de Symfony, inyecta PluginHelper en lugar de instanciar directamente la clase del complemento:
Métodos disponibles:
isPluginEnabled(string $name): bool
Verifica si un complemento está instalado y activo para la URL de acceso actual
loadLegacyPlugin(string $name): ?object
Instancia y devuelve el singleton del complemento
getPluginSetting(string $name, string $key): mixed
Lee un valor de configuración específico de un complemento
getPluginOverrides(string $name): array
Obtiene las anulaciones de plugin.yaml (valores predeterminados + específicos de la URL de acceso) para un complemento
Referencias a Archivos Principales
public/main/inc/lib/plugin.class.php
Clase base de complementos
public/main/inc/lib/plugin.lib.php
Gestor de complementos
src/CoreBundle/Entity/Plugin.php
Entidad Doctrine de complementos
src/CoreBundle/Helpers/PluginHelper.php
Servicio PluginHelper
src/CoreBundle/Event/Events.php
Constantes de eventos
public/plugin/HelloWorld/
Ejemplo mínimo de complemento
public/plugin/TopLinks/
Ejemplo sencillo de complemento
Última actualización
¿Te fue útil?