• Blogs
  • Fco.
  • Moodle 1.9: modificación del módulo "forum" para controlar el ancho de las imágenes

Moodle 1.9: modificación del módulo "forum" para controlar el ancho de las imágenes

    Fco.
    • Público
    Por Fco. hace 2674 días Comentarios (1)

    Hola en este tutorial, vamos a explicar las modificaciones que hemos realizado en el código del módulo "forum" de Moodle para controlar que no aparezcan imágenes demasiado anchas en el foro que hagan necesario el manejo del "scroll" lateral, porque la imagen no cabe en la pantalla.

    La solución empleada va a ser que cuando alguien envíe imágenes de un ancho superior al que consideremos apropiado, muestre en el foro una imagen escalada más pequeña, con un enlace a la original, de tal forma que si se quiere ver a tamaño completo, se haga click en la imagen para acceder a la original.

    Hemos dividido la explicación en tres partes funcionales, porque tratan aspectos distintos de las funciones que realiza el código.

    En esta primera parte vamos a explicar lo que hacemos para mostrar los campos en las páginas de administración de los foros y que tiene relación con las vistas y con la BBDD base de datos.

    Segunda parte explicamos las modificaciones en forum/lib.php para escalar imagenes, guardarlas, editar y borrar.

    Tercera parte en la que modificamos forum/backuplib.php para que al hacer las copias de seguridad se guarde la configuración de los nuevos cambios que hemos hecho.

    Primera parte:

    En "Administración general del sitio->Módulos->Actividades->Foro añadimos un campo llamado "Ancho máximo al que se muestran imágenes" para elegir el ancho a partir del cual se escalarán las imagenes en los foros, que por defecto será de 600px.

    Para añadir el texto "Ancho máximo al que se muestran imágenes" tenemos que modificar los archivos de lenguaje y es lo primero que vamos a hacer.

    En moodle/lang/en_utf8/forum.php añadimos lo siguiente, para cuando usemos la función "get_string". Esto es para el idioma ingles.

    /// START SCALE FORUM IMAGES SIZES
    // array con un nombre de campo "maximagewidth" y en el que guardamos el texto
    "Max width forum displayed images"
    $string['maximagewidth'] = 'Max width forum displayed images';
    /// END SCALE FORUM IMAGES SIZES

    Para el idioma español.

    En los módulos que no vienen con moodle (aquellos que descargamos de la base de datos de módulos y plugins) todas las carpetas de idioma (ej: en_utf8, es_utf8, ...) se guardan dentro de la carpeta de idiomas del módulo (ej: nombre_del_modulo/lang/). Sin embargo, en los módulos que vienen por defecto con moodle, como es el caso del modulo "forum", la carpeta de idioma Inglés (en_utf8) se guarda en la carpeta de idiomas del sistema (...moodle.../lang/) y el resto de idiomas que vayamos añadiendo desde la zona de administración (o en la zona de administración) se guardarán en una carpeta de idiomas dentro del directorio de datos (...moodledata.../lang/). Si no sabes cuáles son en tu caso las carpetas ...moodle... y ...moodledata..., puedes consultarlas en el archivo config.php, correspondiendo a los valores dirroot y dataroot respectivamente.

    El motivo de separar los idiomas en las distintas carpetas es que el en_utf8 se encuentra, desde que instalamos moodle, dentro de la carpeta del código, en la que por motivos de seguridad no vamos a dar permisos de escritura al usuario del servidor web. Sin embargo, el resto de idiomas los instalamos vía web desde la zona de administración, por lo que deben guardarse en algún lugar en el que el servidor web pueda almacenar archivos y esto sólo es posible en el directorio de datos.

    /// START SCALE FORUM IMAGES SIZES
    $string['maximagewidth'] = 'Ancho máximo de imágenes adjuntas';
    /// END SCALE FORUM IMAGES SIZES

    Si no encontramos el archivo lang/es_utf8/forum.php no pasa nada, lo único que cogera el texto del idioma ingles y aparacera en ingles, pero también podemos cambiar "Max width forum displayed images" por "Ancho máximo de imágenes adjuntas", en el idioma ingles, lo que no es recomendable.

     

    Ahora vamos con la parte que añadira el campo para seleccionar el ancho de las imágenes en la administración de los foros en general.

    En el archivo forum/settings.php añadimos

    $settings->add(new admin_setting_configcheckbox('forum_ajaxrating', get_string('ajaxrating', 'forum'),

                       get_string('configajaxrating', 'forum'), 0));
    // A partir de aquí lo añadimos
    /// START SCALE FORUM IMAGES SIZES
    // Creamos un vector con los anchos máximos que vamos a permitir
    $forumwidths = array(0 => get_string('notscaleimage', 'forum'));
    for ($i=50; $i<=1600; $i+=50) {
        $forumwidths[$i] = "$i px";
    }
    // Añadimos el campo, que será un campo de selección, y cogemos el texto de los archivos de lenguaje con la función "get_string" (Esto lo explicamos más adelante).
    $settings->add(new admin_setting_configselect('forum_maximagewidth', get_string('maximagewidth', 'forum'),
                       get_string('configmaximagewidth', 'forum'), 600, $forumwidths));
    /// END SCALE FORUM IMAGES SIZES

    // Fin de lo añadido
    ?>

    Aquí vemos como quedará:

    image

    En esta parte no es necesario que hagamos nada sobre la base de datos con este nuevo campo.

    Añadimos el código que ira forum/mod_form.php para que aparezca la selección del ancho máximo de la imagen en la administración de cada foro y dentro de "Ajustes generales" en la maquetación de la vista.

            $mform->addElement('select', 'maxbytes', get_string('maxattachmentsize', 'forum'), $choices);
            $mform->setHelpButton('maxbytes', array('maxattachmentsize', get_string('maxattachmentsize', 'forum'), 'forum'));
            $mform->setDefault('maxbytes', $CFG->forum_maxbytes);
    // A partir de aquí lo añadimos
            /// START SCALE FORUM IMAGES SIZES
    // Creamos un vector con los anchos máximos que vamos a permitir         $forumwidths = array(0 => get_string('notscaleimage', 'forum'));
            for ($i=50; $i<=1600; $i+=50) {
                $forumwidths[$i] = "$i px";
            }
    // Añadimos el campo "maximagewidth" con "select" indicamos que es un campo de selección, con "get_string..." cogemos el texto de los archivos de idiomas, y "$forumwidths" es lo que va en el select.
            $mform->addElement('select', 'maximagewidth', get_string('maximagewidth', 'forum'), $forumwidths);
    // Botón de ayuda
    image por si queremos añadir explicaciones a lo que hace nuestro código "No es necesario"
            $mform->setHelpButton('maximagewidth', array('maximagewidth', get_string('maximagewidth', 'forum'), 'forum'));
    // Por defecto ponemos en la variable "maximagewidth" el valor para los foros en general "$CFG->forum_maximagewidth"
            $mform->setDefault('maximagewidth', $CFG->forum_maximagewidth);
            /// END SCALE FORUM IMAGES SIZES
    // Fin de lo añadido
            if ($CFG->enablerssfeeds && isset($CFG->forum_enablerssfeeds) && $CFG->forum_enablerssfeeds) {

    Guardamos y refrescamos la página de edición del foro y nos debería quedar así:

    image

    Pero para que los cambios en forum/mod_form.php se guarden en la base de datos hay que hacer algunos cambios más.

    Tenemos que modificar forum/db/upgrade.php con este código, que es el que va a guardar el nuevo campo en la base de datos.

        if ($result && $oldversion < 2007101513) {
            delete_records('forum_ratings', 'post', 0); /// Clean existing wrong rates. MDL-18227
        }
    // A partir de aquí lo añadimos  
        /// START SCALE FORUM IMAGES
        if ($result && $oldversion < 2011021601) {
    // Definimos la tabla en la que vamos a añadir el campo
            /// Define field maximagewidth to be added to forum
            $table = new XMLDBTable('forum');
    // Definimos el campo
            $field = new XMLDBField('maximagewidth');
    //
    Los atributos del mismos que vamos a explicar como lo podemos conseguir
            $field->setAttributes(XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '600', 'blockperiod');

            /// Launch add field maximagewidth
            $result = $result && add_field($table, $field);
        }
        /// END SCALE FORUM IMAGES
    // Fin de lo añadido
        return $result;
    }

    ?>

    Para conseguir el código que hemos añadido anteriormente podemos entrar en Moodle como administrador Miscelánea->Editor XMLDB despues mod/forum/db [Cargar] y luego [Editar], en la tabla forum [Edición], luego [Nuevo campo], elegimos los atributos del nuevo campo name: maximagewidth, type: int, length: 4, Unsigned: unsigned, Not null: notnull, Default: 600. clicamos sobre Cambiar y ahora en la misma tabla forum [Ver código PHP], Seleccionar acción: addfield, Seleccionar Campo/Clave/Índice: maximagewidth y a continuación Ver y este es el resultado que pondremos en el archivo forum/db/upgrade.php que hemos visto anteriormente cambiando las XXXXX... por el número de versión nuevo.

        if ($result && $oldversion < XXXXXXXXXX) {

        /// Define field maximagewidth to be added to forum
            $table = new XMLDBTable('forum');
            $field = new XMLDBField('maximagewidth');
            $field->setAttributes(XMLDB_TYPE_INTEGER, '4', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '600', 'blockperiod');

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

    Para que esto funcione también hay que cambiar el archivo mod/forum/version.php con la nueva fecha, porque si la fecha del código de mod/forum/db/upgrade.php es menor que 2011021601 no hará los cambios en la base de datos

    <?php // $Id: version.php,v 1.69.2.5 2009/05/04 08:11:15 stronk7 Exp $

    ////////////////////////////////////////////////////////////////////////////////
    // Code fragment to define the module version etc.
    // This fragment is called by /admin/index.php
    ////////////////////////////////////////////////////////////////////////////////

    /// START SCALE FORUM IMAGES
    // Esta es la linea que hay que modificar con el formato año mes día versión
    $module->version = 2011021601;
    /// END SCALE FORUM IMAGES
    $module->requires = 2007101509; // Requires this Moodle version
    $module->cron = 60;

    ?>

    Una vez hecho esto vamos a la página de administración de Moodle y clicamos sobre Notificaciones para que haga los cambios sobre la base de datos y con esto concluimos por ahora, ya podemos cambiar las vistas de cualquier modulo de Moodle y guardar los datos permanentemente en la base datos, lo que ya es un avance.

    Espero que os resulte fácil enteder el código y los pasos que hemos seguido, si teneis alguna duda, hacermela llegar y tratare de explicarla mejor, mas adelante subire las 2ª y 3ª parte para completar la nueva funcionalidad del modulo.

    Agradecimientos a Borja Rubio, que es quien me ha enseñado lo poco que se sobre Moodle y que ha hecho posible que el modulo funcione. Aquí os dejo su blog http://brubior.wordpress.com/   y su correo brubior@gmail.com

    Hasta luego.

    Comentarios

      Fco.

      Fco.

      Tengo curiosidad por saber como funcionan las cosas y capacidad para aprender "estoy motivado".