Exportacion de un archivo de texto

Buenos dias,
Les escribo para realizarles la siguiente consulta. Tenemos implementada una operación que realiza la importación de un archivo, muestra algunos de los campos del mismo; y por ultimo mediante el botón Exportar permite generar otro archivo de texto que toma el importado y le realiza ciertas modificaciones. Ahora, si bien genera el archivo correspondiente y con el formato correcto, no se despliega la ventana de descarga con el siguiente codigo dentro del botón exportar:
function escribirHaberes(){
$header = toba::consulta_php(‘consultasGeneracionDeDatos’)->mostrarHeader();
$detalle = toba::consulta_php(‘consultasGeneracionDeDatos’)->mostrarDetalle();
$foot = toba::consulta_php(‘consultasGeneracionDeDatos’)->mostrarFoot();
$haberesTxt = ‘’;
foreach($header as $headerHaberes){
foreach($headerHaberes as $valor=>$campo){
$haberesTxt.= $headerHaberes[$valor];
}
$haberesTxt.=“\r\n”; //\r = return \n = new line
}

        foreach($detalle as $detallePorAgente){
            foreach($detallePorAgente as $valor=>$campo){  
                $haberesTxt.= $detallePorAgente[$valor];  
            }
            $haberesTxt.="\r\n"; 
        }    
        foreach($foot as $footHaberes){              
            foreach($footHaberes as $valor=>$campo){          
                $haberesTxt.= $footHaberes[$valor]; 
            }
            $haberesTxt.="\r\n"; 
        }                                              
        return $haberesTxt;
    }  //Fin de funcion escribirHaberes
    
    $pathHaberes['path']='/var/www/proyectos/toba_2.5.0/proyectos/myExport/downloads/HABERES.txt'; 
    $haberes = $pathHaberes['path'];       
    $fp = fopen($haberes,'w');
    fwrite($fp,escribirHaberes());
    fclose($fp);
    
    if(is_readable($haberes)){ 
        header('Content-Description: Descarga HABERES.txt');
        header('Content-Type: application/x-force-download');
        header('Content-Disposition: attachment; filename='.basename($haberes));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($haberes));
        ob_clean();  
        flush(); 
        readfile($haberes); 
        exit;
    }

Lo que hace es mostrar en pantalla lo adjuntado en el archivo UNPA_RESULTADO DE EXPORTACION DE TXT.png

Ahora bien para lograr que aparezca la ventana de descarga una alternativa fue:

  1. Se creo una nueva operación llamada por ejemplo: generar_txt. En la ficha propiedades básicas, en el desplegable Modelo Página, se elegió la opción “Ninguna - Sin salida”.
  2. Se creo un ci para esta operación.
  3. En el el método conf__pant_inicial del ci se copió el código del botón evt__ciExportar() .
  4. Se quitó el código del botón evt__ciExportar().
  5. A través de toba editor, se configuraron las propiedades del botón evt__ciExportar() de la siguiente manera:

En acción predefinida se seleccionó Vinculo.
En vinculo carpeta se seleccionó la carpeta donde está la operación generar_txt.
en vinculo ítem se seleccionó la operación generar_txt.
en Vinculo celda de memoria se ingresó un nombre cualquiera, por ejemplo ope_txt.

Y de esta forma anduvo. La consulta es: ¿existe una manera más sencilla de realizar la exportación de un archivo de texto?

Desde ya muchas gracias

Saludos
Paola
Universidad Nacional de la Patagonia Austral


UNPA_RESULTADO DE EXPORTACION DE TXT.png

UNPA_RESULTADO DE EXPORTACION DE TXT.png

Hola Paola,

la respuesta es SI y NO, dependiendo de lo que quieras hacer.

La razon por la que no te funciona el primer caso, es porque la operacion seguramente tiene un tipo de pagina que es distinto a ‘Sin Salida’ y por lo tanto para cuando vos envias los headers, los mismos ya se enviaron hace rato. Por ello mismo te funciono cuando lo sacaste por medio de otra operacion que tenia un tipo de pagina distinto.

Ahora bien, si lo que queres es hacer todo en la misma operacion… lo que tenes que hacer, es configurar el evento Exportar como un autovinculo y le especificas un Servicio, estos ultimos no envian los headers anticipadamente.

Entonces la generacion del archivo de texto la haces dentro de un metodo servicio__xxxx en el Ci, que seria el listener para el servicio particular que le pusiste al evento.

Saludos