67
 Zend Framework + PDT Introdução http://www.fgsl.eti.br É permitida a reprodução parcial ou total desde que citada a fonte

Palestra Zend Framework CONAPHP CONISLI

Embed Size (px)

DESCRIPTION

Palestra realizada em 2008, no CONAPHP (Congresso Nacional de PHP), que ocorreu dentro do CONISLI (Congresso Internacional de Software Livre), na FIAP (Faculdade de Informática e Administração Paulsta).

Citation preview

Page 1: Palestra Zend Framework CONAPHP CONISLI

   

Zend Framework + PDTIntrodução

http://www.fgsl.eti.br 

É permitida a reprodução parcial ou total desde que citada a fonte

Page 2: Palestra Zend Framework CONAPHP CONISLI

   

Sobre o que falarei?

● Quem sou eu?● Provocação● Motivação● O que é Zend Framework?● Por que Zend Framework?● Ferramenta: Eclipse + Plugin PDT● Introdução ao MVC do ZF● Introdução a formulários dinâmicos

É permitida a reprodução parcial ou total desde que citada a fonte

Page 3: Palestra Zend Framework CONAPHP CONISLI

   

Flávio Lisboa

● Trabalha no SERPRO, Serviço Federal de Processamento de Dados. 

● Trabalhou no Projeto de Internalização do PHP no SERPRO, definindo padrões, elaborando e ministrando treinamentos e finalmente avaliando e indicando um framework padrão.

● Tradução de capítulos do ZF.● Livro: Zend Framework

É permitida a reprodução parcial ou total desde que citada a fonte

Page 4: Palestra Zend Framework CONAPHP CONISLI

   

Provocação

PHP é muito fácil!

Para que tutorial? Para que treinamento?

Não preciso de orientação a objetos, muito menos de frameworks!

Para que convenções, padrões de codificação, padrões de projeto e essas besteiras todas?

É permitida a reprodução parcial ou total desde que citada a fonte

Page 5: Palestra Zend Framework CONAPHP CONISLI

   

Provocação

O IMPORTANTE 

É QUE FUNCIONA!

Iron Man, created by Stan Lee and Don Heck.Marvel Comics All Rights Reserved.

Page 6: Palestra Zend Framework CONAPHP CONISLI

   

ProvocaçãoFAZ O QUE TEM QUE 

FAZER, NÃO FAZ?

Iron Man, created by Stan Lee and Don Heck. Marvel Comics All Rights Reserved.

Page 7: Palestra Zend Framework CONAPHP CONISLI

   

Motivação

Dilbert created by Scott Adams. All Rights Reserved.

Page 8: Palestra Zend Framework CONAPHP CONISLI

   

Motivação

Dilbert created by Scott Adams. All Rights Reserved.

Page 9: Palestra Zend Framework CONAPHP CONISLI

   

Motivação

Joker created by Bob Kane. DC Comics All Reserved

PENSE NO

FUTURO!

Page 10: Palestra Zend Framework CONAPHP CONISLI

   

Motivação

● Simples é mais fácil de usar.● Simples é mais estável, e menos propenso a erros.

● Simples é mais compatível.● Simples é mais fácil de manter.

“As coisas devem ser feitas tão simples quanto  for possível, mas não de  forma simplista.

Albert Einstein

É permitida a reprodução parcial ou total desde que citada a fonte

Page 11: Palestra Zend Framework CONAPHP CONISLI

   

MotivaçãoNão seria maravilhoso se todos os programadores 

PHP do mundo trabalhassem de uma forma padronizada, de modo que pudessem 

compartilhar seus componentes e reutilizar 

milhares de linhas de código fonte?

Deve ser um sonho...

O´Reilly Media All rights reserved.

Page 12: Palestra Zend Framework CONAPHP CONISLI

   

O que é Zend Framework?

● É um framework “self­service”: use o que você precisa

● Fracamente acoplado● Fácil integração com qualquer outro framework● Só PHP 5● Disponível em http://framework.zend.com 

É permitida a reprodução parcial ou total desde que citada a fonte

Page 13: Palestra Zend Framework CONAPHP CONISLI

   

Amigável... para negócios

● Todo código licenciado sob new BSD (livre mesmo!)

● CLA – Requerido para contribuição, mas evita problemas de roubo de propriedade industrial

● Certificação oficial● Mantido ativamente pela Zend

É permitida a reprodução parcial ou total desde que citada a fonte

Page 14: Palestra Zend Framework CONAPHP CONISLI

   

Por que usar Zend Framework?

Iron Man, created by Stan Lee and Don Heck. Marvel Comics All Rights Reserved.

SIMPLICIDADE, CONHEÇA O 

PODER!

Page 15: Palestra Zend Framework CONAPHP CONISLI

   

Por que usar Zend Framework?

● Simples, porém poderoso!● Toda a parte incômoda dos bits já está feita!● Projeto moderno: PHP 5, OO● Resolve 80% do espaço de problema● Flexível e configurável para os 20% restantes● Comprometido em minimizar quebras no controle de negócios

É permitida a reprodução parcial ou total desde que citada a fonte

Page 16: Palestra Zend Framework CONAPHP CONISLI

   

Arquitetura

É um framework, não apenas componentes● “Cola” para construir aplicações● Ferramenta para incrementar a produtividade● Componentes desenvolvidos e testados juntos

Use somente o que você precisa, mas● Ele sempre será distribuido em sua totalidade● Atualização feita sempre em um clique.

Ainda  trabalha  com  outros  (PEAR,  Smarty, etc)

É permitida a reprodução parcial ou total desde que citada a fonte

Page 17: Palestra Zend Framework CONAPHP CONISLI

   

Arquitetura

Dengeki Sentai Changeman. Toei Company Limited. All Rights Reserved

Page 18: Palestra Zend Framework CONAPHP CONISLI

   

Arquitetura

Page 19: Palestra Zend Framework CONAPHP CONISLI

   

O que há no Zend Framework?

● Model­View­Controller● Dados: banco de dados, JSON, PDF, busca● I18n: localização, tradução, data, moeda● Web services: consumo e disponibilização● Serviços de infra­estrutura: autenticação, listas de controle de acesso, cache, config, log, mail, session

É permitida a reprodução parcial ou total desde que citada a fonte

Page 20: Palestra Zend Framework CONAPHP CONISLI

   

Processo de Desenvolvimento

● Estrita  aderência  aos  Padrões  de  Codificação Zend.

● Todas  as  classes  completamente  testadas  com PHPUnit.

● Revisão por pares e aprovação de todo código.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 21: Palestra Zend Framework CONAPHP CONISLI

   

Recursos disponíveis

● Documentação on­line● Comunidade● Fóruns, listas de discussão, IRC (#zftalk)www.zfbrasil.com ● Livros disponíveis● Modelo de negócio de software livre: projeto com apoio de grandes empresas

É permitida a reprodução parcial ou total desde que citada a fonte

Page 22: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Desafio: Modernizar uma aplicação PHP 4 complexa e de alto­tráfico

Para  nós  um  framework  MVC  foi  um  fator  crítico,  mas também  foi  ótimo  ver  que  Zend  Framework  tinha  muito mais  características  robustas com as quais poderíamos crescer,  incluindo  um  excelente  suporte  para internacionalização.

Marcus ErikssonLíder Desenvolvedor

É permitida a reprodução parcial ou total desde que citada a fonte

bwin Games AB, subsidiária da bwin Interactive Entertainment AG

Page 23: Palestra Zend Framework CONAPHP CONISLI

   

DepoimentosDesafios: 

Necessidade  que  os  componentes  PHP  que  eles tinham  construído  fossem  amplamente  reutilizados na IBM;

Necessidade de suportar múltiplos bancos de dados facilmente;

Necessidade  de  um  framework  limpo,  confiável  e suportado pela comunidade;

Não  inventar  um  novo  framework,  mesmo  a  IBM tendo recursos para tanto.É permitida a reprodução parcial ou total desde que citada a fonte

Page 24: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Zend Framework era focado justamente nas áreas certas para nós. Nosso time ganhou muito tempo e economizou esforço  usando  os  blocos  de  construção  do  Zend Framework em nosso projeto QEDWiki*.

Stewart NickolasArquiteto Líder

* QEDWiki é uma aplicação Web 2.0É permitida a reprodução parcial ou total desde que citada a fonte

Page 25: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Desafios: Construir uma plataforma de longa duração, usando as melhores práticas e padrões de projeto para melhorar aplicações e a performance 

para a rede de sites da comunidade IGN.

É permitida a reprodução parcial ou total desde que citada a fonte

IGN Entertainment, divisão da Fox Interactive Media

Page 26: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Zend  Framework  é  incrivelmente  efetivo  para  a  IGN porque  ele  não  impõe  sua  estrutura  e  permite  que  nós tomemos nossas próprias decisões arquiteturais.

Tony FordGerente de Engenharia

É permitida a reprodução parcial ou total desde que citada a fonte

IGN Entertainment, divisão da Fox Interactive Media

Page 27: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Desafios:  Outras  bibliotecas  eram  muito  difíceis  de instalar,  desenvolver,  estender  e  distribuir  e  eles ainda queriam maior performance dos sites que eles administravam.

É permitida a reprodução parcial ou total desde que citada a fonte

Indianapolis Motor Speedway

Page 28: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Tivemos uma queda de 20% no tempo de carregamento das  páginas  desde  que  começamos  a  usar  Zend Framework. Isso é significativo para sites de alto tráfego como os nossos.

Jon WhitcraftLíder Desenvolvedor de Aplicações

É permitida a reprodução parcial ou total desde que citada a fonte

Indianapolis Motor Speedway

Page 29: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Desafios: 

O  custo  associado  com  treinamento  de  novos desenvolvedores era muito alto.

Suportar seu próprio framework caseiro sem o conhecimento de uma comunidade open­source estava provando ser difícil

Necessidade  de  um  “framework  profissional  que  tivesse suporte”, uma empresa por trás para a qual os contribuidores Magento pudessem se dirigir para suporte.

É permitida a reprodução parcial ou total desde que citada a fonte

Plataforma de e­Commerce de código aberto

Page 30: Palestra Zend Framework CONAPHP CONISLI

   

Depoimentos

Com  quase  meio  milhão  de  downloads  de  Magento, traduções em mais de 60 línguas, comunidade de 30 mil membros,  mais  de  70  parceiros,  e  com  mais  de  150 extensões  Magento  Connect  escritas,  a  plataforma Magento  eCommerce  alcançou  claramente  um  sucesso agressivo e dirige um número significativo de transações web comerciais. 

Roy RubinCEO

É permitida a reprodução parcial ou total desde que citada a fonte

Plataforma de e­Commerce de código aberto

Page 31: Palestra Zend Framework CONAPHP CONISLI

   

Ferramenta

Plugin PDT (PHP Development Tools)

Plugin para a plataforma Eclipsehttp://www.eclipse.org/pdt/ 

Recomendação:  Eclipse  Europa  3.3.2  (porque garanto que a versão 1.0.3  do PDT funciona)

É permitida a reprodução parcial ou total desde que citada a fonte

Page 32: Palestra Zend Framework CONAPHP CONISLI

   

Ferramenta

Release 2.0 prometido para 29/12/2008

Funcionará no Eclipse Ganymede

É permitida a reprodução parcial ou total desde que citada a fonte

Page 33: Palestra Zend Framework CONAPHP CONISLI

   

FluxoMVC do ZF

É permitida a reprodução parcial ou total desde que citada a fonte

Page 34: Palestra Zend Framework CONAPHP CONISLI

   

MVC

ModeloTudo  o  que  é  usado  pela  aplicação  para  fazer algo de útil: dados, web services, feeds, etc.

VisãoA página devolvida para o usuário.

ControladorGerencia  o ambiente de requisição e determina o que acontece.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 35: Palestra Zend Framework CONAPHP CONISLI

   

Interações MVC

Controlador <­> VisãoO Controlador e a Visão podem interagir.

Controlador <­> ModeloO Controlador pode puxar dados do modelo para decidir algo, ou empurrar dados para o modelo.

View <­ ModeloA  Visão  pode  acessar  o  modelo  para  recuperar dados, mas não pode gravar nele.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 36: Palestra Zend Framework CONAPHP CONISLI

   

MVC

Letra C: Zend_Controller

É permitida a reprodução parcial ou total desde que citada a fonte

Page 37: Palestra Zend Framework CONAPHP CONISLI

   

Front Controller

É permitida a reprodução parcial ou total desde que citada a fonte

Page 38: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front

A  classe  Zend_Controller_Front  implementa  o padrão de projeto Front Controller.

Esse padrão prevê um objeto que:● Manipula todas as requisições.● Delega  requisições  para  os  'Page  Controllers' manipular.

● Devolve a resposta. 

É permitida a reprodução parcial ou total desde que citada a fonte

Page 39: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Responsabilidades

Objeto  Request:  contém  todas  as  informações sobre o ambiente de requisição.

Objeto Router: decompõe o ambiente em vários tokens  representando  o  módulo,  controlador  e ação atuais.

Objeto  Dispatcher:  mapeia  os  tokens  de roteamento  para  as  classes  controladoras  de ação e métodos, e executa­os.

Objeto Response: contém a resposta completa e tem a habilidade para enviá­la.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 40: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Diagrama de Processo

É permitida a reprodução parcial ou total desde que citada a fonte

Page 41: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Laço Despachante

Método  dispatch()  manipula  a  entrada  de requisições

Instancia  objetos  de  requisição  e  resposta  se  não foram previamente configurados.

Requisita rotas. Entra em um laço despachante

● Ação de despacho Instancia o controlador de ação Chama o método de ação

● Despacha até que o objeto de requisição não reporte mais ações a serem despachadas.

Retorna resposta (envia por padrão)É permitida a reprodução parcial ou total desde que citada a fonte

Page 42: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Roteamento

Roteamento Padrão: /controller/action /controller/action/key1/value1/key2/value2 /module/controller/action /module/controller/action/key1/value1/...

Outras rotas podem ser configuradas

É permitida a reprodução parcial ou total desde que citada a fonte

Page 43: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Roteamento

Modificando o roteamento: Reescreva o roteador: Zend_Controller_Router_Rewrite é a implementação 

de roteador padrão Permite  a  anexação  de  tantas  rotas  nomeadas 

quanto se desejar● Rotas  nomeadas  permitem  empurrar  rotas  para 

operações  posteriores,  tais  como  montagem  de  URL ou determinar o que se casa com uma URL

Rotas são executadas em ordem LIFO A  interface  Route  permite  a  definição  de  seus 

próprios tipos de rota para suas aplicaçõesÉ permitida a reprodução parcial ou total desde que citada a fonte

Page 44: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Roteamento

Criando uma nova rota:• Quero casar isso:  /news/view/12• Rota:  /news/view/:id

É permitida a reprodução parcial ou total desde que citada a fonte

Page 45: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Front: Roteamento

$defaults = array('controller'  => 'news','action' => 'view'

);$requirement = array(

'id' => '\d+', // permite 1 ou + dígitos);

$route = new Zend_Controller_Router_Route('news/view/:id',$defaults,$requirement);

// Zend_Controller_Router_Rewrite$router = $frontController­>getRouter();

$router­>addRoute('newsItem',$route);

$frontController­>setRouter($router);

É permitida a reprodução parcial ou total desde que citada a fonte

Page 46: Palestra Zend Framework CONAPHP CONISLI

   

Page Controller

Zend_Controller_Action implementa o padrão de projeto Page Controller.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 47: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

Action Controllers: Classes simples que estendem Zend_Controller_Action O nome da classe termina em 'Controller'

● IndexController● BlogController

CamelCasing permitido● FooBarController● Separa palavras CamelCased em URLs com '­' (hífen)

foo­bar

É permitida a reprodução parcial ou total desde que citada a fonte

Page 48: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

Controllers Actions: Método que o Action Controller deve executar Métodos públicos que terminam em 'Action'

● barAction● indexAction

CamelCasing permitido● fooBarAction()● Separa palavras CamelCased em URLs com '­' (hífen)

foo­bar

É permitida a reprodução parcial ou total desde que citada a fonte

Page 49: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

O  Controlador  de  Ação  está  preparado  para  tratar  os seguintes eventos:

init(): instanciação do objeto preDispatch(): antes que a ação seja despachada. postDispatch(): depois que a ação foi executada.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 50: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

Métodos utilitários:● _forward($action,$controller  =  null,  $module  =  null, 

array $params = null): desvia o processamento para outra ação.

● _redirect($url): redireciona para outra URL.● render($action,$name,$noController): renderiza um script 

de visão alternativo.● _call($method,  $params):  usado  para  criar  ações 

'dinâmicas'  ou  internamente  para  desviar  para  uma  ação padrão.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 51: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

ViewRenderer

● A integração com a Visão está disponível automaticamente● Registrado pelo action helper ViewRenderer● Pode ser desabilitado● A propriedade   $view do controlador contém um objeto de 

visão● Associa variáveis à visão:  $this­>view­>model = $model;

Pode ser obtido assim:Zend_Controller_Action_HelperBroker::getStaticHelper('view

Renderer')

É permitida a reprodução parcial ou total desde que citada a fonte

Page 52: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

View  scripts  são  renderizados  automaticamente durante o evento postDispatch()

View  scripts  são  nomeados  de  acordo  com  o controlador e a ação:● FooController::barAction() renderiza foo/bar.phtml● NewsController::listAction() renderiza news/list.phtml

Desabilitando o ViewRenderer● setNoRender() o desabilitará para a ação atual● Chamar  _forward()  ou  _redirect()  nunca  renderiza 

automaticamente

É permitida a reprodução parcial ou total desde que citada a fonte

Page 53: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

Customizando o ViewRenderer: setView()

Configura  o  objeto  de  Visão  (permite  implementaçoes customizadas de visão!)

setViewSuffix() Altera o sufixo de arquivo usado

setView(Base|Script)PathSpec() Configura  a  especificação  de  caminho  usada  para 

autodeterminação do local das visões setResponseSegment()

Configura o segmento de  resposta nomeado para o qual renderizar

É permitida a reprodução parcial ou total desde que citada a fonte

Page 54: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Controller_Action: Básico

Módulos: Um  conjunto  de  controladores  de  ação,  modelos  e 

visões relacionados. Estrutura  de  diretórios  mimetiza  estrutura  de  diretório 

de application:● controllers● models● views

Nomes de classes controladoras devem ser prefixadas com o nome do módulo:Foo_ViewController­>foo/controllers/ViewController.php

Nomes  de  módulo  podem  ser  camelCased  ;  valem  as regras para controladores.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 55: Palestra Zend Framework CONAPHP CONISLI

   

MVC

Letra V: Zend_View

É permitida a reprodução parcial ou total desde que citada a fonte

Page 56: Palestra Zend Framework CONAPHP CONISLI

   

Zend_View: Introdução

Implemente  Zend_View_Interface  para  criar  seu próprios mecanismo de templateA  implementação  padrão  (Zend_View)  usa  PHP  como linguagem de templateAssocia  e  recupera  variáveis  de  visão  como  se  elas fosse variáveis membro de um objeto:  $view­>content = $bodyAcessa  variáveis  de  visão  em  view  scripts  a  partir  do objeto $this:  <?= $this­>content ?>Benefícios: Todo o PHP está a sua disposiçãoProblemas: Todo o PHP está a sua disposição

É permitida a reprodução parcial ou total desde que citada a fonte

Page 57: Palestra Zend Framework CONAPHP CONISLI

   

Zend_View: View Scripts

Mistura HTML e PHPAcessa variáveis de template usando a notação $thisMantém variáveis associadas em seu próprio escopoDistingue  facilmente  variáveis  associadas  de  variáveis locaisFácil  implementação  de  placeholder:  simplesmente associa  a  partir  de  view  scripts  e  usa  mais  tarde  em view scripts

É permitida a reprodução parcial ou total desde que citada a fonte

Page 58: Palestra Zend Framework CONAPHP CONISLI

   

Zend_View: View Scripts

Usa tags curtas do PHP para uma notação sucinta:

<?= $this­>content ?>

É permitida a reprodução parcial ou total desde que citada a fonte

Page 59: Palestra Zend Framework CONAPHP CONISLI

   

Zend_View: View Helpers

Classes que estendem a funcionalidade de Zend_ViewUsam

Modelos  de  acesso  (por  exemplo,  adiciona  um  feed   del.icio.us à sua página)Formata ou trata saída (por exemplo transforma texto wiki para XHTML)Lógica de exibição  (por exemplo, mostra botões de  login se o usuário não estiver logado)Snippets  de exibição  reutilizáveis  (por  exemplo,  caixa de busca)

É permitida a reprodução parcial ou total desde que citada a fonte

Page 60: Palestra Zend Framework CONAPHP CONISLI

   

Zend_View: View Helpers

UsandoView Helpers:Chame como se o helper fosse um método do objeto de 

visão

<?=$this­>formText('username') ?>

É permitida a reprodução parcial ou total desde que citada a fonte

Page 61: Palestra Zend Framework CONAPHP CONISLI

   

MVC

Zend_...: Cadê o 'M'?

É permitida a reprodução parcial ou total desde que citada a fonte

Page 62: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Model?

O que é um Modelo?Banco de dadosWeb ServicesFeedsArquivos de configuraçãoSistema de arquivosImagens

É permitida a reprodução parcial ou total desde que citada a fonte

Page 63: Palestra Zend Framework CONAPHP CONISLI

   

Zend_Model?

Como o Zend Framework endereça o Modelo?Na verdade, ele ainda não faz isso, ao menos não como um um componente generalizado.Mas o modelo é suportado com componentes especializados:Zend_Db_TableZend_ServiceZend_Feedetc.

É permitida a reprodução parcial ou total desde que citada a fonte

Page 64: Palestra Zend Framework CONAPHP CONISLI

   

MVC

Colocando tudo junto

É permitida a reprodução parcial ou total desde que citada a fonte

Page 65: Palestra Zend Framework CONAPHP CONISLI

   

MVC

Alô Mundo com ZF

É permitida a reprodução parcial ou total desde que citada a fonte

Page 66: Palestra Zend Framework CONAPHP CONISLI

   

MVC

CRUD

É permitida a reprodução parcial ou total desde que citada a fonte

Page 67: Palestra Zend Framework CONAPHP CONISLI

   

Referências

Allen, R. Zend Framework Overview. 29/08/2008.O'Phinney,  M.  W.  Zend  Framework:  Creating  a CRUD Application. 28/02/2007.

IDEM.  Zend  Framework  MVC  Quick  Start. 09/10/2007.

É permitida a reprodução parcial ou total desde que citada a fonte