Generación de PDF en G3W2

Para generar un pdf en G3W2 tomaremos como ejemplo la operación “Historia académica”, iniciamos sesión con un alumno y luego vamos al menú Reportes->Historia académica. Una vez que estamos en dicha operación vamos a ver en la parte superior derecha de la pantalla el botón de “Generar pdf”.

/src/siu/operaciones/historia_academica/info_historia/pagelet_info_historia.js


$(id).on('click', '#pdf_btn',function (){
    exp_pdf();
});

function exp_pdf() {
    var checkboxes = kernel.renderer.pagelet('menu_filtros').get_params_filtro();
    window.open(info.url_pdf+'/?checks='+checkboxes+'&modo='+get_modo()+'&param_modo='+get_param_modo());				
}

Al hacer click en dicho botón se ejecuta el evento click de ese boton como se ve en las primeras lineas, ese evento lo que hace es llamar a la funcion javascript exp_pdf() la cual abre una nueva ventana en el navegador que nos lleva a la operación /historia_academica/exportar_pdf.

Si abrimos el archivo /src/siu/operaciones/historia_academica/controlador.php y vamos a la función accion__exportar_pdf() vamos a ver como se genera un pdf:

tener en cuenta de agregar el use del generador de pdf:

use siu\operaciones\_comun\operaciones\reporte\generador_pdf; 

y de configurar las propiedades del pdf:


        protected $pdf_hoja = "A4";
	protected $pdf_encabezado = array("", "");
	protected $pdf_encabezado_img = array("img" => "", "width" => "");
	protected $pdf_fuente = 10;
	protected $pdf_fuente_texto = 10;
	protected $pdf_fuente_titulo = 10;
	protected $pdf_fuente_subtitulo = 10;
       

Hay dos funciones importantes para agregar contenido al pdf, ellas son:


$pdf->agregar_tabla($datos, $columnas, $titulo);
$pdf->agregar_texto($texto);

Hola, esto va para la personalización del reporte “Mis inscripciones” de la Universidad de Córdoba:

Al hacer click en el botón de “Imprimir PDF” nos lleva a la operación accion__pdf_parciales() del controlador /src/pers/cordoba/operaciones/inscripciones/controlador.php. Para generar el PDF vamos a tomar como ejemplo la operación accion__exportar_pdf() del controlador /src/siu/operaciones/historia_academica/controlador.php.

cosas que faltarían en /src/pers/cordoba/operaciones/inscripciones/controlador.php:

hay que agregar un “use” para cargar la clase que genera los PDFs:


use siu\operaciones\_comun\operaciones\reporte\generador_pdf;

Hay que configurar el PDF a generar:


class controlador extends controlador_g3w2
{
	protected $pdf_hoja = "A4";
	protected $pdf_encabezado = array("", "");
	protected $pdf_encabezado_img = array("img" => "", "width" => "");
	protected $pdf_fuente = 10;
	protected $pdf_fuente_texto = 10;
	protected $pdf_fuente_titulo = 10;
	protected $pdf_fuente_subtitulo = 10;
        ......

luego tomar como ejemplo lo que se esta haciendo en la operación accion__exportar_pdf() del controlador /src/siu/operaciones/historia_academica/controlador.php y aplicarlo a la operación accion__pdf_parciales() del controlador /src/pers/cordoba/operaciones/inscripciones/controlador.php:

Código que genera el PDF:


                $pdf = new generador_pdf($this->crear_ezpdf());
		$pdf->set_font($this->pdf_fuente);
		$pdf->set_options(array('showHeadings'=>1, 'protectRows' => 1, 'maxWidth' => 500, 'width' => 800, 'fontSize' => $this->pdf_fuente_texto, 'shadeCol' => array(0.8,0.8,0.8),'cols' => array()));
		$pdf->set_text_options(array('left'=>5, 'top' => 20, 'maxWidth' => 800, 'width' => 500));
		$pdf->set_pdf_fuente_texto($this->pdf_fuente_texto);
		$pdf->set_pdf_fuente_titulo($this->pdf_fuente_titulo);
		$pdf->set_pdf_fuente_subtitulo($this->pdf_fuente_subtitulo);
		$pdf->set_nombre_archivo('historia_academica');

		$alumno = guarani::persona()->get_nombre();
		$datos_carrera = guarani::persona()->get_info_carrera_activa();
		$nombre_carrera = "";
		if (isset($datos_carrera)){
			$nombre_carrera = $datos_carrera['nombre'];
		}

		$logo = kernel::localizador()->encontrar_img('www/img','logo.png');
		
		$this->pdf_encabezado = array('HISTORIA ACADÉMICA', 'Carrera: '.$nombre_carrera.PHP_EOL.'Alumno: '.$alumno, 112);
		$this->pdf_encabezado_img = array('img'=>$logo['path'],'width' => '100');

		$pdf->set_encabezado($this->pdf_encabezado[0], $this->pdf_encabezado[1], $this->pdf_encabezado[2]);
		$pdf->set_encabezado_img($this->pdf_encabezado_img["img"], $this->pdf_encabezado_img["width"]);

		$titulos = $this->get_columnas($modo);
		$pdf->agregar_tabla($datos, $titulos, '');
		$pdf->generar();		

Importante, no olvidarse de implementar este método en el controlador:


        protected function crear_ezpdf(){
		$instancia = new \Cezpdf($this->pdf_hoja, 'landscape');
		return $instancia;
	}

espero que les sirva, saludos.

Otro detalle, si se fijan en la tabla de Cursadas el encabezado de la ultima columna dice “Mis_inscripciones.certificado”, para corregir eso ir la archivo /src/pers/cordoba/mensajes/mensajes.es.php y agregar la siguiente linea:

'mis_inscripciones.certificado' => "certificado",

Luego van a ver que “Mis_inscripciones.certificado” es reemplazado por “Certificado”.

Recuerden que los textos nuevos que agreguen al proyecto vas siempre en la personalización (/src/pers/cordoba/mensajes/mensajes.es.php), si lo ponen en /src/siu/mensajes/mensajes.es.php al actualizar de versión se perderán todos los mensajes personalizados.

Espero que les haya servido, saludos.

Hola!
Con estas indicaciones nuestra personalización funcionó perfectamente. Gracias!

Ahora queremos crear un nuevo método “deja_espacios” dentro de la clase “generador_pdf” y si copiamos la estructura dentro de nuestra carpeta de personalizaciones no lo llama. Es porque está en la carpeta _comun ?

Por el momento la agregamos dentro de la estructura del siu, pero necesitariamos que nos indiques como hacer esto.

El código es muy simple:


public function deja_espacios($Val)
{
	$this->instancia->ezSetDY($Val);
}

Saludos,
Flavia

Hola Flavia, como esa personalización que desean hacer resulta útil para otras Universidades la vamos agregar en la clase /src/siu/operaciones/_comun/operaciones/reporte/generador_pdf.php, simplemente agreguen el método al final de dicha clase (lo probé y así como esta funciona bien). Igualmente abajo les voy a explicar como seria para personalizarla, pero en este caso lo único que va a hacer es agregar el método a la clase del SIU y listo.

El método agréguenlo de la siguiente manera:


    public function dejar_espacio($espacio)
    {
        $this->instancia->ezSetDY($espacio);
    }

luego cambiar cuando lo llaman en el controlador.

Saludos, Leonel.

Esto que les voy a poner ahora no es para que lo hagan (ver respuesta de arriba), es para que tengan un ejemplo de como personalizar una clase (en este caso la clase /src/siu/operaciones/_comun/operaciones/reporte/generador_pdf.php):

Primero, hay que replicar la clase en la carpeta de personalizaciones, en este caso habría que crear la siguiente estructura de carpetas /src/pers/cordoba/operaciones/_comun/operaciones/reporte/generador_pdf.php, dicha clase personalizada debe contener el siguiente código:


<?php
namespace cordoba\operaciones\_comun\operaciones\reporte;

class generador_pdf extends \siu\operaciones\_comun\operaciones\reporte\generador_pdf{

    public function deja_espacios($Val)
    {
        $this->instancia->ezSetDY($Val);
    }

}

Si observan hay que ponerle un namespace acorde a la ubicacion de la clase:

namespace cordoba\operaciones\_comun\operaciones\reporte;

y que la clase personalizada herede de la clase base:

class generador_pdf extends \siu\operaciones\_comun\operaciones\reporte\generador_pdf{

luego se pueden agregar y/o sobrescribir métodos a la clase base.

por ultimo en /src/pers/cordoba/operaciones/inscripciones/controlador.php arriba de todo en vez de utilizar:

use siu\operaciones\_comun\operaciones\reporte\generador_pdf;

usamos:

use cordoba\operaciones\_comun\operaciones\reporte\generador_pdf;

Notas: en este caso en particular por error todos los atributos de la clase /src/siu/operaciones/_comun/operaciones/reporte/generador_pdf.php esta como private lo cual no permite la herencia, ahora vamos a cambiarlos para que sean protected.

espero que les haya servido, saludos.