Moodle

You are currently browsing articles tagged Moodle.

Este curso hemos usado la herramienta Forrest para generar los apuntes del título de experto en programación con tecnologías web. Forrest genera un sitio web que queríamos integrar de alguna manera en Moodle. No es tan sencillo como parece, puesto que debido al sistema de ficheros de Moodle, se puede enlazar una página html, pero cuando dentro de dicha página se encuentran enlaces relativos, el comportamiento no era el adecuado (en Moodle todo pasa por algún script PHP).

Entonces, lo que buscaba era alguna manera de hacer que un directorio de fuera de Moodle tuviera la autentificación que proporciona Moodle (esto sirve tanto para Forrest como para cualquier directorio que tengáis). La solución no es sencilla (para mí que no controlo mucho PHP ni Apache). Son varios pasos:

  • Imaginad que el directorio que se quiere proteger es /moodle/forrest (en el servidor puede que sea /var/www/html/moodle/forrest).
  • Hay que crear un fichero .htaccess en dicho directorio con el siguiente contenido:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*)\.html$ index.php?file=$1\.html [L]
RewriteRule ^(.*)\.pdf$ index.php?file=$1\.pdf [L]
RewriteRule ^$ index.php?file=index.html [L]

Estas reglas lo que hacen es decirle a Apache que cuando llegue un fichero con extensión .html o .pdf se la pase al fichero index.php.

  • Hay que crear otro fichero index.php con el siguiente contenido:
<?php
require_once('../config.php'); // cargamos el fichero de configuración de Moodle
require_login(80); // esto llama a una función del API de Moodle que comprueba si se 
                   // está autentificado para el curso con id 80

$file=$_GET['file']; // recuperamos la variable file
if (strcmp("html",end(explode(".",$file)))==0) { // Se comprueba si termina en html
    $pagina=file_get_contents($file); // Si es así, se lee y se devuelve
    echo $pagina;
}
else {  // Si es otra (pdf) hacemos que devuelva el fichero y lo descargue.
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$file\"");
    $size=filesize($file);
    header("Content-Length: ".$size);
    header("Content-Transfer-Encoding: binary");
    readfile($file);
}
?>

Y ya está. Ahora, si intentamos entrar en ese directorio, nos pedirá la autentificación de Moodle (caso de no estar autentificado). OJO: se puede usar la función require_login() sin argumento, pero si permitimos acceso de invitados a nuestro Moodle, podrán entrar en los recursos de ese directorio.

Es posible que el código no sea óptimo y que se pueda hacer de otra manera, ya digo que no soy un especialista en estas lides, pero como dicen nuestros alumnos: funciona!! 🙂

Tags:

Desde hace unos meses hemos dado el salto a Moodle 2.x. En el curso de experto que dirijo (http://www.proweb.ua.es) dejamos que los alumnos de ediciones anteriores puedan acceder a los siguientes cursos, para poder descargarse material, pero sin poder participar en foros, entregar tareas, etc. También se puede querer que un profesor pueda ver el curso, pero no queremos que, por ejemplo, pueda evaluar. Esto lo solucionábamos con los roles ocultos en la asignación, pero en Moodle 2.x ha desaparecido esa opción. En Moodle 2.x hay una clara diferencia entre enrolment (matriculación, son participantes en el curso) y la asignación de roles (un usuario puede hacer determinadas cosas en un curso, pero no participa).

Me empeñé en intentar hacerlo con una nueva característica, las cohortes, pero no era el camino. Por fin he podido solucionarlo. Detallo el proceso.

Hay que crear un nuevo rol, por ejemplo, ex-alumno. Para ello, vamos a Administración del sitio->Usuarios->Permisos->Definir roles. Podemos crear un nuevo rol, pero lo mejor es duplicar uno ya existente. Yo creé un rol nuevo a partir del ya existente Estudiante. Una vez creado lo editamos y le cambiamos el valor de la propiedad moodle/course:view a permitir. Ya tenemos creado el rol que permitirá al ex-alumno ver los todos los cursos del sitio.

Ahora tenemos que añadir usuarios al nuevo rol. Vamos a Administración del sitio->Usuarios->Permisos->Asignar roles globales. Pinchamos sobre el rol que queramos editar y asignamos el rol a los usuarios que queramos.

Ya lo tenemos. Los alumnos asignados a este rol ya pueden acceder a todos los cursos y no aparecerán en la lista de participantes. Fácil, pero me ha costado :-).

Tags: ,

Esta semana decidí migrar algunos sistemas Moodle que uso habitualmente. El de moodle.rvg.ua.es que usamos para un curso de formación en la Universidad y el de www.proweb.ua.es/moodle del curso de Experto en Programación Web 2.0. Este proceso de migración es un poco delicado, por cosas que poco tienen que ver con Moodle. Voy a poner lo que más trabajo me ha dado, que también puede servir para otros problemas, no sólo Moodle.

En una base de datos (por ejemplo, MySQL, se usan los juegos de caracteres (Character set) para las tablas y los campos cuyo tipo sea carácter. No elegir un buen juego de caracteres puede llevar a que (lo más habitual) no se vean bien los acentos en castellano. Pero también hay que tener cuidado con los collations (cotejamientos). Estos collations son un juego de reglas para comparar caracteres de un juego de caracteres (perdón por la redundancia). El hecho es que dan bastantes quebraderos de cabeza y alguna vez puede ser útil cambiarlos. Voy a explicar aquí una manera sencilla de hacerlo, ya que no me quedó más remedio al actualizar la versión de Moodle.

Resulta que Moodle, a partir de su versión 2.0 (yo instalé la 2.1+) usa, para todas sus tablas y columnas con texto, el collation utf8_unicode_ci y las tablas antiguas tenían utf8_general_ci y son incompatibles!!. Nada más empezar a instalar me salió un mensaje de error donde me lo decía. Moodle tiene muchísimas tablas y no me planteé hacer el cambio una a una. En este artículo encontraréis el código PHP necesario para cambiar todas las tablas de una sola vez :-).

Yo era feliz, qué bueno, en dos minutos todo cambiado. JA! No sé bien porqué algunas columnas quedaron todavía con el utf8_general_ci y me empezó a dar problemas cuando intentaba actualizar, ya que mezclaba collations. No me quedó más remedio (ya no quise buscar más, eran dos tablas) que instalar PhpMyAdmin y cambiar a mano las tablas que me daban problema. El error que me daba era algo como esta salida que pongo más abajo. Simplemente hay que comprobar si alguna de las tablas implicadas tiene alguna columna en formato utf8_general_ci y cambiarlo por utf8_unicode_ci.

Error reading from databaseMore information about this error
Debug info: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
SELECT po.id AS oldpage_id, po.pagename AS oldpage_pagename, po.version, po.flags,
 po.content, po.author, po.userid AS oldpage_userid,  po.created, po.lastmodified, po.refs, po.meta, po.hits, po.wiki,
 p.id AS newpage_id, p.subwikiid, p.title,  p.cachedcontent, p.timecreated, p.timemodified AS newpage_timemodified,
 p.timerendered, p.userid AS newpage_userid,  p.pageviews, p.readonly, e.id AS entry_id, e.wikiid, e.course AS  entrycourse,
 e.groupid, e.userid AS entry_userid, e.pagename AS entry_pagename, e.timemodified AS entry_timemodified,
 w.id AS wiki_id, w.course AS wiki_course, w.name, w.summary AS summary, w.pagename AS wiki_pagename, w.wtype,
 w.ewikiprinttitle, w.htmlmode, w.ewikiacceptbinary,  w.disablecamelcase, w.setpageflags, w.strippages, w.removepages,
 w.revertchanges, w.initialcontent, w.timemodified AS wiki_timemodified,
 cm.id AS cmid
 FROM mdl_wiki_pages_old po
 LEFT OUTER JOIN mdl_wiki_entries_old e ON e.id = po.wiki
 LEFT OUTER JOIN mdl_wiki w ON w.id = e.wikiid
 LEFT OUTER JOIN mdl_wiki_subwikis s ON e.groupid = s.groupid AND e.wikiid = s.wikiid AND e.userid = s.userid
 LEFT OUTER JOIN mdl_wiki_pages p ON po.pagename = p.title AND p.subwikiid = s.id
 JOIN mdl_modules m ON m.name = 'wiki'
 JOIN mdl_course_modules cm ON (cm.module = m.id AND cm.instance = w.id)
[array (
)]

Tags: ,