Creacion Bloques Inigo Bustos

12

Click here to load reader

description

MoodleMoot Euskadi 2009 - http://mooteuskadi09.deusto.es/

Transcript of Creacion Bloques Inigo Bustos

Page 1: Creacion Bloques Inigo Bustos

Creación de

bloques en Moodle Iñigo Bustos Mardones

Page 2: Creacion Bloques Inigo Bustos

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 ; } } ?>

Page 3: Creacion Bloques Inigo Bustos

• $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.

Page 4: Creacion Bloques Inigo Bustos

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 ) ) ); ?>

Page 5: Creacion Bloques Inigo Bustos

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 .= "¡Hola señor profesor!" ; } else { $this->content->text .= "¡Buenos dias queridos alumnos!" ; } ?> 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

Page 6: Creacion Bloques Inigo Bustos

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 .= "¡Hola señor profesor!" ; } else { $this->content->text .= "¡Buenos dias queridos alumnos!" ; } return $this->content; } } ?>

Page 7: Creacion Bloques Inigo Bustos

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_utf8\block_nuevo_bloque.php y en \es_utf8\block_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' ); ?>

Page 8: Creacion Bloques Inigo Bustos

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á:

Page 9: Creacion Bloques Inigo Bustos

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 = "SELECT * FROM {$CFG->prefix}users" ; $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

Page 10: Creacion Bloques Inigo Bustos

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.

Page 11: Creacion Bloques Inigo Bustos

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 lib\ddlib.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 "Actualizando la Base de Datos";

$table = new XMLDBTable( 'nuevo_bloque' ); $result = $result && rename_table($table, 'block_nuevo_bloque' );

} return $result; } ?>

Page 12: Creacion Bloques Inigo Bustos

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.