SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS ArchitectureEyal Vardi
 
Cascading style sheet
Cascading style sheetCascading style sheet
Cascading style sheetMichael Jhon
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Heo Seungwook
 
Quick flask an intro to flask
Quick flask   an intro to flaskQuick flask   an intro to flask
Quick flask an intro to flaskjuzten
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Visual Engineering
 
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...Tae-Seong Park
 
Angular 8
Angular 8 Angular 8
Angular 8 Sunil OS
 
Curso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoCurso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoNorton Guimarães
 
10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticos10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticosCentro Paula Souza
 
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.ssuser6dd171
 

Was ist angesagt? (20)

JQuery UI
JQuery UIJQuery UI
JQuery UI
 
AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS Architecture
 
Cascading style sheet
Cascading style sheetCascading style sheet
Cascading style sheet
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍
 
Quick flask an intro to flask
Quick flask   an intro to flaskQuick flask   an intro to flask
Quick flask an intro to flask
 
Php Ppt
Php PptPhp Ppt
Php Ppt
 
Angular Directives
Angular DirectivesAngular Directives
Angular Directives
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.
 
Flask
FlaskFlask
Flask
 
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
[AWSKRUG] 혼자서 커뮤니티 귀동냥하며 만든 Next.js & Amplify & serverless framework 서버리스 웹 플...
 
Html forms
Html formsHtml forms
Html forms
 
Angular Schematics
Angular SchematicsAngular Schematics
Angular Schematics
 
jQuery
jQueryjQuery
jQuery
 
Angular 8
Angular 8 Angular 8
Angular 8
 
Curso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP BásicoCurso Linguagem de Programação I - PHP Básico
Curso Linguagem de Programação I - PHP Básico
 
Java OCA teoria 5
Java OCA teoria 5Java OCA teoria 5
Java OCA teoria 5
 
10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticos10 Java Script - Exemplos práticos
10 Java Script - Exemplos práticos
 
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
 
Cookies and sessions
Cookies and sessionsCookies and sessions
Cookies and sessions
 
Vbscript
VbscriptVbscript
Vbscript
 

Andere mochten auch

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
 

Andere mochten auch (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
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 

Kürzlich hochgeladen (6)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

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