Escribiendo módulos para Moodle: Introducción



Moodle es un ambiente educativo virtual (VLE) desarrollado inicialmente por Martin Dougiamas con la intención de ayudar a los educadores a crear cursos en línea pensando en todo momento en la colaboración del contenido y su evolución continua. Por supuesto, Moodle es Software Libre bajo el amparo de la GPL.

Es la plataforma educativa más extendida del mundo con más de cuarenta millones de usuarios y cuatro millones de cursos alrededor del globo. Está programada en legacy PHP (esto es que la práctica totalidad del core de Moodle no soporta clases) y por lo tanto no está orientado a objetos.

Realmente Moodle mezcla un poco de programación orientada a objetos con mucha programación estructurada. Tampoco utiliza ningún sistema de encapsulación de datos ni separa la vista de la lógica de la aplicación. Si pienso en implementar el patrón de diseño MVC en Moodle me entra la risa y una flojera interesante.

Arquitectura de Moodle

Moodle se basa en un núcleo (conocido como el Moodle core) del sistema rodeado de una gran cantidad de plugins que proveen de funcionalidad específica a la plataforma. Los plugins en Moodle pueden ser de varios tipos distintos, autenticación, bloques, matriculación, temas, actividades, etc.

Todos los módulos comparten funcionalidad específica entre si y el core. La distribución estándar de Moodle incluye el core del sistema y un número de módulos de todos los tipos que proveen de la funcionalidad base del sistema y con el cual se puede empezar a funcionar sin carencias ni problemas de ningún tipo.

La estructura de los módulos en Moodle es muy simple, un directorio con archivos PHP, JavaScript, XML y/o CSS y puntos de entrada definidos en varios archivos clave como locallib.php, db/install.xml o lib.php que permiten la comunicación con el core.

El Core

El core de Moodle proporciona todos los mecanismos necesarios para implementar la plataforma educativa. Implementa todos aquellos mecanismos que luego los plugins utilizan para desarrollar su función. Es por lo tanto el core la parte más importante del sistema Moodle y sus componentes principales son los siguientes.

Cursos y Actividades

Moodle define un curso como una secuencia de actividades agrupadas en secciones. Existen actividades de todo tipo y son muy flexibles. Los cursos se organizan en categorías jerárquicas dentro de la plataforma educativa.

Usuarios y Grupos

Cada curso puede tener un número indeterminado de alumnos y un número indeterminado de grupos que acoja a esos alumnos. Los alumnos tienen un perfil de usuario que pueden editar y opciones específicas por curso en el que están matriculados. Los cursos cuentan con históricos, roles, permisos, etc.

Matriculacion

En Moodle los tipos de matriculación disponibles en la plataforma se definen a través de módulos por lo que podemos definir nuevos tipos de matriculación con sus peculiaridades de forma bastante sencilla a través de módulos externos. Cada tipo de matriculación puede implementar sus propios mecanismos al margen del core.

Los módulos principales

Como ya he dicho anteriormente, Moodle viene con una serie de módulos principales o estándar que además le son necesarios para su correcto funcionamiento. A parte, al estar tan extendida, moodle cuenta con una base de datos de módulos ingente donde buscar algo a veces puede ser un poco exasperante.

Algunos de los más importantes tipos de módulos en Moodle son:

  • Actividades y Recursos: Componen los objetos individuales del curso. Existen actividades de todo tipo, colaborativas, foro, wiki, cuestionarios, etc. Es de largo el tipo de módulo más desarrollado y se instalan en el directorio mod dentro de la raíz de Moodle

  • Bloques: Los bloques son cajas con contenido añadido en columnas a los lados del contenido principal que ofrecen funcionalidades varias. Residen en el directorio blocks

  • Matriculación: Aunque este tipo de plugin no es muy común, voy a hablar mucho de él en esta serie puesto que la experiencia que tengo en el desarrollo de módulos de Moodle incluye uno de estos, Los plugins de matriculación residen en el directorio enrol

  • Temas: Los estilos se desarrollan dentro de módulos que residen (efectivamente, lo has adivinado) en el directorio theme


Existen muchos otros tipos de plugins pero su completa enumeración y definición excede de sobremanera el propósito de este artículo.

La base de datos

Moodle integra más de doscientas tablas en su base de datos incluyendo las necesarias por el core y las de los módulos principales. La estructura de las tablas de los módulos se definen en el archivo install.xml dentro del directorio db en el directorio principal de los módulos. La base de datos puede ser editada y revisada a través del menú de administración de la plataforma.

En Moodle no usamos un objeto para interactuar con la base de datos (aunque existe, es una de las pocas cosas que si cuenta con orientación a objetos en Moodle) sino con funciones al estilo de la programación estructurada que interactúan con un objeto ODBC.

Tampoco existe un ORM propiamente dicho pero si una capa de abstracción sobre la base de datos llamada XMLDB

Organización del código

Moodle sigue un enfoque de transaction script para organizar el código apoyado por elementos de un modelo de dominio puesto que al empezar a programar Moodle, lo orientación a objetos no estaba soportada en PHP, o al menos esa es la excusa oficial expuesta en la documentación para desarrolladores del proyecto.

El código del core y los módulos principales de Moodle se están regulando y refactorizando para soportar el paradigma orientado a objetos a una velocidad similar a las obras del escorial, pero la esperanza es lo último que se pierde.

Otra cosa que Moodle no soporta es hooks por lo que la funcionalidad del core solo puede ser extendida a través de parches modificando el mismo y convirtiendo nuestro desarrollo en algo complicado de mantener que impide la normal actualización de la plataforma.

Pongámonos en situación

Desde hace aproximadamente un año he estado desarrollando un módulo muy ambicioso que añade funcionalidad extra al core de Moodle sin modificar el código del mismo ni aplicar parches posibilitando la actualización completa de la plataforma. El módulo sigue una política de no intromisión en el core del sistema añadiendo funcionalidad extra, capas y entidades superiores.

En próximas entregas de esta nueva serie narraré los problemas a los que me he enfrentado a la hora de desarrollar dicho módulo y los éxitos cosechados.

Portada de Genbeta