HUFERSIL.WEBDEVELOPER

Lumine e TCPDF

Em vários projetos que participo, uma das coisas mais solicitadas são relatórios gerenciais. Em sua grande maioria, são solicitados em 3 formatos: HTML, PDF e Excel.

Vamos analisar como fazer os dois últimos: PDF e Excel. Neste post, estudaremos PDF, e em um post futuro, sobre Excel.

Para começar, baixe as versões mais recentes de Lumine e da biblioteca TCPDF. O banco de dados que vamos utilizar será o MySQL 5.

Iremos trabalhar com uma estrutura de relatórios de funcionários e departamentos. Abaixo estão as SQL’s para criar as tabelas necessárias:

CREATE TABLE  `departamento` (
  `id_departamento` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id_departamento`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

CREATE TABLE  `funcionario` (
  `id_funcionario` int(11) NOT NULL AUTO_INCREMENT,
  `id_departamento` int(11) NOT NULL,
  `nome` varchar(200) DEFAULT NULL,
  `data_nascimento` date DEFAULT NULL,
  `rg` varchar(12) DEFAULT NULL,
  `cpf` varchar(11) DEFAULT NULL,
  PRIMARY KEY (`id_funcionario`),
  KEY `id_departamento` (`id_departamento`),
  CONSTRAINT `funcionario_ibfk_1` FOREIGN KEY (`id_departamento`) REFERENCES `departamento` (`id_departamento`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=latin1;

Depois de criar as tabelas no banco, você poderá criar as classes de Lumine a partir da engenharia reversa. Preencha os dados conforme sua necessidade e clique em "gerar classes", na aba "tabelas":

Depois, abra a pasta onde você selecionou para ser seu projeto, crie um arquivo de inicialização semelhante ao abaixo:

<?php

// altera o timezone padrao
date_default_timezone_set('America/Sao_Paulo');
// carrega as configuracoes de lumine
require_once 'lumine-conf.php';
// carrega a biblioteca Lumine
require_once 'lumine/Lumine.php';
// carrega a biblioteca TCPDF
require_once 'tcpdf/tcpdf.php';

// inicializa lumine
$cfg = new Lumine_Configuration($lumineConfig);

// registra lumine para fechar a conexao quando terminar o script
register_shutdown_function(array($cfg->getConnection(),'close'));
// registra lumine para auto importar as classes quando nao estiverem carregadas
spl_autoload_register(array('Lumine', 'import'));

Este será o arquivo que vamos carregar sempre que quisermos utilizar em outras partes do projeto, pois ele já irá trazer todas as configurações necessárias para que possamos efetuar as tarefas que precisamos. Salve este arquivo com o nome de "config.php" na mesma pasta que o arquivo "lumine-conf.php", que foi gerado pela engenharia reversa.

Para geramos o PDF, vamos dividir o arquivo PHP em duas partes: a primeira, irá fazer a consulta no banco de dados, recuperar o resultado em HTML (que será gerado pelo segundo arquivo) e gerar o PDF utilizando a TCPDF. Separando desta forma, fica mais fácil para darmos manutenção em nosso arquivo que será o responsável por gerar o PDF.

Parte 1 – Arquivo "report.php"

<?php

require_once 'config.php';

// instanciamos as classes
$funcionario = new Funcionario();
$dep = new Departamento();

// mudamos o alias de funcionario
$funcionario->alias('f')
	// unimos com departamento
	->join($dep,'inner','d')
	// selecionamos somente os campos de funcionario
	->selectAs()
	// adicionamos na selecao o nome do departamento
	->select('d.nome as departamento')
	// ordem dos resultados
	->order('d.nome, f.nome')
	// efetuamos a consulta
	->find();

// colocamos o resultado em um array
$result = $funcionario->allToArray();

// evitamos que qualquer saida va para o browser
ob_start();
// incluindo o HTML do relatorio
include 'report_result.php';
// pegamos o conteudo do buffer e limpamos
$html = ob_get_clean();
// encerramos e limpamos o buffer
ob_end_clean();

// inicia a classe de PDF
$pdf = new TCPDF('L');
// adicionamos uma pagina
$pdf->AddPage();
// escrevemos o html
$pdf->writeHTML($html);
// enviamos o PDF
$pdf->Output('relatorio.pdf','I');

Como é possível notar, simplesmente executamos nesta primeira parte um script em PHP. Na segunda, iremos mesclar o PHP com HTML, porém neste segundo teremos somente códigos para gerar o conteúdo dinâmico, como aplicamos normalmente as páginas:

Parte 2 – Arquivo "report_result.php"

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
<?php
// estilos que serão usados nas tags TD
$style = 'style="font-size: 7pt"';
?>
<table width="100%" border="0" cellspacing="1" cellpadding="2">
  <tr>
    <td <?php echo $style; ?> width="6%" bgcolor="#CCCCCC"><strong>Código</strong></td>
    <td <?php echo $style; ?> width="35%" bgcolor="#CCCCCC"><strong>Funcionário</strong></td>
    <td <?php echo $style; ?> width="17%" bgcolor="#CCCCCC"><strong>Departamento</strong></td>
    <td width="14%" align="center" bgcolor="#CCCCCC" <?php echo $style; ?>><strong>RG</strong></td>
    <td width="13%" align="center" bgcolor="#CCCCCC" <?php echo $style; ?>><strong>CPF</strong></td>
    <td width="15%" align="center" bgcolor="#CCCCCC" <?php echo $style; ?>><strong>Data de nascimento</strong></td>
  </tr>
  <?php
  // cor da linha
  $cor = '';
  // para cada item do resultado
  foreach($result as $item):
    // mudamos a cor para fazer zebrado
  	$cor = $cor == '#EFEFEF' ? '#FFFFFF' : '#EFEFEF';
  ?>
  <tr>
    <td <?php echo $style; ?> width="6%" bgcolor="<?php echo $cor; ?>"><?php echo $item['idFuncionario']; ?></td>
    <td <?php echo $style; ?> width="35%" bgcolor="<?php echo $cor; ?>"><?php echo $item['nome']; ?></td>
    <td <?php echo $style; ?> width="17%" bgcolor="<?php echo $cor; ?>"><?php echo $item['departamento']; ?></td>
    <td width="14%" align="center" bgcolor="<?php echo $cor; ?>" <?php echo $style; ?>><?php echo $item['rg']; ?></td>
    <td width="13%" align="center" bgcolor="<?php echo $cor; ?>" <?php echo $style; ?>><?php echo $item['cpf']; ?></td>
    <td width="15%" align="center" bgcolor="<?php echo $cor; ?>" <?php echo $style; ?>><?php echo date('d/m/Y', strtotime($item['dataNascimento'])); ?></td>
  </tr>
  <?php endforeach; ?>
</table>
</body>
</html>

Acesse o arquivo "report.php" via URL para ver o resultado!

Para baixar os arquivos, acesse a seção de exemplos.

@braços e fique com Deus!

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">