Hola! en la base de datos tengo tuplas que contienen un campo byteA.
Este dato es un PDF.
Muestro los datos de la tabla y si ese campo no se nulo en el cuadro detallado muestro un botón.
Al presionar ese botón debería poder verse en una pestaña o ventana extra el PDF asociado a dicha tupla.
Para una sola tupla en particular, pude realizar esta tarea, mostrando un enlace a la url del pdf que se crea al editar el registro en un formulario:
$datos = $this->get_relacion()->tabla('docentes')->get();
$pdf = $this->get_relacion()->tabla('docentes')->get_blob('cv');
if (isset($pdf)) {
manipulacion_pdf::crear_archivo_temporal_pdf($this->s__temp_archivo_pdf, $pdf);
$datos['cv'] = "<a href='{$this->s__temp_archivo_pdf['url']}' target='_blank'>PDF Asociado</a>";
} else {
$datos['cv'] = null;
}
$form->set_datos($datos);
Este código funciona.
Por otro lado, al intentar algo similar en el botón de cuadro, no he podido hacerlo:
function evt__cuadro__pdf_asociado ($seleccion)
{
$this->dep('ordenanzas')->cargar($seleccion);
$pdf = $this->dep('ordenanzas')->get_blob('pdf');
if (isset($pdf)) {
$pdf_temp = manipulacion_pdf::crear_archivo_temporal_pdf($this->s__temp_archivo_pdf, $pdf);
if (isset($this->s__temp_archivo_pdf)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($this->s__temp_archivo_pdf['path']));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($this->s__temp_archivo_pdf['path']));
ob_clean();
flush();
readfile($this->s__temp_archivo_pdf['path']);
exit();
}
}
}
No funciona, mostrando basura en la página.
Sin embargo, el PDF se descarga correctamente en la carpeta www/temp.
He probado con:
header("Content-Type: application/force-download");
header('Content-Disposition: attachment;
filename="'.basename($this->s__temp_archivo_pdf['path']));
header("Content-Transfer-Encoding: binary");
header('Cache-Control: private');
header('Pragma: no-cache');
header('Expires: 0');
readfile($this->s__temp_archivo_pdf['path']);
o con:
header("Content-Type: application/pdf");
obteniendo siempre el mismo resultado.
He querido probar de hacer un intermedio entre las 2 alternativas y que el botón simule un click en un enlace con algo como
toba::vinculador()->navegar_a({proyecto}, $this->s__temp_archivo_pdf['url']);
obligandolo a navegar a una página en blanco con el PDF como contenido, ya que creo sería la solución ideal, pero no he podido obtener ningún resultado.
Alguna idea?