G3W2: Link a PDF

Hola todos!!
Estamos necesitando agregar en el default.twig correspondiente a /operaciones/acceso/login, un link a un Instructivo (archivo .pdf).
{{ ‘Instructivo Ingreso G3W’|trans }}
Deberíamos crear un vínculo?
Gracias por su tiempo.
ANA - UNNOBA

Hola Ana! Sí, deberían crear un vínculo para poder descargar el archivo.
Fijate si éste post te sirve, explica un caso muy similar.
Sino avisanos.
Saludos!!

Juliana:
Seguí el instructivo del post que me decis, y me dá error, dice que el archivo no existe.
La función en el controlador.php es:
function accion__descargar_pdf(){
$path_nombre = “operaciones/acceso/INSTRUCTIVO INGRESO G3W.pdf”;
$this->descargar_archivo($path_nombre, ‘nombre_de_descarga.pdf’);
}
Dónde debería estar el pdf?

Gracias por tu tiempo.

ANA -UNNOBA

Hola Ana, bien como dijo Juliana habria que seguir el siguiente post pero con algunas modificaciones:

  1. Guardar ese pdf en la carpeta www dentro de la personalización (ej: src/pers/NOMBRE_PERS/www/pdf/instructivo.pdf)

  2. Personalizar el twig, agregando el link: operaciones/acceso/contenido_login/default.twig. Por ejemplo:


{% extends "kernel/pagelet.twig" %}
{% block contenido %}    
	<h2>SIU Guaraní</h2>
	{{"texto_portada"|trans|raw}}
	<a href='{{ this.data.url_descargar_pdf }}' class="no-ajax">{{ 'Descargar PDF'|trans }}</a>
{% endblock %}

NOTA: la clase “no-ajax” hace que la petición de descarga NO se haga vía AJAX (de lo contrario da error).

  1. Personalizar el pagelet para indicar la url del link: operaciones/acceso/pagelet_contenido_login.php. Por ejemplo:

...
function prepare()
    {
        parent::prepare();

        $this->data['url_descargar_pdf'] = kernel::vinculador()->crear('acceso', 'descargar_pdf');
    }
...

  1. Personalizar el controlador, agregando la acción para descargar el pdf. Allí, se puede usar la función del Kernel ‘descargar_archivo’ con la ruta del pdf. operaciones/acceso/controlador.php. Por ejemplo:

function accion__descargar_pdf(){
        $path_nombre = kernel::localizador()->path_recurso("www/pdf/instructivo.pdf");
        $this->descargar_archivo($path_nombre, 'nombre_de_descarga.pdf');
    }

Probalo y avísanos cualquier cosa!

OK. Funciona.
Si quiero ver el pdf en otra ventana, no descargarlo? No necesitaría el vínculo entiendo. ¿Dónde debería estar el archivo .pdf?
Gracias por tu tiempo.
ANA

Hola, no se puede acceder al archivo .pdf directamente con un link (si se puede a los css, js e imágenes), para hacer lo que decis vos tenes que hacer lo siguiente:

  1. En operaciones/acceso/contenido_login/default.twig para que te lo abra en otra ventana agrega el atributo target=“_blank” al link:

<a href='{{ this.data.url_descargar_pdf }}' class="no-ajax" target="_blank">{{ 'Descargar PDF'|trans }}</a>

  1. luego vas a tener que agregar un nuevo método en el archivo src/siu/lib/kernel/nucleo/controlador.php:

    /**
     * Muestra el contenido del archivo $path en una ventana del navegador,
     * si no se setea $nombre_descarga entonces se usa PATHINFO_BASENAME del $path
     * como nombre de la descarga.
     * Después de mostrar el archivo finaliza el request porque ya se enviaron los
     * headers y no se puede enviar nada más al cliente.
     * @param string $path el path del archivo a mostrar
     * @param string $nombre_descarga el nombre con el que se va a descargar el
     * archivo
     * @throws error_kernel si el archivo no existe
     */
    protected function mostrar_archivo($path, $nombre_descarga = false)
    {
        if (!file_exists($path)) {
            throw new error_kernel("El archivo '$path' no existe");
        }

        if ($nombre_descarga === false) {
            $nombre_descarga = pathinfo($path, PATHINFO_BASENAME);
        }

        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime_type = finfo_file($finfo, $path);
        finfo_close($finfo);

        //http://yogeshchaugule.com/blog/2013/how-display-pdf-browser-php
        header('Content-type: '.$mime_type);
        header('Content-Disposition: inline; filename="' . $nombre_descarga . '"');
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . filesize($path));
        header('Accept-Ranges: bytes');
        @readfile($path);

        $this->finalizar_request();
    }

NOTA: Este nuevo método lo acabo de agregar y ya va a salir en las próximas versiones del 3W.

  1. y luego en el archivo operaciones/acceso/controlador.php modifica la función accion__descargar_pdf llamando a esta nueva función:

function accion__descargar_pdf(){
        $path_nombre = kernel::localizador()->path_recurso("www/pdf/instructivo.pdf");
        $this->mostrar_archivo($path_nombre, 'nombre_de_descarga.pdf');
    }

Probalo y avísanos cualquier cosa!