SlideShare uma empresa Scribd logo
Criando relatórios com PHP - PHP Conference Brasil 2013
Roteiro
●

Introdução
–

Apresentação;

–

Bibliotecas para relatórios:
●

–

Bibliotecas para gráficos:
●

–

JPGraph, pChart;

Desacoplamento:
●

–

XLS, PDF, RTF;

A importância de desacoplar;

Implementação:
●

Strategy para relatórios;

●

Bridge para gráficos.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#2
Apresentação
●

Clipper (1994-1998): comercial, bibliotecas, funções;

●

Delphi (1998-1999): automação, componentes;

●

PHP (2000): SAGU (php+html+sql)

●

PHP-GTK(2001): PHP só com classes;

●

Agata Report (2001-2006);

●

Design Patterns (2004): Aprendizado na Unisinos;

●

PHP: Criando Aplicações Gráficas com PHP (2004);

●

PHP: Programando com Orientação a Objetos (2007);

●

Criando Relatórios com PHP (2011);

●

Adianti Framework para PHP (2012).
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#3
Objetivo
●

O que não queremos:
–
–

●

Não queremos mini-curso de geração de relatórios;
Provavelmente a maioria já conhece bem uma
biblioteca;

O que queremos:
–

Explorar várias bibliotecas e suas principais
características;

–

Analisar boas formas de integrá-las em nossa aplicação;

–

Estudar padrões de projeto que podem ser utilizados
para isso.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#4
Bibliotecas para relatórios
Relatórios em XLS
●

Bom para:
–
–

●

Relatórios tabulares (linhas, colunas);
Permite formatações, totalizações.

Spreadsheet Writer (304 Kb):
–
–

Pequeno, funciona bem, mas sem novos releases;

–
●

http://pear.php.net/package/Spreadsheet_Excel_Writer
Depende do pacote OLE, não gera XLSX (só XLS - BIFF).

PHPExcel (4.3 Mb):
–

http://phpexcel.codeplex.com

–

Bastante ativo, maior, com muitas funcionalidades;

–

Trabalha com Open XML (XLSX).

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#6
Relatórios em XLS
<?php
require_once 'Spreadsheet/Excel/Writer.php';
$workbook = new Spreadsheet_Excel_Writer('test.xls');
// Cria uma planilha
$worksheet = $workbook->addWorksheet('My first worksheet');
// escreve os dados
$worksheet->write(0,
$worksheet->write(0,
$worksheet->write(1,
$worksheet->write(1,
$worksheet->write(2,
$worksheet->write(2,
$worksheet->write(3,
$worksheet->write(3,

0,
1,
0,
1,
0,
1,
0,
1,

'Nome');
'Idade');
'Maria');
30);
'Joao');
31);
'Mariana');
32);

// Finaliza, gravando
$workbook->close();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#7
Relatórios em XLS
<?php
require_once 'Spreadsheet/Excel/Writer.php';
$workbook = new Spreadsheet_Excel_Writer('test2.xls');
$formato_bold = $workbook->addFormat();
$formato_bold->setBold();
$formato_title = $workbook->addFormat();
$formato_title->setBold();
$formato_title->setColor('white');
$formato_title->setPattern(1);
$formato_title->setFgColor('gray');
$worksheet = $workbook->addWorksheet();
$worksheet->write(0, 0, "Titulo",
$formato_title);
$worksheet->write(1, 0, "Coluna 1", $formato_bold);
$worksheet->write(1, 1, "Coluna 2", $formato_bold);
$workbook->close();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#8
Relatórios em PDF
●

Bom para:
–
–

Documentos (NFE, atestados, diplomas);

–
●

Quase qualquer coisa, relatórios tabulares;
Posicionamento fixo dos objetos.

FPDF (46k fpdf.php):
–

●

TCPDF (864k tcpdf.php):
–

●

http://www.fpdf.org (Bom, pequena, mas não ativa);
http://www.tcpdf.org/ (Ativa, Grande, milhões de
funcionalidades, baseada na FPDF, chars, codabar, forms);

MPDF (1.3 Mb mpdf.php):
–

http://www.mpdf1.com/ (Ativa, Grande, Gera PDF baseado
em HTML, boa com tables e formatações, FPDF based);

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#9
Relatórios em PDF
<?php
require('fpdf/fpdf.php');
$pdf = new FPDF('P', 'pt', 'A4');
$pdf->AddPage();
$pdf->SetFont('Courier', 'B', 16);
$pdf->SetTextColor(50, 50, 100);
$pdf->SetY(70);
$pdf->SetX(260);
// não desloca o cursor
$pdf->Write(30, 'Titulo');
$pdf->Ln(30); // Espaçamento
$txt = str_repeat('write ', 30);
$pdf->SetX(200);
// altera a posição X
$pdf->SetTextColor(100, 50, 50); // tom de vermelho
$pdf->SetFont('Times', 'B', 14);
$pdf->Write(20, $txt);
$pdf->Output('test.pdf');
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#10
Relatórios em PDF
<?php
require('fpdf/fpdf.php');
$pdf = new FPDF('P', 'pt', 'A4');
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(510, 20, 'Titulo com borda', 1, 1, 'C');
$pdf->Ln(20);
$pdf->SetFillColor(255,120,120);
$pdf->Cell(170, 30,'Alinhado a esquerda', 1, 0, 'L', TRUE);
$pdf->SetFillColor(170,255,120);
$pdf->Cell(170, 30,'Alinhado ao centro', 1, 0, 'C', TRUE);
$pdf->SetFillColor(100,100,255);
$pdf->Cell(170, 30,'Alinhado a direita', 1, 1, 'R', TRUE);
$pdf->Output('test2.pdf');
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#11
Relatórios em RTF
●

Bom para:
–
–

Documentos editáveis (contratos, cartas);

–

Trabalha com escrita de elementos de texto e tabelas;

–
●

Relatórios tabulares;

Abre bem no Word e LibreOffice.

PhpRtfLite(372 Kb):
–

sf.net/projects/phprtf/

–

Pequeno;

–

Funciona bem;

–

Ativa.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#12
Relatórios em RTF
<?php
require 'PHPRtfLite/lib/PHPRtfLite.php';
PHPRtfLite::registerAutoloader();
$rtf = new PHPRtfLite;
$secao = $rtf->addSection(); // adiciona seção
$fontTitulo = new PHPRtfLite_Font(16, 'Arial');
$fontTitulo->setBold();
$fontTitulo->setUnderline();
$secao->writeText('Título', $fontTitulo,
new PHPRtfLite_ParFormat('center'));

$texto = 'Texto c/<b>negrito</b>,<i>italico</i>, <u>sublinhado</u>. ';
$secao->writeText(str_repeat($texto, 12),
new PHPRtfLite_Font(12),
new PHPRtfLite_ParFormat('justify'));
$rtf->save('test.rtf');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#13
Relatórios em RTF

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#14
Relatórios em RTF
<?php
require '...';
$dados
= array();
$dados[] = array( 1, 'Brazil', 'Ayrton Senna', 90);
$dados[] = array( 2, 'France', 'Alain Prost', 87);
// ...
$rtf = new PHPRtfLite;
$table = $rtf->addSection()->addTable();
$table->addColumn(3); // larguras
$table->addColumn(5);
// ...
$row = 1;
foreach($dados as $linha) {
$table->addRow(0.5); $col = 1;
foreach ($linha as $coluna) {
$table->writeToCell($row, $col, $coluna, $fonte, ...);
$col++;
}
$row ++;
}
$rtf->save('test2.rtf');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#15
Relatórios em RTF

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#16
Bibliotecas para gráficos
Gráficos
●

Algumas opções:
–

JpGraph (http://jpgraph.net/) - não ativa;
●

●

–

325Kb para gráfico de linhas, barras e pizza;
Interface das classes mais clean;

PChart (http://www.pchart.net/) - não ativa;
●

692Kb no total.

●

Interface mais fragmentada, gráficos mais bonitos;

●

Geração em formato de imagem em desuso (HTML5, canvas);

●

Outras opções:
–

Highcharts (http://www.highcharts.com/);

–

PHPChart (http://phpchart.net/).

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#18
Gráficos com jpGraph
<?php
require_once ('jpgraph/src/jpgraph.php');
require_once ('jpgraph/src/jpgraph_line.php');
$dados = array(100, 300, 200, 500, 200, 400, 300);
$graph = new Graph(400,250);
$graph->SetScale('textlin');
$graph->SetMargin(40,20,40,40);
$graph->title->Set('Título do gráfico');
// Cria uma plotagem linear
$lineplot = new LinePlot($dados);
$lineplot->SetColor( 'maroon' );
$lineplot->SetWeight( 2 ); // espessura
$lineplot->mark->SetType(MARK_FILLEDCIRCLE);
$lineplot->mark->SetColor('blue');
$lineplot->mark->SetFillColor('red');
$lineplot->value->Show();
$graph->Add($lineplot); // adiciona a plotagem
$graph->Stroke('j1.png');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#19
Gráficos com jpGraph
<?php
require_once ('jpgraph/src/jpgraph.php');
require_once ('jpgraph/src/jpgraph_bar.php');
$dados = array(120,80,170,40,100);
$graph = new Graph(400,250);
$graph->SetScale("textlin");
$graph->SetMargin(40,20,40,40);
$graph->title->Set('Vendas por mes');
$barplot = new BarPlot($dados);
$barplot->SetFillColor('orange');
$barplot->value->Show();
$barplot->value->SetColor("blue");
$graph->Add($barplot);
$graph->Stroke('j2.png');
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#20
Gráficos com pChart
<?php
include 'pChart/class/pData.class.php';
// + pDraw e pImage
$dados = new pData;
$dados->addPoints(array(23, 21, 14, 12, 8, 6),'Chile');
$dados->addPoints(array( 4, 10, 12, 14, 20, 23),'Canadá');
$dados->addPoints(array('Janeiro','Fevereiro','Março',...);
$dados->setAbscissa('Meses');
$imagem = new pImage(700, 330, $dados); // borda
$imagem->drawRectangle(0, 0, 699, 329,array('R'=>0,'G'=>0,'B'=>0));
$imagem->setFontProperties(array('FontName'=>'verdana',...));
$imagem->setGraphArea(60,40,650,280);
$scaleSettings = array('XMargin'=>10,'YMargin'=>10);
$imagem->drawScale($scaleSettings); // escala
$imagem->drawLineChart(array('DisplayValues'=>TRUE));
$imagem->render('c1.png');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#21
Gráficos com pChart

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#22
Evolução
●

As bibliotecas evoluem constantemente;

●

Novas tecnologias surgem;

●

Nosso código não deve referenciar a biblioteca utilizada;

●

Devemos separar nosso código do código de terceiros;

●

Isso tudo, para facilitar o reuso e a evolução.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#23
Acoplamento
Acoplamento
●

●

●

O acoplamento é quanto
um módulo (classe,
método) conhece e
depende de outro;
O objetivo é criar modelos
com baixo acoplamento;
O alto acoplamento
diminui a reusabilidade de
objetos porque objetos
não podem ser usados
sozinhos.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#25
Acoplamento
●

É impossível criar um sistema com 0% de acoplamento.

●

Uma classe com BAIXO acoplamento:
–
–

●

Não depende de muitas outras e facilita a manutenção;
Evita que as modificações produzam efeitos colaterais;

Uma classe com ALTO acoplamento:
–

É menos inteligível isoladamente e menos reutilizável;

–

É mais sensível a mudanças nas classes da qual ela
depende.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#26
Acoplamento
●

Acoplamento concreto:
–

RelatorioControl e FPDF estão fortemente acopladas;

–

RelatorioControl conhece muito sobre FPDF.

<?php
class RelatorioControl
{
public function onGenerate()
{
$pdf = new FPDF('P', 'pt', 'A4');
$pdf->AddPage();
$pdf->SetFont('Courier', 'B', 16);
$pdf->SetTextColor(50, 50, 100);
$pdf->SetY(70);
$pdf->SetX(260);
$pdf->Write(30, 'Titulo');
$pdf->Output('test.pdf');
}
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#27
Acoplamento
●

●

●

●

●

Mas existem outra formas de dependências...
O objeto A envie uma mensagem para o objeto B sem ter
conhecimento da verdadeira classe desse último;
Essa forma de dependência corresponde ao que
chamamos de acoplamento abstrato;
A acoplamento abstrato é preferível ao concreto.
Classes abstratas e interfaces permitem implementar o
acoplamento abstrato.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#28
Acoplamento
Realização
<?php
interface IGenerator
{
function addPage();
function setFontColor($color);
function writeText($height, $text);
function setFontFace($font, $style, $size);
function saveFile($path);
}
class PDFGenerator implements IGenerator
{
//...
}
class RTFGenerator implements IGenerator
{
//...
}
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#29
Acoplamento
Uso
<?php
class RelatorioControl
{
public function onGenerate(IGenerator $gen)
{
$gen->addPage();
$gen->setFontFace('Courier', 'B', 16);
$gen->setFontColor('#FF0000');
$gen->writeText(30, 'Titulo');
$gen->saveFile('test.pdf');
}
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#30
Acoplamento
●

●

Uma forma de diminuir o acoplamento é criando um
facade;
Oferece uma interface única para um conjunto de
interfaces de um subsistema.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#31
Acoplamento
<?php
class GraficoLinhas
{
public function __construct()
{
include 'class/pData.class.php';
include 'class/pImage.class.php';
}

Mas e se quiséssemos
Tornar a biblioteca
Intercambiável?

public function addSerie($legend, $data)
…
public function setTitle($title, $font)
…
public function draw()
…
}
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#32
Implementações
Implementações
●

As interfaces das bibliotecas:
– PDF;
–
–

●

RTF;
HTML.

São muito diferentes entre si:
–

RTF é texto fluído;

–

PDF é por posicionamento fixo;

–

HTML é por marcação.

●

Para usar todas elas de maneira intercalada...

●

É necessário criar uma camada de compatibilização.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#34
Strategy
●

Permite a seleção de algoritmos durante a execução do sw;

●

Fornece um meio de declarar uma família de algoritmos;

●

●

Permite encapsular estes algoritmos como um objeto, e
torná-los intercambiáveis;
Evita-se a criação de mega-classes com N métodos.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#35
Table Writer's
●

Escritor de relatórios definido pela classe da esquerda;

contexto

Adianti Solutions Ltda © Pablo Dall'Oglio

implementação

Criando Relatórios com PHP

#36
Table Writer's
<?php
// inclui as bibliotecas...
require_once 'app.reports/ITableWriter.iface.php';
$widths = array(70, 150, 150, 100);
$tr = new TTableWriterPDF($widths);
$tr->addStyle('title', 'Arial', '10', 'B', '#ffffff', '#737373');
$tr->addStyle('data', 'Arial', '10', '', '#000000', '#ffffff');
$tr->addRow();
$tr->addCell('Código', 'left', 'title');
$tr->addCell('Nome',
'left', 'title');
$tr->addRow();
$tr->addCell('001',
'left',
$tr->addCell('Ayrton Senna da Silva', 'left',

'data');
'data');

$tr->addRow();
// ...
$tr->save("saida1.pdf"); // salva
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#37
Table Writer's
<?php
require_once 'app.reports/ITableWriter.iface.php';
// ...

Implementação

$widths = array(70, 150, 150, 100);
$tr = new TTableWriterPDF($widths);
// cria os estilos
$tr->addStyle('title', 'Arial', '12', 'B', '#ffffff', '#733131');
// atribui o escritor ao relatório
$sr = new TSimpleReport;
$sr->setReportWritter($tr);

Contexto

// adiciona as colunas do relatório
$sr->addColumn('id',
'Código', 'center');
$sr->addColumn('nome',
'Nome',
'left');
// define o banco de dados e a consulta
$sr->setDatabase('exemplos');
$sr->setQuery('SELECT id, nome, telefone, endereco from ...');
$sr->generate(); // gera o relatório
$sr->save('saida4.pdf');
?>
Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#38
Bridge
●

Separa uma abstração de sua implementação;

●

As duas podem variar de maneira independente;

●

Usa encapsulamento, agregação e herança para separar
responsabilidades.

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#39
Jeito tosco
●

Proliferação de níveis. Estrutura não-flexível;

●

Alto grau de acoplamento. O cliente especifica a classe;

●

Quantas novas classes para novo tipo de gráfico (gauge)?

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#40
Criando relatórios com PHP - PHP Conference Brasil 2013
Bridge
<?php
require_once 'app.reports/TChart.class.php';
require_once 'app.reports/TBarChart.class.php';
require_once 'app.reports/TPieChart.class.php';
// ...
$data['maria'] = array( 1, 2, 3, 4, 5, 6, 7);
$data['pedro'] = array(12, 3, 12, 4, 12, 4, 2);
$data['joao'] = array( 9, 8, 7, 6, 5, 4, 3);
$chart = new TBarChart(new TPChartDesigner);
$chart->setTitle('Título do gráfico', NULL, NULL);
$chart->setSize(500, 300);
$chart->setXLabels(array('a', 'b', 'c', 'd', 'e', 'f', 'g'));
$chart->setYLabel('label do eixo Y');
$chart->setOutputPath('tmp/teste.png');
$chart->addData('maria', $data['maria']);
$chart->addData('pedro', $data['pedro']);
$chart->addData('joao', $data['joao']);
$chart->generate();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#42
Bridge
<?php
require_once 'app.reports/TChart.class.php';
require_once 'app.reports/TBarChart.class.php';
require_once 'app.reports/TPieChart.class.php';
// ...
// cria um gráfico de pizza usando a JPGraph
$chart = new TPieChart(new TJPGraphDesigner);
$chart->setTitle('Título do gráfico', NULL, NULL);
$chart->setSize(500, 300);
$chart->setOutputPath('tmp/teste2.png');
$chart->addData('maria', 40);
$chart->addData('pedro', 30);
$chart->addData('joao', 30);
$chart->generate();
?>

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#43
Obrigado
●

Livro
–

●

Adianti Framework:
–

●

www.adianti.com.br/bkrpt
www.adianti.com.br/framework

Contato:
–

–

@pablodalloglio

–
●

www.dalloglio.net

fb.com/pablodalloglio

Não esquecer de falar do Sorteio!

Adianti Solutions Ltda © Pablo Dall'Oglio

Criando Relatórios com PHP

#44

Mais conteúdo relacionado

PDF
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
PDF
MongoDB sharded cluster. How to design your topology ?
PDF
PostgreSQL: Joining 1 million tables
PPTX
红蓝对抗之隐蔽通信应用及防御.pptx
PDF
Windows Server Container and Windows Subsystem for Linux
PDF
Query Optimization with MySQL 8.0 and MariaDB 10.3: The Basics
PDF
PHP para Adultos: Clean Code e Object Calisthenics
PDF
Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
MongoDB sharded cluster. How to design your topology ?
PostgreSQL: Joining 1 million tables
红蓝对抗之隐蔽通信应用及防御.pptx
Windows Server Container and Windows Subsystem for Linux
Query Optimization with MySQL 8.0 and MariaDB 10.3: The Basics
PHP para Adultos: Clean Code e Object Calisthenics
Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...

Destaque (11)

PDF
Adianti Framework PHPConf 2013
PDF
Programando para programadores: Desafios na evolução de um Framework
PDF
As novidades do PHP5 (2005)
PDF
Design for change: Fatores que influenciam na longevidade de um Software PHP
PDF
Design Patterns com PHP
PDF
PHP: Programando com orientação a Objetos
PDF
Experiencias de um desenvolvedor de software livre (2005)
PDF
Criando aplicações com PHP-GTK
PDF
Implementando enterprise patterns com PHP
PDF
Relatórios Corporativos com Java e Software Livre
DOCX
Usando o i report como gerador de relatórios para php
Adianti Framework PHPConf 2013
Programando para programadores: Desafios na evolução de um Framework
As novidades do PHP5 (2005)
Design for change: Fatores que influenciam na longevidade de um Software PHP
Design Patterns com PHP
PHP: Programando com orientação a Objetos
Experiencias de um desenvolvedor de software livre (2005)
Criando aplicações com PHP-GTK
Implementando enterprise patterns com PHP
Relatórios Corporativos com Java e Software Livre
Usando o i report como gerador de relatórios para php
Anúncio

Semelhante a Criando relatórios com PHP - PHP Conference Brasil 2013 (13)

PDF
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
PDF
User Interface (in portuguese)
PDF
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
PDF
PHP, Mercado e Certificações
PDF
PHP: Além do sitezinho
PDF
Crawling - Coleta de dados na Web com PHP
PPT
Php manteiga
PDF
PHP para aplicações Web de grande porte
PPT
Interoperabilidade entre bancos de dados
PPT
Interoperabilidade entre bancos de dados
ODP
Django para infográficos
PDF
PHP Turbinado com CodeIgniter - Conisli 2011
PDF
Software livre - Parte 3
Mapeamento Objeto Relacional com PHP - PHP Conference Brasil 2010
User Interface (in portuguese)
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
PHP, Mercado e Certificações
PHP: Além do sitezinho
Crawling - Coleta de dados na Web com PHP
Php manteiga
PHP para aplicações Web de grande porte
Interoperabilidade entre bancos de dados
Interoperabilidade entre bancos de dados
Django para infográficos
PHP Turbinado com CodeIgniter - Conisli 2011
Software livre - Parte 3
Anúncio

Último (16)

PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
Arquitetura de computadores - Memórias Secundárias
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
COBITxITIL-Entenda as diferença em uso governança TI
Processos na gestão de transportes, TM100 Col18
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Arquitetura de computadores - Memórias Secundárias
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Custos e liquidação no SAP Transportation Management, TM130 Col18
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
COBITxITIL-Entenda as diferença em uso governança TI

Criando relatórios com PHP - PHP Conference Brasil 2013

  • 2. Roteiro ● Introdução – Apresentação; – Bibliotecas para relatórios: ● – Bibliotecas para gráficos: ● – JPGraph, pChart; Desacoplamento: ● – XLS, PDF, RTF; A importância de desacoplar; Implementação: ● Strategy para relatórios; ● Bridge para gráficos. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #2
  • 3. Apresentação ● Clipper (1994-1998): comercial, bibliotecas, funções; ● Delphi (1998-1999): automação, componentes; ● PHP (2000): SAGU (php+html+sql) ● PHP-GTK(2001): PHP só com classes; ● Agata Report (2001-2006); ● Design Patterns (2004): Aprendizado na Unisinos; ● PHP: Criando Aplicações Gráficas com PHP (2004); ● PHP: Programando com Orientação a Objetos (2007); ● Criando Relatórios com PHP (2011); ● Adianti Framework para PHP (2012). Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #3
  • 4. Objetivo ● O que não queremos: – – ● Não queremos mini-curso de geração de relatórios; Provavelmente a maioria já conhece bem uma biblioteca; O que queremos: – Explorar várias bibliotecas e suas principais características; – Analisar boas formas de integrá-las em nossa aplicação; – Estudar padrões de projeto que podem ser utilizados para isso. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #4
  • 6. Relatórios em XLS ● Bom para: – – ● Relatórios tabulares (linhas, colunas); Permite formatações, totalizações. Spreadsheet Writer (304 Kb): – – Pequeno, funciona bem, mas sem novos releases; – ● http://pear.php.net/package/Spreadsheet_Excel_Writer Depende do pacote OLE, não gera XLSX (só XLS - BIFF). PHPExcel (4.3 Mb): – http://phpexcel.codeplex.com – Bastante ativo, maior, com muitas funcionalidades; – Trabalha com Open XML (XLSX). Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #6
  • 7. Relatórios em XLS <?php require_once 'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer('test.xls'); // Cria uma planilha $worksheet = $workbook->addWorksheet('My first worksheet'); // escreve os dados $worksheet->write(0, $worksheet->write(0, $worksheet->write(1, $worksheet->write(1, $worksheet->write(2, $worksheet->write(2, $worksheet->write(3, $worksheet->write(3, 0, 1, 0, 1, 0, 1, 0, 1, 'Nome'); 'Idade'); 'Maria'); 30); 'Joao'); 31); 'Mariana'); 32); // Finaliza, gravando $workbook->close(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #7
  • 8. Relatórios em XLS <?php require_once 'Spreadsheet/Excel/Writer.php'; $workbook = new Spreadsheet_Excel_Writer('test2.xls'); $formato_bold = $workbook->addFormat(); $formato_bold->setBold(); $formato_title = $workbook->addFormat(); $formato_title->setBold(); $formato_title->setColor('white'); $formato_title->setPattern(1); $formato_title->setFgColor('gray'); $worksheet = $workbook->addWorksheet(); $worksheet->write(0, 0, "Titulo", $formato_title); $worksheet->write(1, 0, "Coluna 1", $formato_bold); $worksheet->write(1, 1, "Coluna 2", $formato_bold); $workbook->close(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #8
  • 9. Relatórios em PDF ● Bom para: – – Documentos (NFE, atestados, diplomas); – ● Quase qualquer coisa, relatórios tabulares; Posicionamento fixo dos objetos. FPDF (46k fpdf.php): – ● TCPDF (864k tcpdf.php): – ● http://www.fpdf.org (Bom, pequena, mas não ativa); http://www.tcpdf.org/ (Ativa, Grande, milhões de funcionalidades, baseada na FPDF, chars, codabar, forms); MPDF (1.3 Mb mpdf.php): – http://www.mpdf1.com/ (Ativa, Grande, Gera PDF baseado em HTML, boa com tables e formatações, FPDF based); Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #9
  • 10. Relatórios em PDF <?php require('fpdf/fpdf.php'); $pdf = new FPDF('P', 'pt', 'A4'); $pdf->AddPage(); $pdf->SetFont('Courier', 'B', 16); $pdf->SetTextColor(50, 50, 100); $pdf->SetY(70); $pdf->SetX(260); // não desloca o cursor $pdf->Write(30, 'Titulo'); $pdf->Ln(30); // Espaçamento $txt = str_repeat('write ', 30); $pdf->SetX(200); // altera a posição X $pdf->SetTextColor(100, 50, 50); // tom de vermelho $pdf->SetFont('Times', 'B', 14); $pdf->Write(20, $txt); $pdf->Output('test.pdf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #10
  • 11. Relatórios em PDF <?php require('fpdf/fpdf.php'); $pdf = new FPDF('P', 'pt', 'A4'); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Cell(510, 20, 'Titulo com borda', 1, 1, 'C'); $pdf->Ln(20); $pdf->SetFillColor(255,120,120); $pdf->Cell(170, 30,'Alinhado a esquerda', 1, 0, 'L', TRUE); $pdf->SetFillColor(170,255,120); $pdf->Cell(170, 30,'Alinhado ao centro', 1, 0, 'C', TRUE); $pdf->SetFillColor(100,100,255); $pdf->Cell(170, 30,'Alinhado a direita', 1, 1, 'R', TRUE); $pdf->Output('test2.pdf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #11
  • 12. Relatórios em RTF ● Bom para: – – Documentos editáveis (contratos, cartas); – Trabalha com escrita de elementos de texto e tabelas; – ● Relatórios tabulares; Abre bem no Word e LibreOffice. PhpRtfLite(372 Kb): – sf.net/projects/phprtf/ – Pequeno; – Funciona bem; – Ativa. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #12
  • 13. Relatórios em RTF <?php require 'PHPRtfLite/lib/PHPRtfLite.php'; PHPRtfLite::registerAutoloader(); $rtf = new PHPRtfLite; $secao = $rtf->addSection(); // adiciona seção $fontTitulo = new PHPRtfLite_Font(16, 'Arial'); $fontTitulo->setBold(); $fontTitulo->setUnderline(); $secao->writeText('Título', $fontTitulo, new PHPRtfLite_ParFormat('center')); $texto = 'Texto c/<b>negrito</b>,<i>italico</i>, <u>sublinhado</u>. '; $secao->writeText(str_repeat($texto, 12), new PHPRtfLite_Font(12), new PHPRtfLite_ParFormat('justify')); $rtf->save('test.rtf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #13
  • 14. Relatórios em RTF Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #14
  • 15. Relatórios em RTF <?php require '...'; $dados = array(); $dados[] = array( 1, 'Brazil', 'Ayrton Senna', 90); $dados[] = array( 2, 'France', 'Alain Prost', 87); // ... $rtf = new PHPRtfLite; $table = $rtf->addSection()->addTable(); $table->addColumn(3); // larguras $table->addColumn(5); // ... $row = 1; foreach($dados as $linha) { $table->addRow(0.5); $col = 1; foreach ($linha as $coluna) { $table->writeToCell($row, $col, $coluna, $fonte, ...); $col++; } $row ++; } $rtf->save('test2.rtf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #15
  • 16. Relatórios em RTF Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #16
  • 18. Gráficos ● Algumas opções: – JpGraph (http://jpgraph.net/) - não ativa; ● ● – 325Kb para gráfico de linhas, barras e pizza; Interface das classes mais clean; PChart (http://www.pchart.net/) - não ativa; ● 692Kb no total. ● Interface mais fragmentada, gráficos mais bonitos; ● Geração em formato de imagem em desuso (HTML5, canvas); ● Outras opções: – Highcharts (http://www.highcharts.com/); – PHPChart (http://phpchart.net/). Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #18
  • 19. Gráficos com jpGraph <?php require_once ('jpgraph/src/jpgraph.php'); require_once ('jpgraph/src/jpgraph_line.php'); $dados = array(100, 300, 200, 500, 200, 400, 300); $graph = new Graph(400,250); $graph->SetScale('textlin'); $graph->SetMargin(40,20,40,40); $graph->title->Set('Título do gráfico'); // Cria uma plotagem linear $lineplot = new LinePlot($dados); $lineplot->SetColor( 'maroon' ); $lineplot->SetWeight( 2 ); // espessura $lineplot->mark->SetType(MARK_FILLEDCIRCLE); $lineplot->mark->SetColor('blue'); $lineplot->mark->SetFillColor('red'); $lineplot->value->Show(); $graph->Add($lineplot); // adiciona a plotagem $graph->Stroke('j1.png'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #19
  • 20. Gráficos com jpGraph <?php require_once ('jpgraph/src/jpgraph.php'); require_once ('jpgraph/src/jpgraph_bar.php'); $dados = array(120,80,170,40,100); $graph = new Graph(400,250); $graph->SetScale("textlin"); $graph->SetMargin(40,20,40,40); $graph->title->Set('Vendas por mes'); $barplot = new BarPlot($dados); $barplot->SetFillColor('orange'); $barplot->value->Show(); $barplot->value->SetColor("blue"); $graph->Add($barplot); $graph->Stroke('j2.png'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #20
  • 21. Gráficos com pChart <?php include 'pChart/class/pData.class.php'; // + pDraw e pImage $dados = new pData; $dados->addPoints(array(23, 21, 14, 12, 8, 6),'Chile'); $dados->addPoints(array( 4, 10, 12, 14, 20, 23),'Canadá'); $dados->addPoints(array('Janeiro','Fevereiro','Março',...); $dados->setAbscissa('Meses'); $imagem = new pImage(700, 330, $dados); // borda $imagem->drawRectangle(0, 0, 699, 329,array('R'=>0,'G'=>0,'B'=>0)); $imagem->setFontProperties(array('FontName'=>'verdana',...)); $imagem->setGraphArea(60,40,650,280); $scaleSettings = array('XMargin'=>10,'YMargin'=>10); $imagem->drawScale($scaleSettings); // escala $imagem->drawLineChart(array('DisplayValues'=>TRUE)); $imagem->render('c1.png'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #21
  • 22. Gráficos com pChart Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #22
  • 23. Evolução ● As bibliotecas evoluem constantemente; ● Novas tecnologias surgem; ● Nosso código não deve referenciar a biblioteca utilizada; ● Devemos separar nosso código do código de terceiros; ● Isso tudo, para facilitar o reuso e a evolução. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #23
  • 25. Acoplamento ● ● ● O acoplamento é quanto um módulo (classe, método) conhece e depende de outro; O objetivo é criar modelos com baixo acoplamento; O alto acoplamento diminui a reusabilidade de objetos porque objetos não podem ser usados sozinhos. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #25
  • 26. Acoplamento ● É impossível criar um sistema com 0% de acoplamento. ● Uma classe com BAIXO acoplamento: – – ● Não depende de muitas outras e facilita a manutenção; Evita que as modificações produzam efeitos colaterais; Uma classe com ALTO acoplamento: – É menos inteligível isoladamente e menos reutilizável; – É mais sensível a mudanças nas classes da qual ela depende. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #26
  • 27. Acoplamento ● Acoplamento concreto: – RelatorioControl e FPDF estão fortemente acopladas; – RelatorioControl conhece muito sobre FPDF. <?php class RelatorioControl { public function onGenerate() { $pdf = new FPDF('P', 'pt', 'A4'); $pdf->AddPage(); $pdf->SetFont('Courier', 'B', 16); $pdf->SetTextColor(50, 50, 100); $pdf->SetY(70); $pdf->SetX(260); $pdf->Write(30, 'Titulo'); $pdf->Output('test.pdf'); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #27
  • 28. Acoplamento ● ● ● ● ● Mas existem outra formas de dependências... O objeto A envie uma mensagem para o objeto B sem ter conhecimento da verdadeira classe desse último; Essa forma de dependência corresponde ao que chamamos de acoplamento abstrato; A acoplamento abstrato é preferível ao concreto. Classes abstratas e interfaces permitem implementar o acoplamento abstrato. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #28
  • 29. Acoplamento Realização <?php interface IGenerator { function addPage(); function setFontColor($color); function writeText($height, $text); function setFontFace($font, $style, $size); function saveFile($path); } class PDFGenerator implements IGenerator { //... } class RTFGenerator implements IGenerator { //... } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #29
  • 30. Acoplamento Uso <?php class RelatorioControl { public function onGenerate(IGenerator $gen) { $gen->addPage(); $gen->setFontFace('Courier', 'B', 16); $gen->setFontColor('#FF0000'); $gen->writeText(30, 'Titulo'); $gen->saveFile('test.pdf'); } } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #30
  • 31. Acoplamento ● ● Uma forma de diminuir o acoplamento é criando um facade; Oferece uma interface única para um conjunto de interfaces de um subsistema. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #31
  • 32. Acoplamento <?php class GraficoLinhas { public function __construct() { include 'class/pData.class.php'; include 'class/pImage.class.php'; } Mas e se quiséssemos Tornar a biblioteca Intercambiável? public function addSerie($legend, $data) … public function setTitle($title, $font) … public function draw() … } ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #32
  • 34. Implementações ● As interfaces das bibliotecas: – PDF; – – ● RTF; HTML. São muito diferentes entre si: – RTF é texto fluído; – PDF é por posicionamento fixo; – HTML é por marcação. ● Para usar todas elas de maneira intercalada... ● É necessário criar uma camada de compatibilização. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #34
  • 35. Strategy ● Permite a seleção de algoritmos durante a execução do sw; ● Fornece um meio de declarar uma família de algoritmos; ● ● Permite encapsular estes algoritmos como um objeto, e torná-los intercambiáveis; Evita-se a criação de mega-classes com N métodos. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #35
  • 36. Table Writer's ● Escritor de relatórios definido pela classe da esquerda; contexto Adianti Solutions Ltda © Pablo Dall'Oglio implementação Criando Relatórios com PHP #36
  • 37. Table Writer's <?php // inclui as bibliotecas... require_once 'app.reports/ITableWriter.iface.php'; $widths = array(70, 150, 150, 100); $tr = new TTableWriterPDF($widths); $tr->addStyle('title', 'Arial', '10', 'B', '#ffffff', '#737373'); $tr->addStyle('data', 'Arial', '10', '', '#000000', '#ffffff'); $tr->addRow(); $tr->addCell('Código', 'left', 'title'); $tr->addCell('Nome', 'left', 'title'); $tr->addRow(); $tr->addCell('001', 'left', $tr->addCell('Ayrton Senna da Silva', 'left', 'data'); 'data'); $tr->addRow(); // ... $tr->save("saida1.pdf"); // salva ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #37
  • 38. Table Writer's <?php require_once 'app.reports/ITableWriter.iface.php'; // ... Implementação $widths = array(70, 150, 150, 100); $tr = new TTableWriterPDF($widths); // cria os estilos $tr->addStyle('title', 'Arial', '12', 'B', '#ffffff', '#733131'); // atribui o escritor ao relatório $sr = new TSimpleReport; $sr->setReportWritter($tr); Contexto // adiciona as colunas do relatório $sr->addColumn('id', 'Código', 'center'); $sr->addColumn('nome', 'Nome', 'left'); // define o banco de dados e a consulta $sr->setDatabase('exemplos'); $sr->setQuery('SELECT id, nome, telefone, endereco from ...'); $sr->generate(); // gera o relatório $sr->save('saida4.pdf'); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #38
  • 39. Bridge ● Separa uma abstração de sua implementação; ● As duas podem variar de maneira independente; ● Usa encapsulamento, agregação e herança para separar responsabilidades. Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #39
  • 40. Jeito tosco ● Proliferação de níveis. Estrutura não-flexível; ● Alto grau de acoplamento. O cliente especifica a classe; ● Quantas novas classes para novo tipo de gráfico (gauge)? Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #40
  • 42. Bridge <?php require_once 'app.reports/TChart.class.php'; require_once 'app.reports/TBarChart.class.php'; require_once 'app.reports/TPieChart.class.php'; // ... $data['maria'] = array( 1, 2, 3, 4, 5, 6, 7); $data['pedro'] = array(12, 3, 12, 4, 12, 4, 2); $data['joao'] = array( 9, 8, 7, 6, 5, 4, 3); $chart = new TBarChart(new TPChartDesigner); $chart->setTitle('Título do gráfico', NULL, NULL); $chart->setSize(500, 300); $chart->setXLabels(array('a', 'b', 'c', 'd', 'e', 'f', 'g')); $chart->setYLabel('label do eixo Y'); $chart->setOutputPath('tmp/teste.png'); $chart->addData('maria', $data['maria']); $chart->addData('pedro', $data['pedro']); $chart->addData('joao', $data['joao']); $chart->generate(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #42
  • 43. Bridge <?php require_once 'app.reports/TChart.class.php'; require_once 'app.reports/TBarChart.class.php'; require_once 'app.reports/TPieChart.class.php'; // ... // cria um gráfico de pizza usando a JPGraph $chart = new TPieChart(new TJPGraphDesigner); $chart->setTitle('Título do gráfico', NULL, NULL); $chart->setSize(500, 300); $chart->setOutputPath('tmp/teste2.png'); $chart->addData('maria', 40); $chart->addData('pedro', 30); $chart->addData('joao', 30); $chart->generate(); ?> Adianti Solutions Ltda © Pablo Dall'Oglio Criando Relatórios com PHP #43