Como actualizar tablas de un módulo

Como actualizar tablas de un módulo

de Santiago Nieto Carrera -
Número de respuestas: 4
Hola:

He tenido que modificar la tabla del formulario quiz, ya que he creado nuevos campos en el. La duda que tengo, es que tengo que hacer para que moodle actualice la tabla que tiene almacenada en su base de datos, es decir, si además de darle a Notifications es necesario hacer algo más.

Para salir del paso, yo eliminé el módulo y lo volví a ingresar, aunque esta no es una buena opción, ya que en mi caso estoy con un moodle creado por mi para pruebas, pero en un caso real no sería factible.

Espero sugerencias, gracias.
Promedio de valoraciones: -
En respuesta a Santiago Nieto Carrera

Re: Como actualizar tablas de un módulo

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda

Para hacer las actualizaciones, los módulos disponen del fichero db/upgrade.php dentro de su directorio. En ese fichero puedes manipular los contenidos o la estructura de la base de datos usando las funciones estándar de Moodle (tanto las de manipulación de datos como las de xmldb para modificar la estructura).

Echa una ojeada a cualquiera de los existentes para ver como funcionan (p.ej. mod/resource/db/upgrade.php es pequeñito pero muestra ambos tipos de manipulaciones de la bbdd de Moodle).

Saludos, Iñaki.

En respuesta a Iñaki Arenaza

Re: Como actualizar tablas de un módulo

de Santiago Nieto Carrera -
Perdón por la tardanza en la respuesta, es que tuve que ponerme a hacer otras cosas antes de esto.

Veamos, lo que quiero es que he creado nuevos campos en la tabla quiz del mismo módulo. Por lo que necesitaría que para utilizar las nuevas funcionalidades creadas en el módulo, que hacen uso de esos campos y que además añaden nuevos parámetros al formulario de creación de instancia, baste con sobreescribir mis archivos por los existentes y que puedan funcionar correctamente, sin necesidad de borrar el módulo y volver a insertarlo en moodle (que las instancias ya creadas anteriormente se puedan seguir utilizando, con la diferencia de que estarán disponible las modificaciones).

He visto el archivo update.php que me has aconsejado, y tengo un par de dudas. Primero tengo que darle un número de versión a la mía y después poner:

if ($result && $oldversion < "miversion") {setAttributes(XMLDB_TYPE_TEXT, 'small', null, null, null, null, null, null, 'reference');

/// Launch change of nullability for field summary
$result = $result && change_field_notnull($table, $field);
}


Hasta ahí sería correcto, no??

Lo que no entiendo es como poner más de un campo y después la función que lo actualiza, en este caso, change_field_notnull(...) donde está definida. Tal y como entiendo esto, simplemente cambia un atributo de este campo, pero como haría para añdir unos nuevos.

Se que es un poco larga la respuesta, agradezco el aguantarme, jeje.

Un saludo.
En respuesta a Santiago Nieto Carrera

Re: Como actualizar tablas de un módulo

de Santiago Nieto Carrera -
Creo que lo que tendría que hacer es esto:

En update.php:

if ($result && $oldversion < miversion) { //TODO
/// Define field sourcecode to be added to quiz
$table = new XMLDBTable('quiz');

$field = new XMLDBField('time_limit_min');
$field->setAttributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0', '0');

/// Launch add field sourcecode
$result = $result && add_field($table, $field);
}


Y en version.php tendré que tener la version miversion, para que una vez se actualice quede con ese numero y no sea necesario volver a actualizar.

Ahora bien, tengo un par de dudas:

1) Como se hace para que moodle actualice. Es decir, basta con darle a notifications, como en el caso de ingresar un nuevo módulo??.

2)La sentencia $field->setAttributes(XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, null, null, null, null, '0', '0'); como va. Es que la cogí del propio upgrade.php del módulo quiz y no se que indican los dos campos a partir del primer null. Supongo que los dos últimos harán referencia a los valores por defecto. Por defecto había en lugar de '0' esto 'timemodified', pero no se a que hace referencia, por eso puse 0, ya que no todos los campos que voy a añadir trendrán que ver con parámetros temporales.

3) La sentencia $result = $result && add_field($table, $field); la encontré en otro tema de un foro en ingles, y creo que serviría para añadir el campo a la tabla, no??

Gracias por vuestra atención.