SlideShare uma empresa Scribd logo
1 de 44
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
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

Mais procurados

Taxa de variação média e derivada num ponto
Taxa de variação média e derivada num pontoTaxa de variação média e derivada num ponto
Taxa de variação média e derivada num pontosilvia_lfr
 
RELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIA
RELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIARELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIA
RELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIAEzequias Guimaraes
 
Solução da lista 2
Solução da lista 2Solução da lista 2
Solução da lista 2Ayrton Lira
 
Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...
Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...
Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...Paulo Mutolo
 
Exercicios expressões numéricas
Exercicios expressões numéricasExercicios expressões numéricas
Exercicios expressões numéricasVitor Leal Diniz
 
Tcc escola educacao Gerenciamento de Projetos
Tcc escola educacao Gerenciamento de ProjetosTcc escola educacao Gerenciamento de Projetos
Tcc escola educacao Gerenciamento de ProjetosIverson moya
 
Resolução comentada matemática 002
Resolução comentada matemática  002Resolução comentada matemática  002
Resolução comentada matemática 002comentada
 
Resolver problemas conducentes à equação quadrática
Resolver problemas conducentes à equação quadráticaResolver problemas conducentes à equação quadrática
Resolver problemas conducentes à equação quadráticaPaulo Mutolo
 
Cap4 - Parte 6 - Distribuições Discretas Exercicios Resolvidos
Cap4 - Parte 6 - Distribuições Discretas Exercicios ResolvidosCap4 - Parte 6 - Distribuições Discretas Exercicios Resolvidos
Cap4 - Parte 6 - Distribuições Discretas Exercicios ResolvidosRegis Andrade
 
Relatório de levantamento topográfico altimétrico - Sistematização de terrenos
Relatório de levantamento topográfico altimétrico - Sistematização de terrenosRelatório de levantamento topográfico altimétrico - Sistematização de terrenos
Relatório de levantamento topográfico altimétrico - Sistematização de terrenosluancaio_aguas
 
Implicação Lógica
Implicação LógicaImplicação Lógica
Implicação LógicaHugo Souza
 
Aula 1- Analise de Investimento
Aula 1- Analise de InvestimentoAula 1- Analise de Investimento
Aula 1- Analise de InvestimentoLuciano Rodrigues
 
Topografia exercícios propostos com solução
Topografia    exercícios  propostos com soluçãoTopografia    exercícios  propostos com solução
Topografia exercícios propostos com soluçãoMaíra Barros
 
Contabilidade de Custos - Classificação dos Custos - Parte 2
Contabilidade de Custos - Classificação dos Custos - Parte 2Contabilidade de Custos - Classificação dos Custos - Parte 2
Contabilidade de Custos - Classificação dos Custos - Parte 2Diego Lopes
 
Unidade 04 - Estatística - Medidas de dispersão.ppt
Unidade 04 - Estatística - Medidas de dispersão.pptUnidade 04 - Estatística - Medidas de dispersão.ppt
Unidade 04 - Estatística - Medidas de dispersão.pptCrobelEtiquetas
 
Passar um factor para dentro e para fora do radical
Passar um factor para dentro e para fora do radicalPassar um factor para dentro e para fora do radical
Passar um factor para dentro e para fora do radicalJeremias Manhica
 

Mais procurados (20)

Taxa de variação média e derivada num ponto
Taxa de variação média e derivada num pontoTaxa de variação média e derivada num ponto
Taxa de variação média e derivada num ponto
 
RELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIA
RELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIARELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIA
RELATÓRIO DE ATIVIDADES DE CAMPO DA DISCIPLINA DE TOPOGRAFIA SOBRE TAQUIOMETRIA
 
Exemplo de prova p2
Exemplo de prova p2Exemplo de prova p2
Exemplo de prova p2
 
Solução da lista 2
Solução da lista 2Solução da lista 2
Solução da lista 2
 
Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...
Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...
Resolver problemas concretas da vida real, aplicando propriedades das operaçõ...
 
Aula 25 probalidade - parte 2
Aula 25   probalidade - parte 2Aula 25   probalidade - parte 2
Aula 25 probalidade - parte 2
 
Exercicios expressões numéricas
Exercicios expressões numéricasExercicios expressões numéricas
Exercicios expressões numéricas
 
Tcc escola educacao Gerenciamento de Projetos
Tcc escola educacao Gerenciamento de ProjetosTcc escola educacao Gerenciamento de Projetos
Tcc escola educacao Gerenciamento de Projetos
 
Resolução comentada matemática 002
Resolução comentada matemática  002Resolução comentada matemática  002
Resolução comentada matemática 002
 
Resolver problemas conducentes à equação quadrática
Resolver problemas conducentes à equação quadráticaResolver problemas conducentes à equação quadrática
Resolver problemas conducentes à equação quadrática
 
Cap4 - Parte 6 - Distribuições Discretas Exercicios Resolvidos
Cap4 - Parte 6 - Distribuições Discretas Exercicios ResolvidosCap4 - Parte 6 - Distribuições Discretas Exercicios Resolvidos
Cap4 - Parte 6 - Distribuições Discretas Exercicios Resolvidos
 
Relatório de levantamento topográfico altimétrico - Sistematização de terrenos
Relatório de levantamento topográfico altimétrico - Sistematização de terrenosRelatório de levantamento topográfico altimétrico - Sistematização de terrenos
Relatório de levantamento topográfico altimétrico - Sistematização de terrenos
 
Implicação Lógica
Implicação LógicaImplicação Lógica
Implicação Lógica
 
Aula 1- Analise de Investimento
Aula 1- Analise de InvestimentoAula 1- Analise de Investimento
Aula 1- Analise de Investimento
 
Topografia exercícios propostos com solução
Topografia    exercícios  propostos com soluçãoTopografia    exercícios  propostos com solução
Topografia exercícios propostos com solução
 
Teoria do voo 2021
Teoria do voo 2021Teoria do voo 2021
Teoria do voo 2021
 
Contabilidade de Custos - Classificação dos Custos - Parte 2
Contabilidade de Custos - Classificação dos Custos - Parte 2Contabilidade de Custos - Classificação dos Custos - Parte 2
Contabilidade de Custos - Classificação dos Custos - Parte 2
 
Apostila estatistica ii processos de ruína
Apostila estatistica ii   processos de ruínaApostila estatistica ii   processos de ruína
Apostila estatistica ii processos de ruína
 
Unidade 04 - Estatística - Medidas de dispersão.ppt
Unidade 04 - Estatística - Medidas de dispersão.pptUnidade 04 - Estatística - Medidas de dispersão.ppt
Unidade 04 - Estatística - Medidas de dispersão.ppt
 
Passar um factor para dentro e para fora do radical
Passar um factor para dentro e para fora do radicalPassar um factor para dentro e para fora do radical
Passar um factor para dentro e para fora do radical
 

Destaque

Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Pablo Dall'Oglio
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPPablo Dall'Oglio
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksPablo Dall'Oglio
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPablo Dall'Oglio
 
Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Pablo Dall'Oglio
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTKPablo Dall'Oglio
 
Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHPPablo Dall'Oglio
 
Relatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software LivreRelatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software Livreelliando dias
 
Usando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpUsando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpbrunocf007
 

Destaque (12)

Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013Adianti Framework PHPConf 2013
Adianti Framework PHPConf 2013
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Design for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHPDesign for change: Fatores que influenciam na longevidade de um Software PHP
Design for change: Fatores que influenciam na longevidade de um Software PHP
 
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworksDo Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
Do Clipper e Delphi ao Ruby e PHP: Antes e depois dos frameworks
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
PHP: Programando com orientação a Objetos
PHP: Programando com orientação a ObjetosPHP: Programando com orientação a Objetos
PHP: Programando com orientação a Objetos
 
Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)Experiencias de um desenvolvedor de software livre (2005)
Experiencias de um desenvolvedor de software livre (2005)
 
Criando aplicações com PHP-GTK
Criando aplicações com PHP-GTKCriando aplicações com PHP-GTK
Criando aplicações com PHP-GTK
 
Implementando enterprise patterns com PHP
Implementando enterprise patterns com PHPImplementando enterprise patterns com PHP
Implementando enterprise patterns com PHP
 
Relatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software LivreRelatórios Corporativos com Java e Software Livre
Relatórios Corporativos com Java e Software Livre
 
Usando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para phpUsando o i report como gerador de relatórios para php
Usando o i report como gerador de relatórios para php
 

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

Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Pablo Dall'Oglio
 
Postgresql 50 Sabores - PgDay Ceará 2013
Postgresql 50 Sabores - PgDay Ceará 2013Postgresql 50 Sabores - PgDay Ceará 2013
Postgresql 50 Sabores - PgDay Ceará 2013Cláudio Leopoldino
 
User Interface (in portuguese)
User Interface (in portuguese)User Interface (in portuguese)
User Interface (in portuguese)Bruno Pedro
 
Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010
Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010
Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010IT4biz IT Solutions
 
Pentaho: inteligência de negócios utilizando software livre
Pentaho: inteligência de negócios utilizando software livrePentaho: inteligência de negócios utilizando software livre
Pentaho: inteligência de negócios utilizando software livreCaio Moreno
 
Modelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopModelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopBig Data Week São Paulo
 
Logs, pra que te quero! @ Meetup PHP Vale
Logs, pra que te quero! @ Meetup PHP ValeLogs, pra que te quero! @ Meetup PHP Vale
Logs, pra que te quero! @ Meetup PHP ValeGabriel Machado
 
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018 O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018 Gabriel Machado
 
PHP, Presente e Futuro
PHP, Presente e FuturoPHP, Presente e Futuro
PHP, Presente e FuturoFreedom DayMS
 
Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019Gabriel Machado
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017Gabriel Machado
 
Apresentação clipper e harbour
Apresentação clipper e harbourApresentação clipper e harbour
Apresentação clipper e harbourEdilberto Souza
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPaulino Michelazzo
 
Acrobat 15 in_designug
Acrobat 15 in_designugAcrobat 15 in_designug
Acrobat 15 in_designugVitor Pedro
 

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

Novidades do PHP 5.3 e 6
Novidades do PHP 5.3 e 6Novidades do PHP 5.3 e 6
Novidades do PHP 5.3 e 6
 
Php Gtk
Php GtkPhp Gtk
Php Gtk
 
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
Construindo ERP's com PHP: Desafios em design, manutenção segurança e perf...
 
Postgresql 50 Sabores - PgDay Ceará 2013
Postgresql 50 Sabores - PgDay Ceará 2013Postgresql 50 Sabores - PgDay Ceará 2013
Postgresql 50 Sabores - PgDay Ceará 2013
 
User Interface (in portuguese)
User Interface (in portuguese)User Interface (in portuguese)
User Interface (in portuguese)
 
Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010
Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010
Pentaho: Inteligência de Negócios utilizando Software Livre @ CONSEGI 2010
 
Pentaho: inteligência de negócios utilizando software livre
Pentaho: inteligência de negócios utilizando software livrePentaho: inteligência de negócios utilizando software livre
Pentaho: inteligência de negócios utilizando software livre
 
Modelos de computação distribuída no Hadoop
Modelos de computação distribuída no HadoopModelos de computação distribuída no Hadoop
Modelos de computação distribuída no Hadoop
 
Treinamento Hadoop - dia2
Treinamento Hadoop - dia2Treinamento Hadoop - dia2
Treinamento Hadoop - dia2
 
Logs, pra que te quero! @ Meetup PHP Vale
Logs, pra que te quero! @ Meetup PHP ValeLogs, pra que te quero! @ Meetup PHP Vale
Logs, pra que te quero! @ Meetup PHP Vale
 
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018 O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
O que não fazer ao atualizar para o PHP 7 @ TDC SP 2018
 
PHP, Presente e Futuro
PHP, Presente e FuturoPHP, Presente e Futuro
PHP, Presente e Futuro
 
Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019Implementando PSR-3 com Monolog @ PHP Community Summit 2019
Implementando PSR-3 com Monolog @ PHP Community Summit 2019
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
Logs, pra que te quero! @ PHP Community Summit by locaweb 2017
 
Apresentação clipper e harbour
Apresentação clipper e harbourApresentação clipper e harbour
Apresentação clipper e harbour
 
POG nunca mais - SOLISC
POG nunca mais - SOLISCPOG nunca mais - SOLISC
POG nunca mais - SOLISC
 
Python 08
Python 08Python 08
Python 08
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
 
Acrobat 15 in_designug
Acrobat 15 in_designugAcrobat 15 in_designug
Acrobat 15 in_designug
 

Criando relatórios com PHP - PHP Conference Brasil 2013

  • 1.
  • 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
  • 41.
  • 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