2. Creación de Bloques en Moodle.
¿Qué es un bloque en Moodle?
El entorno de Moodle, puede variar en función de las necesidades de alumnos y
profesores. Para ello, Moodle ofrece una serie de bloques para realizar varias tareas y
presentar diferentes tipos de información. Existen varios tipos de bloques con
funcionalidades muy diversas, algunos trabajan de forma independiente, mientras que
otros colaboran entre sí.
Se pueden personalizar los cursos con el uso de diferentes bloques. Aparecerán a
izquierda y derecha de la pantalla, reservando la parte central para mostrar los
contenidos. Los bloques nos dan facilidades y funcionalidades que no podríamos
conseguir de otra manera.
Puede que los bloques que ya están implementados, no tengan las
funcionalidades que nosotros necesitamos. Por eso, y gracias a esta introducción,
vamos a aclarar los conceptos básicos a la hora de crear nuestro propio bloque para
Moodle.
Primeros pasos
Para empezar, tendremos que crear la carpeta de nuestro bloque (nuevo_bloque)
dentro de la carpeta blocks en el directorio donde tengamos instalado Moodle. A
continuación crearemos un archivo .php dentro de la carpeta con el prefijo block_ y el
nombre de nuestro bloque (el mismo que el de la carpeta).
El código básico para crear cualquier bloque es el siguiente:
<?php
class block_nuevo_bloque extends block_base {
function init() {
$this->title = 'nuevo bloque';
$this->version = 2009010100;
}
}
?>
3. • $this->title = 'nuevo bloque';
Este será el título que se mostrará en la cabecera de nuestro bloque. Convendría
que fuera algo descriptivo y que dé una idea a los usuarios de lo que el bloque
ofrece.
• $this->version = 2009010100;
Esto hará referencia a la versión de nuestro bloque, que podrá ser utilizado luego
por un script para actualizar la base de datos, si fuera necesario, en el caso de que
hubiera habido actualizaciones o cambios.
Una vez tenemos la estructura inicial del bloque, solo queda añadir un método más
para poder mostrar algo en nuestro bloque:
<?php
class block_nuevo_bloque extends block_base {
function init() {
$this->title ='nuevo bloque';
$this->version = 2009010100;
}
function get_content(){
$this->content->text .= 'Cuerpo del bloque';
return $this->content;
}
}
?>
Ya tenemos un bloque que muestra el mensaje Cuerpo del bloque. Ahora nos
autenticaremos como administradores en nuestra plataforma Moodle e iremos a
Notificaciones en el panel de administración para instalar nuestro nuevo bloque. Una
vez instalado el nuevo bloque, iremos a cualquier curso que tengamos, y activando la
edición añadiremos nuevo_bloque.
4. Quedará mostrado así en nuestro curso:
Profundizando un poco más
Ahora que ya sabemos lo más básico pasaremos a añadir nuevas funcionalidades a
nuestro bloque.
Un bloque será visualizado tanto por alumnos, como por profesores y administradores.
Puede que eso no siempre nos interese y solo queramos que cierto grupo de personas
accedan a determinada información, o que el bloque muestre cosas diferentes según
quien lo esté visualizando. Dentro de Moodle cada persona tiene un rol diferente, por
lo que nosotros daremos privilegios dependiendo del rol del usuario conectado en ese
momento. A este sistema de dar permisos según roles se le llama capabilities.
Empezaremos creando una carpeta que llamaremos db dentro de nuevo_bloque. A
continuación dentro de esa carpeta crearemos un archivo .php llamado access.
Dentro del archivo access.php añadiremos el siguiente fragmento de código:
<?php
$block_nuevo_bloque_capabilities = array(
'block/nuevo_bloque:teacher_access' => array(
'captype' => 'write',
'contextlevel' => CONTEXT_MODULE,
'legacy' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'coursecreator' => CAP_ALLOW,
'admin' => CAP_ALLOW
)
),
'block/nuevo_bloque:student_access' => array(
'captype' => 'write',
'contextlevel' => CONTEXT_MODULE,
'legacy' => array(
'student' => CAP_ALLOW
)
)
);
?>
5. En este parte del código hemos creado dos tipos de permisos. Para los profesores y
para los estudiantes. Ahora pasaremos a añadir la nueva funcionalidad a nuestro
bloque dependiendo del usuario que lo esté visualizando.
Antes el bloque solo imprimía Cuerpo del bloque. Ahora va a saludar dependiendo de
su rol a la persona que esté conectada. Añadiremos el siguiente fragmento de código
para manejar las capabilities:
<?php
if(has_capability('block/nuevo_bloque:teacher_access',
$context, $USER->id, false)){
$this->content->text .= quot;¡Hola señor profesor!quot;;
}
else{
$this->content->text .= quot;¡Buenos dias queridos
alumnos!quot;;
}
?>
Detalle de la función has_capability() :
• bool has_capability (string $capability, [object $context = NULL], [integer
$userid = NULL], [bool $doanything = true])
o string $capability: - nombre de la capability
o object $context: - un objeto context
o integer $userid: - un id de usuario
o bool $doanything: - if false, ignore do anything
Tendremos que añadir tambien un par de líneas más para que todo funcione dentro
del método get_content() :
<?php
global $USER, $COURSE;
$context = get_context_instance(CONTEXT_COURSE,
$COURSE->id);
?>
Detalle función get_context() :
• void get_context_instance ([$level $contextlevel = NULL], [$instance
$instance = 0])
o $level $contextlevel
o $instance $instance
6. Nuestro bloque ahora nos saludará de esta manera, dependiendo del usuario.
Bloque del profesor:
Bloque del alumno:
Ahora que ya manejamos las capabilities podemos mostrar cierta información a los
usuarios que queramos y de esa manera dotar de mucha funcionalidad a nuestros
bloques.
El código completo del bloque hasta ahora quedará así:
<?php
class block_nuevo_bloque extends block_base {
function init() {
$this->title ='nuevo bloque';
$this->version = 2009010100;
}
function get_content(){
global $USER, $COURSE;
$context = get_context_instance(CONTEXT_COURSE,
$COURSE->id);
if(has_capability('block/nuevo_bloque:teacher_access',
$context, $USER->id, false)) {
$this->content->text .= quot;¡Hola señor profesor!quot;;
}
else{
$this->content->text .= quot;¡Buenos dias queridos
alumnos!quot;;
}
return $this->content;
}
}
?>
7. Multilingüismo al poder
Tenemos nuestro bloque, pero solo está en un idioma y por lo tanto no lo podemos
compartir con la comunidad. Vamos a traducir nuestro bloque y lo vamos a ofrecer en
inglés y castellano.
Empezaremos creando tantos archivos block_nuevo_bloque.php como idiomas a los
que queramos traducir nuestro bloque. Cada archivo luego irá colocado dentro de la
carpeta correspondiente a su idioma. En nuestro caso irán en
en_utf8block_nuevo_bloque.php y en es_utf8block_nuevo_bloque.php , que son los
paquetes correspondientes a inglés y castellano dentro de la carpeta lang.
Todos los archivos van a ser iguales en cuanto a formato. Aquí tenemos nuestros
bloques traducidos:
Castellano:
<?php
$string['titulo'] = 'Nuevo Bloque';
$string['saludo_profesor'] = '¡Hola señor profesor!';
$string['saludo_alumno'] = 'Hola queridos alumnos';
?>
Inglés:
<?php
$string['titulo'] = 'New block';
$string['saludo_profesor'] = 'Hello Mr. Teacher!';
$string['saludo_alumno'] = 'Hi dear students!';
?>
Ahora que ya tenemos los archivos block_nuevo_bloque.php con todo el contenido del
bloque traducido tenemos que cambiar algunas cosas en el código del bloque para que
se pueda visualizar el contenido en los idiomas deseados.
Utilizaremos la función get_string() y le pasaremos dos parámetros. El primero el texto
a visualizar y el segundo el nombre del archivo con las traducciones.
Ejemplo:
<?php
$this->title = get_string('titulo','block_nuevo_bloque');
?>
8. El código completo del bloque hasta ahora quedará así:
<?php
class block_nuevo_bloque extends block_base {
function init() {
$this->title =
get_string('titulo','block_nuevo_bloque');
$this->version = 2009010100;
}
function get_content(){
global $USER, $COURSE;
$context = get_context_instance(CONTEXT_COURSE,
$COURSE->id);
if(has_capability('block/nuevo_bloque:teacher_access',
$context, $USER->id, false)) {
$this->content->text .=
get_string('saludo_profesor','block_nuevo_bloque');
}
else{
$this->content->text .=
get_string('saludo_alumno','block_nuevo_bloque');
}
return $this->content;
}
}
?>
Si seleccionamos como idioma de la plataforma el inglés se mostrará:
9. Bases de Datos
Cuando estemos trabajando en Moodle necesitaremos acceder a la Base de Datos con
frecuencia. PHP tiene sus propias funciones para ejecutar consultas a Bases de Datos,
pero como estamos en Moodle, utilizaremos sus propias funciones.
Todas las funciones que Moodle utiliza para trabajar con la BD están en la librería
dmllib.php de la carpeta lib. Ésta es la lista de Bases de Datos que actualmente están
probadas y funcionan para Moodle: mysql, postresql, mssql, oracle.
Probaremos una sencilla función de dmllib.php . Hemos elegido la función
get_records_sql() :
• get_records_sql($sql, $limitfrom=, $limitnum=)
Devuelve un array de objetos con el resultado.
Ejemplo de utilización:
<?php
$request = quot;SELECT * FROM {$CFG->prefix}usersquot;;
$requested_info = get_records_sql($request);
?>
Para que estas líneas funcionen tenemos que añadir otra línea más, dentro del método
get_content() :
<?php
global $CFG;
?>
Ya tenemos en $requested_info toda la información sobre usuarios que tenemos en la
base de datos como un array de objetos.
Para más información sobre las funciones de la librería dmllib.php:
Versión de Moodle anterior a la 2.0.*
• http://docs.moodle.org/en/Development:DML_functions_-_pre_2.0
Versión de Moodle 2.0.* o posterior
• http://docs.moodle.org/en/DML_functions
10. Añadiendo nuestras tablas
Si lo que buscamos es crear una tabla nueva en la base de datos para nuestro nuevo
bloque, lo mas recomendable es utilizar el XMLDB editor que trae integrado Moodle.
En el panel de administración principal pincharemos en Miscellaneous/XMLDB editor
para acceder a la herramienta. El XMLD editor nos creará un instal.xml en la carpeta db
que cargará las tablas que nosotros le indiquemos al instalar el bloque en Moodle.
Buscaremos nuestro bloque en la lista (blocks/nuevo_bloque/db) y a continuación
pulsaremos sobre [Create] . Se recargará la página y tendremos la opción [Load]
disponible que también pulsaremos. Llegados a este punto tendremos ya creado el
instal.xml en nuestra carpeta db y la opción [Edit] disponible. El instal.xml que
tenemos en este momento tendrá cargada una tabla de prueba que podremos editar
si pulsamos [edit].
Ahora podremos editar la tabla nuevo_bloque que nos ha creado o añadir tablas
nuevas. La herramienta es sencilla. Vamos añadiendo nuevos campos y determinando
sus características. Cuando terminemos pulsaremos Change.
Cuando ya tengamos nuestro instal.xml creado con esta herramienta volveremos a [Back
to Main] y pulsaremos [Save] para guardar los cambios realizados. Ahora solo falta
quitar el bloque desde el Panel de Administración y volver a instalarlo para que nos
creé nuestras tablas.
11. Modificación / Actualización de tablas
Ya sabemos crear nuestras propias tablas con el XMLDB editor, pero puede que en
algún momento tengamos que actualizar esas tablas y no podemos desinstalar el
bloque porque se perderia la información de las tablas que ya tenemos creadas. La
solución es crear un script que nos actualice las tablas necesarias cuando nuestra
versión del bloque sea mayor.
Empezaremos creando un archivo upgrade.php en la carpeta db con esta estructura:
<?php
function xmldb_block_nuevo_bloque_upgrade($oldversion=0) {
global $CFG, $THEME, $db;
$result = true;
if ($result && $oldversion < YYYYMMDD00) {
//Codigo a añadir para actualizar la BD.
}
return $result;
}
?>
Dentro de la estructura if iremos añadiendo funciones para actualizar la BD. Esas
funciones deben ser genéricas para trabajar con las BD, asi que utilizaremos las de
Moodle. Todas esas funciones se encuentran en libddlib.php.
Este ejemplo actualiza el nombre de la tabla anteriormente creada con install.xml:
<?php
function xmldb_block_nuevo_bloque_upgrade($oldversion=0) {
global $CFG, $THEME, $db;
$result = true;
if ($result && $oldversion < YYYYMMDD00) {
//Código a añadir para actualizar la BD.
echo quot;Actualizando la Base de Datosquot;;
$table = new XMLDBTable('nuevo_bloque');
$result = $result && rename_table($table,
'block_nuevo_bloque');
}
return $result;
}
?>
12. Para más información sobre las funciones de la librería ddlib.php:
Versión de Moodle anterior a la 2.0.*
• http://docs.moodle.org/en/Development:DDL_functions_-_pre_2.0
Versión de Moodle 2.0.* o posterior
• http://docs.moodle.org/en/Development:DDL_functions
Solo falta cambiar YYYYMMDD00 y ponerle la ultima versión. Pondremos, por
ejemplo 2009050400, que además tendra que coincidir con la nueva vesión del código
del bloque. Por lo tanto, también actualizaremos la linea correspondiente a la versión
en block_nuevo_bloque.php:
<?php
$this->version = 2009050400;
?>
Ahora, si vamos al Panel de Administración y pinchamos en Notifications se actualizará
nuestra tabla de la Base de Datos sin perder la posible información que tuviéramos ya
guardada.