Foros del Web » Programando para Internet » Javascript »

Recargar página tras envío exitoso de formulario.

Estas en el tema de Recargar página tras envío exitoso de formulario. en el foro de Javascript en Foros del Web. Buenos días, sinceramente estoy medio confundido y no sé si esta será la sección correcta, ya que mezclo un poco de todo. Cualquier cosa, son ...
  #1 (permalink)  
Antiguo 24/10/2012, 15:03
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 15 años, 8 meses
Puntos: 26
Recargar página tras envío exitoso de formulario.

Buenos días, sinceramente estoy medio confundido y no sé si esta será la sección correcta, ya que mezclo un poco de todo. Cualquier cosa, son libres de moverlo de foro.

La cuestión es la siguiente, tengo un panel de administración que posee varias secciones (usuarios, perfiles, etc...). En este caso me voy a enfocar en el CRUD de los perfiles.

Una de las funcionalidades de esta aplicación es poder exportar e importar los perfiles a un archivo con formato csv. Por ahora estoy liando con la exportación.

A priori tengo mi script PHP para generar el archivo. Este script funciona bien.

El tema fue cuando quise informarle al usuario sobre el estado de la operación (satisfactoria o fallida). Lo cual lo hago con un div estilizado e imprimiendo el valor de una variable de sesión.
He aquí el problema, para descargar el archivo una vez generado por el script "genera.php" tuve que cambiarle los headers a "genera.php" para que me fuerce la descarga del csv. Pero una vez hecho esto no podía redirigir al CRUD "perfiles.php" ya que una vez modificados los headers no permite redirección.

Entonces opté por añadirle "target=popup" al formulario de exportación. Eso hizo que se descargue sin inconvenientes el archivo csv. Pero no informa que la operación fue exitosa. Para eso tengo que refrescar el navegador a mano.

Entonces lo que busco, si es posible, lograr mediante eventos (estuve leyendo, pero creo que no hay ninguno exactamente para lo que necesito) que una vez descargado el archivo el navegador se refresque automáticamente (esto si lo se hacer con js :P ). Pero el problema radica en cómo saber cuando el formulario se envió y el script "genera.php" finalizó su ejecución. Para después claro, refrescar el navegador y leer la variable de sesión que contiene el mensaje del estado de la operación.

No sé si hice mucho lio o se entendió. Agradezco cualquier tipo de opinión o ayudita.
Saludos y desde ya, muchas gracias !.
  #2 (permalink)  
Antiguo 24/10/2012, 18:58
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Recargar página tras envío exitoso de formulario.

Si, es medio confuso sin visualizar el conjunto, voy a ver si lo simplifico

en una página tenés un botón o un form con un submit que tiene como destino una script php, la cual genera un csv, para forzar la descarga supongo que harás algo así

<?php
header('Content-Type: application/octet-stream');
echo "A,B,C";
?>

El usuario descargaria un archivo conteniendo
A,B,C

Obviamente tu php no puede tener impreso nada más que eso.
Vos entonces querés algún tipo de aviso para indicar que el csv se generó (que lo descargue ó no ya dependerá de el)

Eso de recargar el index y la sesion no lo tengo muy claro. Pero para lo del mensaje, sería necesario un paso intermedio, guardando el archivo.
Hay una condición para todo esto , que estés usando Apache (bueno puede que sea opcional pero habría que hacer algun cambio), en todo caso en este ejemplo si
Podés hacer toda la operación con Ajax, pero no me parece que se justificaría, usando un iframe oculto se puede lograr

Primero como vamos a guardar el csv, en la carpeta que los guardes, un .htaccess para forzar l descarga

.htaccess
Código Apache:
Ver original
  1. AddType application/octet-stream .csv

perfil.php (paso algo con get solo para la demostración)
Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <title>titulo</title>
  6. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  7.  
  8. <script type="text/javascript">
  9. //<![CDATA[
  10. function mensaje(texto){
  11. document.getElementById('mensaje').innerHTML = texto;
  12. }
  13. //]]>
  14. </script>
  15. </head>
  16. <body>
  17. <a href="genera.php?perfil=X,Z,Y" target="genera">Descargar Perfil</a>
  18. <div id="mensaje">
  19. </div>
  20. <iframe src="about:blank" name="genera" id="genera" width="0" height="0" frameborder="0"></iframe>
  21. </body>
  22. </html>


y ahora el genera.php

Código PHP:
Ver original
  1. <?php
  2. $datos = $_GET['perfil'];
  3. $crearcvs = file_put_contents("temp.csv",$datos,LOCK_EX);
  4. if($crearcvs !== false){
  5.     ?>
  6. <script type="text/javascript">
  7. //<![CDATA[
  8. /* script */
  9. parent.mensaje('Se generó el archivo');
  10. window.location.href='temp.csv';
  11. //]]>
  12. </script>
  13.  
  14. <?php
  15. }else{
  16. ?>
  17. <script type="text/javascript">
  18. //<![CDATA[
  19. /* script */
  20. parent.mensaje('error');
  21. //]]>
  22. </script>
  23. <?php
  24. }
  25.  
  26. ?>

La carpeta que guarde los csv tendría que tener permisos de escritura.
Bueno, esa es la idea general, tendrías de seguro que adaptar cosas, como el nombre del archivo generado, la eleiminación de los archivos temporales, etc


Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 24/10/2012, 19:42
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 15 años, 8 meses
Puntos: 26
Respuesta: Recargar página tras envío exitoso de formulario.

Emprear, gracias por la respuesta. Y si, la verdad que hasta me he mareado para describir la situación.
A continuación coloco algo de código y explicando que hace y cómo tengo encarado el sistema.

Perfiles.php
Es la pantalla de administración de perfiles. Básicamente interesa el formulario y el div que contiene el alerta de éxito o fracaso.
El dichoso div:
Código PHP:
<!-- Mensajes de la aplicacion -->
<div class="g_12">
     <?php
          
if ( isset($_SESSION['ABMStatus']) ){
               if (
$_SESSION['ABMStatus']['Success'] == true){
                    echo 
"<div class='success iDialog'>".$_SESSION['ABMStatus']['Msg']."</div>";
               }else{
                    echo 
"<div class='error iDialog'>".$_SESSION['ABMStatus']['Msg']."</div>";
               }
          }
          unset(
$_SESSION['ABMStatus']);
     
?>
</div>
Básicamente, si existe la variable de sesión ABMStatus, es porque vino de alguna operación del ABM (todas las operaciones que he desarrollado definen esta variable).Entonces informa el mensaje.

Ahora el formulario, como lo tengo ahora:
Código HTML:
Ver original
  1. <form id="exportPerfil" target="popup" method="POST" action="Bin/exportPerfil.php">
  2.         <!-- Submit -->
  3.         <div class="line_grid">
  4.             <div class="g_3"><span class="label">Iniciar     exportaci&oacute;n</span></div>
  5.             <div class="g_9">
  6.                 <input type="submit" value="Exportar" class="submitIt simple_buttons"/>
  7.             </div>
  8.         </div>
  9.     </form>

Ahora el script que genera el dichoso csv. Coloco solo la parte donde fuerzo la descarga y establezco los valores de ABMStatus:
Código PHP:
$format ".csv";
$filename $_SERVER['DOCUMENT_ROOT']."/Cache/perfiles".date('dmY').$format;

/*
 * Aca cargo el archivo y lo cierro. Funciona, así que no viene al caso.
 */
if ($_SESSION['ABMStatus']['Success'] == true){
    
    
$_SESSION['ABMStatus']['Msg'] =  "Perfiles exportados correctamente.";

    
header("Content-disposition: attachment; filename=perfiles".date('dmY').$format);
    
header("Content-type: application/octet-stream");
    
readfile($filename);

    
}else{
    
$_SESSION['ABMStatus']['Msg'] = "La exportaci&oacute;n de los perfiles ha fallado inesperadamente.";

El formulario al tener target popup me descarga el archivo sin dramas, pero no me actualiza perfiles.php para leer el nuevo valor de ABMStatus.
Y si intento redireccionar desde el script PHP, no voy a poder hacerlo porque ya toque los headers.
Se entiende un poco más ahora ? je.
  #4 (permalink)  
Antiguo 24/10/2012, 20:18
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Recargar página tras envío exitoso de formulario.

Si, más o menos, ahora veo que el mensaje lo tenés definido en la sesión, la cosa es recargar la página perfil.php

bueno, con una variante de lo que te puse antes

perfil.php
Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <title>titulo</title>
  6. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  7.  
  8. <script type="text/javascript">
  9. //<![CDATA[
  10. function mensaje(texto){
  11. document.getElementById('mensaje').innerHTML = texto;
  12. }
  13. //]]>
  14. </script>
  15. </head>
  16. <body>
  17.     <p>
  18.     <?php echo time(); ?>
  19. </p>
  20. <form action="genera.php" target="genera" method="post" id="fperfil">
  21. <p>
  22. <input type="text" value="" name="perfil" /> <input type="submit" value="generar perfil"  onsubmit="this.form.reset();"/>
  23. </p>
  24. </form>
  25. <div id="mensaje">
  26.     <!-- fix -->
  27. </div>
  28. <iframe src="about:blank" name="genera" id="genera" width="0" height="0" frameborder="0"></iframe>
  29. </body>
  30. </html>



genera.php

Código PHP:
Ver original
  1. <?php
  2. $datos = $_POST['perfil'];
  3. $crearcvs = file_put_contents("temp.csv",$datos,LOCK_EX);
  4. if($crearcvs !== false){
  5.     ?>
  6. <script type="text/javascript">
  7. //<![CDATA[
  8. /* script */
  9. //parent.mensaje('Se generó el archivo');
  10. parent.location.reload(true);
  11. window.location.href='temp.csv';
  12. //]]>
  13. </script>
  14.  
  15. <?php
  16. }else{
  17. ?>
  18.     <script type="text/javascript">
  19. //<![CDATA[
  20. /* script */
  21. //parent.mensaje('error');
  22. //]]>
  23. </script>
  24. <?php
  25. }
  26.  
  27. ?>

en perfil puse el time() para que veas que se recarga.
Recordá que con lo del .htaccess que te mencioné, ya no son necesarios los headers. Y el nombre del archivo lo podés manejar con una variable. El mensaje de error lo dejamos, no está de más
la clave está en hacer

Código Javascript:
Ver original
  1. parent.location.reload(true);
el true lo usamos para asegurarnos que se carga del server y no de la cache

Se entiende

Te dejo una demo
http://foros.emprear.com/php/perfil/perfil.php

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 24/10/2012, 21:01
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Recargar página tras envío exitoso de formulario.

vos sabés que la venía probando en firefox y andaba perfecto, pero en los demás browsers no, le di unas vueltas hasta que pude
quedó asi


perfil.php

Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <title>titulo</title>
  6. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  7.  
  8. <script type="text/javascript">
  9. //<![CDATA[
  10. function recargar(){
  11. location.reload(true);
  12. }
  13. function mensaje(texto){
  14.     if(texto == 'ok'){
  15. setTimeout('recargar()', 1500);
  16.     }else{
  17. document.getElementById('mensaje').innerHTML = texto;
  18. }
  19. }
  20. //]]>
  21. </script>
  22. </head>
  23. <body>
  24.     <p>
  25.     <?php echo time(); ?>
  26. </p>
  27. <form action="genera.php" target="genera" method="post" id="fperfil">
  28. <p>
  29. <input type="text" value="" name="perfil" /> <input type="submit" value="generar perfil"  onsubmit="this.form.reset();"/>
  30. </p>
  31. </form>
  32. <div id="mensaje">
  33.     <!-- fix -->
  34. </div>
  35. <iframe src="about:blank" name="genera" id="genera" width="0" height="0" frameborder="0"></iframe>
  36. </body>
  37. </html>

genera.php
Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <title>titulo</title>
  6. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  7. </head>
  8. <body>
  9. <?php
  10. $datos = $_POST['perfil'];
  11. $crearcvs = file_put_contents("temp.csv",$datos,LOCK_EX);
  12. if($crearcvs !== false){
  13.     ?>
  14. <script type="text/javascript">
  15. //<![CDATA[
  16. /* script */
  17. parent.mensaje('ok');
  18. window.location.href = 'temp.csv';
  19. //]]>
  20. </script>
  21.  
  22. <?php
  23. }else{
  24. ?>
  25.     <script type="text/javascript">
  26. //<![CDATA[
  27. /* script */
  28. parent.mensaje('error');
  29. //]]>
  30. </script>
  31. <?php
  32. }
  33.  
  34. ?>
  35. </body>
  36. </html>

Demo
http://foros.emprear.com/php/perfil/perfil.php

la probé en todos y funciona
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #6 (permalink)  
Antiguo 25/10/2012, 06:23
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 15 años, 8 meses
Puntos: 26
Respuesta: Recargar página tras envío exitoso de formulario.

Emprear, gracias por todo el tiempo brindado. Te comento.
Agregue el iframe en perfiles.php y el target del formulario apunta al name del iframe.
En la última parte del script PHP coloco:
Código PHP:
Ver original
  1. /*...  SCRIPT ... */
  2. ?>
  3. <script language="javascript">
  4.     parent.location.reload(true);
  5. </script>
Pero perfiles.php no se refresca (he puesto time() para corroborarlo).
  #7 (permalink)  
Antiguo 25/10/2012, 06:29
Avatar de ramiro_md  
Fecha de Ingreso: septiembre-2008
Mensajes: 274
Antigüedad: 15 años, 8 meses
Puntos: 26
Respuesta: Recargar página tras envío exitoso de formulario.

A ver, ahora intenté esto y tampoco va:

Perfiles.php
Código HTML:
Ver original
  1. <script language="javascript">
  2.             function recarga(){
  3.                 location.reload();
  4.             }
  5.         </script>
  6.  
  7. <!-- Sigue el código HTML .... -->
  8.  
  9. <form id="exportPerfil" target="genera" method="POST" action="Bin/exportPerfil.php">
  10.         <!-- Submit -->
  11.         <div class="line_grid">
  12.             <div class="g_3"><span class="label">Iniciar exportaci&oacute;n</span></div>
  13.             <div class="g_9">
  14.                 <input type="submit" value="Exportar" class="submitIt simple_buttons"/>
  15.             </div>
  16.         </div>
  17.     </form>
  18.  
  19. <iframe src="about:blank" name="genera" width="0" height="0"></iframe>

El script PHP sigue igual, solo que agregué al final:
Código Javascript:
Ver original
  1. <script language="javascript">
  2.     parent.recarga();
  3. </script>
  #8 (permalink)  
Antiguo 25/10/2012, 07:09
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Recargar página tras envío exitoso de formulario.

Mirá, yo lo estoy probando en mi server y funciona correctamente´(firefox/chrome/IE).
La unica pequeña diferencia que encuentro es que en IE hasta que el usuario no le da a la opción de abrir o guardar en la descarga, la página no se refresca, incluso le agregué una sesión para generar el mensaje, te pongo los archivos en un zip para que los analices y los pruebes, recordá que el directorio dónde guardes tus csv tiene que tener permisos 0777


http://foros.emprear.com/php/perfil/perfil.zip
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #9 (permalink)  
Antiguo 25/10/2012, 07:34
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Recargar página tras envío exitoso de formulario.

-Post equivocado-

Última edición por marlanga; 25/10/2012 a las 07:42
  #10 (permalink)  
Antiguo 25/10/2012, 07:56
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Recargar página tras envío exitoso de formulario.

Cita:
Iniciado por marlanga Ver Mensaje
Envía el formulario por AJAX, y cuando ajax responda, con un location.href recargas la página
.??????
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: formulario, funcion, js, página, php, tras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:44.