Envío de e-mail desde Moodle con la función email_to_user

Desde las tripas de Moodle podemos enviar un correo electrónico a cualquier usuario (Previa configuración de servidor de correo).

La función es la siguiente:

/lib/moodlelilb.php

param: stdClass $user A {@link $USER} object
param: stdClass $from A {@link $USER} object
param: string $subject plain text subject line of the email
param: string $messagetext plain text version of the message
param: string $messagehtml complete html version of the message (optional)
param: string $attachment a file on the filesystem, relative to $CFG->dataroot
param: string $attachname the name of the file (extension indicates MIME)
param: bool $usetrueaddress determines whether $from email address should
param: string $replyto Email address to reply to
param: string $replytoname Name of reply to recipient
param: int $wordwrapwidth custom word wrap width, default 79
return: bool Returns true if mail was sent OK and false if there was an error.

Viendo los parámetros será fácil saber que necesitamos, básicamente un usuario que envía y un usuario que recibe, un asunto, un texto plano, un html si el alumno permite este tipo de contenido, adjunto… Para obtener un objeto del tipo stdClass de un usuario concreto usamos:

$to_mail = $DB->get_record('user', array('id' => '1449'));
$from_mail = 'Soporte Moodle';
$mailresult = email_to_user($to_mail, $from_mail, $subject, $messagetext, $messagehtml);

Esto mandará un correo con el remitente definido por defecto en Moodle (noreply) al usuario 1449. En el caso de que queramos modificar el remitente tendremos que recurrir a una nueva variable de tipo stdClass, algo así:

$to_mail = $DB->get_record('user', array('id' => 1448));
$from_mail = $DB->get_record('user', array('id' => '1'));
$from_mail->firstname = 'Soporte';
$from_mail->lastname = '';
$mailresult = email_to_user($to_mail, $from_mail, $subject, $messagetext, $messagehtml,null,null,true);

Modificamos el firstname y el lastname ya que la función genera el nombre uniendo estos dos campos.

Etiquetado con: ,
Publicado en: e-learning, Moodle, Programación

Aumentar upload_max_filesize y post_max_size en nginx

Por motivos que no vienen al caso (Como casi siempre) me tengo que pelear a veces con algo diferente, acostumbrado al mas que trillado y no por ello mas conocido Apache, hace poco iniciamos un proyecto con un servidor web en auge, Nginx. Y muchos os preguntaréis, ¿Eso que es?, pues sin entrar en mucho detalle es el servidor web potente que se está usando desde hace tiempo en sitios con mucho, mucho, muchísimo tráfico… Seguro que algunos os habéis encontrado con un “404 Not Found / nginx” sobre todo en páginas porno, guarretes.

El caso es que subiendo archivos tuve que andar rebuscando la forma de cambiar la configuración por defecto para el tamaño de upload y de post de archivos. En primer lugar decir que la documentación de nginx brilla por su ausencia así que toca tirar de mucho blog y mucho foro. Lo primero localizar el php.ini. En mi caso la forma más facil fue usar un phpinfo(); en una php. Con esto sales por completo de dudas de la localización del php.ini y de los valores que tienes actualmente configurados.

Editamos el php.ini, en mi caso en “/usr/local/lib/php.ini”, buscamos los dos valores post_max_size y upload_max_filesize y los agrandamos al tamaño que necesitemos… En mi caso 200M.

Reiniciamos php y recargamos nginx.

/etc/init.d/php-fpm restart
/etc/init.d/nginx restart

Y listo.

Etiquetado con: , , ,
Publicado en: Linux, Programación

Bloque Configurable reports Moodle 2.6, pequeños hacks

Hoy os voy a hablar de un bloque o extensión para Moodle, a día de hoy probado en la 2.6, que me está salvando muchísimas horas de desarrollo en lo referente a facilitarle al cliente consultas sobre el estado de los alumnos en el proceso formativo de una forma algo más clara y completa a como lo presenta la misma plataforma.

El bloque configurable reports de Juan Leyva , permite configurar informes con consultas de relativa complejidad al LMS, incluso algunas de ellas ya vienen completamente preparadas en su repositorio. Añade mejoras importantes como son el uso de paginación, orden mediante Jquery, descarga en XLS, CSV y ODS… Si sabes a lo que me refiero comprenderás que antes de lanzarte a programar una nueva consulta desde cero con este bloque puedes cubrir casi con total seguridad tus necesidades sin tener que tirarte horas y horas programando. Para rematar la faena permite crear una consulta a partir de SQL, con lo que las posibilidades se tornan prácticamente infinitas.

Un cliente muy exigente (Que raro), nos pedía una consulta que hacía un uso bastante intensivo de la base de datos por la gran cantidad de alumnos y datos de seguimiento que necesitaba. Se nos presentaron tres problemas principales:

  1. Al poner un filtro de cursos, el filtro aparece ordenado por el ID de la tabla, cosa poco útil para un manejo realmente rápido.
  2. Al ser una consulta tan bestia descubrimos que el bloque hace una “comprobación” de que es una SQL válida cada vez que entrábamos en la pestaña de edición del SQL. Esto nos tiraba el sistema abajo. ¿Por qué? Pues porque la ejecuta sin filtro, por lo que hace una consulta de la totalidad de los cursos del LMS.
  3. Unido al problema anterior teníamos que el bloque al ir a “View report” ejecuta igualmente una primera consulta sin aplicar el filtro, con un molesto “All” que de nuevo nos lo tiraba todo abajo.

Como el tiempo apremiaba y no podíamos empezar de cero tuvimos que hacer una serie de cambios de urgencia para no tener problemas de sobrecarga.

Modificar el orden del filtro de cursos.

Tocamos “components/filters/courses/plugin.class.php”, “function print_filter”
Añadimos simplemente el parámetro de ordenación ‘fullname’

$courses = $remoteDB->get_records_select('course',"id $usql",$params,'fullname');

Evitar la ejecución “All” al entrar en “View report”

Tocamos “components/filters/courses/plugin.class.php”, “function execute”

function execute($finalelements, $data){
$filter_courses = optional_param('filter_courses',0,PARAM_INT);
 if ($filter_courses==0)
 $filter_courses=1;
 if(!$filter_courses)
 return $finalelements;

 if($this->report->type != 'sql'){
 return array($filter_courses);
 }
 else{
 if(preg_match("/%%FILTER_COURSES:([^%]+)%%/i",$finalelements,
 $output)){
 $replace = ' AND '.$output[1].' = '.$filter_courses;
 return str_replace('%%FILTER_COURSES:'.$output[1].'%%',$replace,$finalelements);
 }
 } return $finalelements; }

Hemos añadido las líneas 3 y 4 del código anterior, al poner $filter_courses a 1 evitamos la primera ejecución y por tanto no hacemos una consulta sin filtro.

Evitar la validación de seguridad de las custom SQL

¡Ojo!¡Atención!¡Pánico! Esto solo se debe hacer si sabes muy bien lo que estás tocando, ya que impides que el formulario de SQL te reporte cualquier tipo de error… Tocamos “Components/customsql/form.php” dos funciones “validate_high_security” y  ”validate_low_security”. Comentamos la siguiente instrucción else en las dos funciones.

/* Comentamos esto para evitar una primera evaluación del SQL con "ALL"

 $sql = $this->_customdata['reportclass']->prepare_sql($sql);
 $rs = $this->_customdata['reportclass']->execute_query($sql, 2);
 if (!$rs) {
   $errors['querysql'] = get_string('queryfailed', 'block_configurable_reports', $db->ErrorMsg());
 } else if (!empty($data['singlerow'])) {
 if (rs_EOF($rs)) {
   $errors['querysql'] = get_string('norowsreturned', 'block_configurable_reports');
 }
 }
if ($rs) {
 $rs->close();
 }
 */

Con esto evitamos que el bloque revise la SQL y nos ahorra una ejecución sin filtro.
En resumen, un bloque magnifico que permite gran versatilidad y dar soluciones muy rápidas a necesidades muy concretas. Con las pequeñas modificaciones que hemos realizado (Entiendo que facilmente entendibles y trasladables a cualquier otro filtro, se parchean dos pequeños problemas muy párticulares que surgieron para casos muy concretos. Espero que pueda ser de ayuda a alguien.

Etiquetado con: , , , ,
Publicado en: e-learning, Moodle, Programación

Combinar textos en openoffice Calc

Todo parece muy fácil hasta que tienes que ponerte a investigar como funcionan las malditas fórmulas y para aquellos que prefieren realizar una rápida búsqueda por internet antes que perder como yo unos minutos en estrujarse en cerebro y sacar el resultado esperado… Para vosotros os dejo este truquito que me ha servido en infinidad de ocasiones para unir primer y segundo apellido en una sola celda.

Si tenemos A1=GARCIA B1=LOPEZ insertamos una nueva columna en C y metemos la siguiente fórmula:

=CONCATENAR(A1;” “;B1)

Obtendremos en C1=GARCIA LOPEZ

Si lo que buscas es hacer lo contrario puedes mirar ¿Como dividir un texto en varias partes en Openoffice Calc?

 

Etiquetado con:
Publicado en: Programación

Dividir textos en fragmentos en openoffice Calc

Puede parecer una chorrada pero en más de una ocasión para manejar grandes cantidades de datos me ha salvado la vida uno de estos trucos.

Para dividir una cadena por ejemplo por un carácter separador ” ” (Espacio)

Si tenemos en A1 “Buenos días”

=IZQUIERDA(A1;ENCONTRAR(” “;A1)) te proporcionará “Buenos”
y
=DERECHA(A1;LARGO(A1)-ENCONTRAR(” “;A1)) te dará “días”

Etiquetado con:
Publicado en: Programación

El internet Marty…

Etiquetado con: , ,
Publicado en: Humor

Neptuno y su primera órbita completa

Neptuno fue descubierto en 1846 y su orbita alrededor del Sol lleva 165 años terrestres, por lo que si hacemos cuentas (1846+165) nos daremos cuentas que prácticamente acaba de terminar una vuelta completa al Sol desde su descubrimiento.

Neptuno es el octavo planeta del sistema solar, forma parte de los denominados planetas exteriores o gigantes gaseosos teniendo una masa de 17 tierras… Más información como siempre en Wikipedia

Etiquetado con: ,
Publicado en: Astronomía

Tienes un rato y quieres aprender a usar GIT?

Git es un sistema de control de versiones muy popular y con el que útimamente mantengo mucha batallitas, viniendo de un acomodado subversion Git se hace un poco complejo pero en cuanto le coges un poco el truco te das cuenta de la potencia y versatibilidad que tiene para llevar proyectos.

http://try.github.com

El curso simula en todo momento una terminal enlazado a vuestra cuenta en Github, por lo que todo lo que se realiza puede verse en “directo”.

Etiquetado con: , ,
Publicado en: Linux, Programación

Anuncio líneas aéreas neozelandesas (El hobbit)

Original anuncio de las líneas aéreas neozelandesas en las que se muestra la típica explicación de los auxiliares de vuelo ambientado en la Tierra Media con motivo del próximo estreno del Hobbit “Un viaje inseperado”

Etiquetado con: , , ,
Publicado en: Cine, Humor

Exploración marciana y sus curiosas fotos

Buscando entre las diferentes fotos que nos están dejando las misiones enviadas a Marte en los últimos años he encontrado una de lo más interesante:

http://marsrover.nasa.gov/gallery/all/2/p/513/2P171912249EFFAAL4P2425L7M1.HTML

Se trata de una fotografía del rover “Spirit” en su día 513 de misión exploranto el crater Gusev, haced un zoom abajo a la izquierda y mirad esa piedrecita… No suelo ser especialmente consporanoico pero parece por completo un craneo o un casco ¿Verdad?. 99,9% de posibilidades de que simplemente sea un capricho de la erosión marciana unida a un juego de sombras y nuestra capacidad para encontrarle parecido a todo… Pero… Para mi claramente es un casco de soldado imperial jajaja.

Editado (Añado otra foto)

Etiquetado con: ,
Publicado en: Astronomía
Categorías