¿Por qué pueden fallar los botones de descarga a excel y txt?

¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -
Número de respuestas: 15

Hola!! ya solucioné lo del menú desplegable, pero ahora tengo que rematar el primer módulo y arreglar la actualización de la instancia del segundo que me va mal. Asique por partes.

Copie el código de report.php del módulo choice y lo único que hice fue cambiar "choice" por el nombre de mi módulo, asique el código de los downloads está tal cual. Pero en el módulo consulta le doy a descargar a excel y me abre el excel pa ver si lo quiero guardar o abrir, pero en mi módulo, al darle a descargar como excel me aparece toda la pantalla llena de rombos con interrogaciones y el resto todo en blanco.

¿Alguien sabe por qué puede ser?

Que estrés madre!!!

Un millón de gracias!!!gran sonrisa

Promedio de valoraciones: -
En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

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

Apostaría a que es una de dos cosas:

a) se te olvida enviar el tipo mime del archivo en las cabeceras antes de enviar el archivo en sí.

b) se te cuela 'salida' (espacios en blanco u otro tipo de caracteres no visibles) antes del envio del archivo y/o las cabeceras en sí.

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -

Ui.. ahora si que me has roto. Yo lo del tipo Mime me suena de haberlo nombrado el profesor en clase pero de hace mucho mucho tiempo. Asique la verdad es que no tengo ni idea de si está o no está metida esa cabecera.

Lo que es headers veo que se meten para el tipo txt pero para el excel no. Miré también en excellib.class.php que es el fichero que incluye la descarga de tipo excel pero tampoco vi nada de cabeceras.

Asique ante mi enorme ignorancia en el tema, voy a optar por dejarte el trozo de código de txt y excel para que si tienes un momento me puedas decir si tengo o no eso que me falta.

Código:

// Si se va a efectuar una descarga de los resultados en formato EXCEL y el
 // usuario puede descargar los resultados
    if ($download == "xls" and has_capability('mod/practical:downloadresponses', $context)) {

        // Se incluye el fichero especificado
        require_once("$CFG->libdir/excellib.class.php");

     // Calcula el nombre del fichero
        $filename = clean_filename("$course->shortname ".strip_tags(format_string($practical->name,true))).'.xls';
     // Crea el cuaderno
        $workbook = new MoodleExcelWorkbook("-");
     // Envía las cabeceras HTTP
        $workbook->send($filename);
     // Crea la primera hoja de trabajo
        $myxls =& $workbook->add_worksheet($strresponses);

     // Imprime los nombres de todos los campos
        $myxls->write_string(0,0,get_string('lastname'));
        $myxls->write_string(0,1,get_string('firstname'));
        $myxls->write_string(0,2,get_string('idnumber'));
        $myxls->write_string(0,3,get_string('group'));
        $myxls->write_string(0,4,get_string('schedule','practical'));


     // Genera los datos para el cuerpo de la hoja de cálculo
        $i=0;
        $row=1; // fila 1

        // Si hay usuarios que cumplan la capacidad
        if ($users) {

            // Para cada uno de ellos
            foreach ($users as $user) {

                // Si el id es cero y tiene la capacidad de leer los resultados, no entra
                if (!($optionid==0 and has_capability('mod/practical:readresponses', $context, $user->id))) {

                    // Si ha dado una respuesta y no se da a la vez que el id de la opción sea cero
                    // y que el usuario tenga capacidad de leer las respuestas
                    if (!empty($answers[$user->id]) and !($answers[$user->id]->optionid==0 and has_capability('mod/practical:readresponses', $context, $user->id))) {

                        $myxls->write_string($row,0,$user->lastname);
                        $myxls->write_string($row,1,$user->firstname);
                        $studentid=(!empty($user->idnumber) ? $user->idnumber : " ");
                        $myxls->write_string($row,2,$studentid);
                        $ug2 = '';

                        // Almacena el grupo del usuario en un curso particular
                        $usergrps = user_group($course->id, $user->id);
                        if ($usergrps) {
                            foreach ($usergrps as $ug) {
                                $ug2 = $ug2. $ug->name;
                            }
                        }
                        $myxls->write_string($row,3,$ug2);

                        // Almacena la opcion elegida y la muestra
                        $useroption = practical_get_option_text($practical, $answers[$user->id]->optionid);
                        if (isset($useroption)) {
                            $myxls->write_string($row,4,format_string($useroption,true));
                        }
                        $row++; // pasa a la siguiente fila
                    }
                    $pos=4;
                }
            }

      // Cierra el cuaderno
            $workbook->close();

            exit;
        }
    }

 // Si se va a efectuar una descarga de los resultados en formato TXT y el
 // usuario puede descargar los resultados
    if ($download == "txt" and has_capability('mod/practical:downloadresponses', $context)) {

       // Calcula el nombre del fichero
        $filename = clean_filename("$course->shortname ".strip_tags(format_string($practical->name,true))).'.txt';

        header("Content-Type: application/download\n");
        header("Content-Disposition: attachment; filename=\"$filename\"");
        header("Expires: 0");
        header("Cache-Control: must-revalidate,post-check=0,pre-check=0");
        header("Pragma: public");

  // Imprime los nombres de todos los campos
        echo get_string('firstname')."\t".get_string('lastname') . "\t". get_string('idnumber') . "\t";
        echo get_string('group'). "\t";
        echo get_string('schedule','practical'). "\n";

        // Genera los datos para el cuerpo de la hoja de cálculo
        $i=0;
        $row=1; // fila 1

        // Si hay usuarios que cumplan la capacidad
        if ($users) {

            // Para cada uno de ellos
            foreach ($users as $user) {

    // Si ha dado una respuesta y no se da a la vez que el id de la opción sea cero
                // y que el usuario tenga capacidad de leer las respuestas
             if (!empty($answers[$user->id]) and !($answers[$user->id]->optionid==0 and has_capability('mod/practical:readresponses', $context, $user->id))) {
                    echo $user->lastname;
                    echo "\t".$user->firstname;
                    $studentid = ' '; // inicializa la variable

                    // Si el usuario tiene id se le asigna a la variable
                    if (!empty($user->idnumber)) {
                        $studentid = $user->idnumber;
                    }
                    echo "\t". $studentid."\t";
                    $ug2 = '';

                    // Almacena el grupo del usuario en un curso particular
                    $usergrps = user_group($course->id, $user->id);
                    if ($usergrps) {
                        foreach ($usergrps as $ug) {
                            $ug2 = $ug2. $ug->name;
                        }
                    }
                    echo $ug2. "\t";
                    echo format_string(practical_get_option_text($practical, $answers[$user->id]->optionid),true). "\n";
                }
                $row++; // pasa a la siguiente fila
            }
            exit;
        }
    }

Muchas gracias!!! y perdona la lata que te estoy dando!sonrojado

En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

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

Lo que es headers veo que se meten para el tipo txt pero para el excel no. Miré también en excellib.class.php que es el fichero que incluye la descarga de tipo excel pero tampoco vi nada de cabeceras.

 // Envía las cabeceras HTTP
   $workbook->send($filename);

He echado una ojeada a esta función, y efectivamente se encarga de enviar las cabeceras con el tipo MIME (y otros detalles) al navegador.

Así que la única otra opción que se me ocurre es que se te esté colando algo de 'salida' antes de enviar las cabeceras. Pero en ese caso, deberías estar viendo algunos 'warnings' en alguna parte.

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Luis Miguel Morillas -
Rercuerda que tienes que activar el nivel apropiado de depuración en Administración -> Servidor -> Depurando

Si no a lo mejor no aparecen los warnings.

-- lm
En respuesta a Luis Miguel Morillas

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -

Hola! sí, teníais razón es que no tenía puesto lo de Depurando. Ahora me salen bastantes warnings, pero tampoco sé muy bien como repararlos. Son estos:

Warning: Cannot modify header information - headers already sent by (output started at ...\xampp\htdocs\moodle\mod\practical\lang\en_utf8\practical.php:1) in ...\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php on line 67

Warning: Cannot modify header information - headers already sent by (output started at ...\xampp\htdocs\moodle\mod\practical\lang\en_utf8\practical.php:1) in ...\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php on line 68

Warning: Cannot modify header information - headers already sent by (output started at ...\xampp\htdocs\moodle\mod\practical\lang\en_utf8\practical.php:1) in ...\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php on line 69

Warning: Cannot modify header information - headers already sent by (output started at ...\xampp\htdocs\moodle\mod\practical\lang\en_utf8\practical.php:1) in ...\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php on line 70

Warning: Cannot modify header information - headers already sent by (output started at ...\xampp\htdocs\moodle\mod\practical\lang\en_utf8\practical.php:1) in ...\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php on line 71

¿Tenéis idea?

En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Iñaki Arenaza -
Imagen de Desarrolladores Imagen de Desarrolladores de plugins Imagen de Documentadores Imagen de Moderadores Imagen de Moodlers de gran ayuda
Si, este es el origen del problema. Tienes seguramente espacios en blanco antes o despues de las etiquetas de apertura/cierre de PHP y eso impide enviar las cabeceras de la página, lo que impide que se envie la información del tipo MIME y que por tanto se interprete como una hoja de cálculo Excel.

Revisa el fichero \moodle\mod\practical\lang\en_utf8\practical.php, porque parece ser que en la primera linea hay especios en blanco, o saltos de línea, antes de la etiqueta de apertura de php. Bórralo y eso debería resolver el problema.

Saludos. Iñaki.
En respuesta a Iñaki Arenaza

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -
Nada triste esto no tiramuerto!

Tengo el <?php lo más pegado al borde izquierdo posible y me sigue dando los mismos errores y encima es que sí que falla ahí porque si lo pongo en la fila 2 me salen los mismos errores pero referidos a la fila 2.

Yo lo tengo tal que así:
<?php
/**
* Este archivo php contiene todos los strings utilizados en el
* módulo traducidos al idioma Inglés
*/

$string['afterclosing'] = 'To show results after closing you must specify a deadline';
$string['allowupdate'] = 'Allow practical to be updated';
$string['answered'] = 'Answered';
(...)

El <?php está en la fila 1 y lo más cerca del borde posible. Pero nada, sigue maltriste, que asco!

¿Se te ocurre algo más que pueda hacerse? Sino pasaré al plan B que consiste en quitar todos los botones de descargapensativo

Mil gracias!!!!
En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

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

¿Con qué estás editando ese fichero? ¿En qué juego de caracteres está guardado? No vaya a ser que el editor que uses esté añadiendo el BOM (http://es.wikipedia.org/wiki/Marca_de_orden_de_bytes_(BOM)) al comienzo del fichero y te la esté jugando (porque normalmente te lo ocultará cuando lo abrás para editarlo).

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -
Madre! no lo habría pensado ni en un millón de años! lo estaba editando con el PHPEdit y me lo estaba guardando como UTF8 con BOM, ahora guarde todos los archivos como UTF8 y ya se me quitaron los warnings pero me salieron errores de XML por tener mal algun <td> y demás en las tablas. Los solucioné y ahora me aparece uno que no tengo ni idea de qué es. Me dice:

Error de lectura XML: mal formado
Ubicación: http://localhost/moodle/mod/practical/view.php?id=21&download=xls
Número de línea 159, columna 3:��ࡱ�
--^

y miro el código fuente de la página y tengo en esa línea:

(la línea es la que está en verde!)

<!--
document.getElementById("noscriptmenuaction").style.display = "none";
-->
</script></td></tr></table></div></form></div><br />
<table class="downloadreport"><tr>
<td><div class="singlebutton"><form action="view.php" method="get"><div><input type="hidden" name="id" value="21" /><input type="hidden" name="download" value="ods" /><input type="submit" value="Descargar en formato ODS" /></div></form></div></td><td><div class="singlebutton"><form action="view.php" method="get"><div><input type="hidden" name="id" value="21" /><input type="hidden" name="download" value="xls" /><input type="submit" value="Descargar en formato Excel" /></div></form></div></td><td><div class="singlebutton"><form action="view.php" method="get"><div><input type="hidden" name="id" value="21" /><input type="hidden" name="download" value="txt" /><input type="submit" value="Descargar en formato de texto" /></div></form></div></td></tr></table><br />
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at D:\Nuevo xampp\xampp\htdocs\moodle\lib\weblib.php:2396) in <b>D:\Nuevo xampp\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php</b> on line <b>67</b><br />
<br />
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at D:\Nuevo xampp\xampp\htdocs\moodle\lib\weblib.php:2396) in <b>D:\Nuevo xampp\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at D:\Nuevo xampp\xampp\htdocs\moodle\lib\weblib.php:2396) in <b>D:\Nuevo xampp\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php</b> on line <b>69</b><br />
<br />
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at D:\Nuevo xampp\xampp\htdocs\moodle\lib\weblib.php:2396) in <b>D:\Nuevo xampp\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php</b> on line <b>70</b><br />
<br />
<b>Warning</b>: Cannot modify header information - headers already sent by (output started at D:\Nuevo xampp\xampp\htdocs\moodle\lib\weblib.php:2396) in <b>D:\Nuevo xampp\xampp\htdocs\moodle\lib\pear\Spreadsheet\Excel\Writer.php</b> on line <b>71</b><br />
��ࡱ�����������������;���� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���
��� ��� ���
Y no te lo creeras pero pasa una cosa muy rara sólo en esa línea.
Si me pongo en la primera columna de esa línea y empiezo a darle a la fecha
de la derecha del teclado para avanzar por las líneas me aparece abajo en el editor:

Línea 159, Columna 1
Línea 159, Columna 2
Línea 159, Columna 3
Línea 159, Columna 4
Línea 159, Columna 3 ¡¡me dice que es la columna 3 la columna 5!!
Línea 159, Columna 6

y si luego desde la columna 6 le doy con la flecha de la izda del teclado para volver a la columna 1, me sale:

Línea 159, Columna 6
Línea 159, Columna 5
Línea 159, Columna 4
Línea 159, Columna 5 ¡¡ ahora me dice que es la columna 5 la columna 3!!
Línea 159, Columna 2
Línea 159, Columna 1

¿Serán fallos del editor o tendrá que ver con el fallo de XML? Porque esto raro sólo me pasa con la fila esa, las demás van bien.

¿Se te ocurre alguna situación para esta situación paranormal?

Mil gracias!!!
En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Luis Miguel Morillas -
jajajaja Esperemos que no sea paranormal sonrisa

¿Puedes adjuntar el archivo? ¿Seguro que es UTF8? Parece que hay un problema con el encoding.

-- lm
En respuesta a Luis Miguel Morillas

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -

Puf, antes al abrir el PHPEdit me dio error de carácter inválido y era el mismo carácter que me falla en lo de las descargasenojado...

Aquí adjunto el código fuente de la pantalla que me da error y el view.php de mi módulo en el siguiente mensaje. Estos botones de descarga me están amargando pero bientriste

Gracias por ayudarme!!!

En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

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

Cannot modify header information - headers already sent by (output started at D:\Nuevo xampp\xampp\htdocs\moodle\lib\weblib.php:2396

Me temo que el problema está realmente aquí. Este fichero (que igual también has tocado), está enviando contenido 'html' al navegador, con lo cual te pasa lo mismo que anteriormente: destroza las cabeceras MIME y el navegador no se entera de que es un fichero excel.

Revisa la línea 2396 del fichero weblib.php.

Saludos. Iñaki.

En respuesta a Iñaki Arenaza

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

de Nadyare Pérez -

ALELUYA!!


Ya está!!! por fin! gran sonrisa gran sonrisa

La línea esa del archivo weblib.php me remitía directamente a la función print_header_simple, entonces me fui al archivo y le quité la cabecera a ver que pasaba y tachán!! era eso, como estaba mandando la cabecera pues entonces no me pillaba las otras.

Entonces lo que hice para solucionarlo fue llevarme las opciones de descarga a report.php y sacarlas del view y ahí no poner cabecera y ya estágran sonrisa Ya tira bien.

Ah por cierto, si pones un var_dump en report.php también falla. Asique ni cabeceras ni var_dumps y todo bajo control.

Sobre este tema me queda una última duda:

¿Hay alguna forma de que las cabeceras en el excel aparezcan en negrita?

Y otra cosa: en la descarga .txt me sale todo en la misma línea. ¿Es normal o tendría que salir el nombre de la gente debajo del nombre y tal? Es que donde tendría que haber un salto de línea me sale un cuadraditoindeciso

Pero bueno, eso ya son cosas menores, yo mientras tire...

Mil gracias!!!!


En respuesta a Nadyare Pérez

Re: ¿Por qué pueden fallar los botones de descarga a excel y txt?

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

Es que donde tendría que haber un salto de línea me sale un cuadradito

Supongo que es por la convención de terminación de línea de Unix/Linux (salto de línea), en vez de la que usa MS-DOS/MS-Windows (retorno de carro + salto de línea). ¿Si lo abres con Wordpad se lee bien?

De lo de la negrilla en las cabeceras del excel, ni idea.

Saludos. Iñaki.