Creacion Bloques Inigo Bustos

2,504 views

Published on

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

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,504
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
110
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Creacion Bloques Inigo Bustos

  1. 1. Creación de bloques en Moodle Iñigo Bustos Mardones
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.

×