Tecnologia -> Linguagem -> PHP -> ZendFrameWork -> Boleto com ZendFrameWork


Zend Action Helper para Boleto PHP

Ja precisei do Boleto PHP em diversas situações, mas sempre me deparo com um problema, como integrar as funções do Boleto PHP com o Zend Framework, ja que ambos possuem arquiteturas tão distintas, pensando nisso elaborei esse Helper para facilitar a implementação de boletos nos actions, comecemos pelo basico…
preparando o Zend Framework para trabalhar com Action Helpers
application.ini (ou outro nome que vc da a seu arquivo de configuração)
resources.frontController.actionhelperpaths.My_Controller_Action_Helper = APPLICATION_PATH "/controllers/helpers"

bootstrap.php
protected function _initAutoload() {

  $autoloader = new Zend_Application_Module_Autoloader(array(

    'namespace' => 'My',

    'basePath'  => dirname(__FILE__),

  ));

  return $autoloader;

 }

/application/controllers/helpers/boleto.php
esse é o helper propriamente dito, ele redefine todas as estruturas do boleto php para trabalhar internamente no Zend
<?php

class My_Controller_Action_Helper_Boleto extends Zend_Controller_Action_Helper_Abstract

{

 protected $_options = null;

 protected $_output = '';

 protected $banco;

 protected $dados;

 protected $dir = 'BoletoPHP';

 protected $logo;

 

 //permite a chamada direta do helper

 protected function action(array $options = null)

 {

  $this->_options = $options;

  return $this;

 }

 public function init(){

  //retira o layout

  $this->getActionController()->getHelper('layout')->disableLayout();

  //retira o view

  $this->getActionController()->getHelper('viewRenderer')->setNoRender();

 }

 //seta uma logomarca, caso essa logomarca nao seja setada, sera usada a padrão do boletophp

 public function setLogo($logo){

  $this->logo = $logo;

 }

 //seta os dados do boleto

 public function setDados($dados){

  //transforma os dados em um array, forma padrao do boleto php

  $this->dados = (array)$dados;

 }

 //seta a pasta do boletophp, caso queira modificar

 public function setDir($dir = 'BoletoPHP'){

  $this->dir = $dir;

 }

 //seta o banco do boleto

 public function setBanco($banco){

  $this->banco = $banco;

 }

 //funcao render do boleto

 public function geraBoleto(){

  //aloca a variavel global para a o $dadosboleto (padrao do boleto php)

  $dadosboleto = $this->dados;

  foreach ($dadosboleto as $key => $dados){

   if(is_string($dados)){

    //descoverte as strings utf (necessario para rodar no zend, ja que todo o projeto esta em utf8)

    $dadosboleto[$key] = utf8_decode($dados);

   }

  }

  // corrige uma pequena quebra de padrao do boleto php

  $data_venc = $dadosboleto['data_vencimento'];

  //inclue os dois arquivos do boleto

  include($this->dir."/include/funcoes_".$this->banco.".php");

  include($this->dir."/include/layout_".$this->banco.".php");

 }

 //instancia cada imagem em um novo endereco normalizado com o zend framework

 public function imagens(){

  $requestUri = explode('/', $this->getRequest()->getRequestUri());

  foreach($requestUri as $key => $requestParam){

   if($requestParam == 'imagens'){

    $finalKey = $key+1;

    break;

   }

  }

  //caso a logo seja definida pelo usuario, faz a troca da imagem logo_empresa.png (padrao do boleto php)

  if($requestUri[$finalKey] == 'logo_empresa.png' && !empty($this->logo)){

   $filename = $this->getFullUrl($this->logo);

  }else{

   $filename = APPLICATION_PATH.'/../library/'.$this->dir.'/imagens/'.$requestUri[$finalKey];

   

  }

  //re-renderiza cada imagem solicitada com o caminho normalizado

  $image = file_get_contents($filename);

  $this->getResponse()->clearBody ();

  $this->getResponse()->setHeader('Content-Type', 'image/jpeg');

  $this->getResponse()->setBody($image);

 }

 //para normalizacao da nova logo, refaz o o endereço da nova imagem para a nova renderização

 protected function getFullUrl($url){

  $proto = strtolower(preg_replace('/[^a-zA-Z]/','',$_SERVER['SERVER_PROTOCOL']));

  $baseUrl = $this->getRequest()->getHttpHost().$this->getRequest()->getBasePath();

  return $proto.'://'.$baseUrl.$url;

 }

 //acesso ao metodo direct

 public function direct(array $options = null) 

    {

     

        return $this->action($options);

        

    }

}

//classe vazia para store dos dados do boleto

class DadosBoleto extends stdClass{

 

}

No controlador vamos por duas actions, por que? bom, por o boleto php trabalha com imagens fora do diretorio public (estrutura padrao do zend) nesse caso a action imagens, vai servir como um “redirecionador” das imagens originais da lib e a action boleto, ira renderizar o boleto em si.
public function boletoAction(){

     //instancia o helper boleto

     $boleto = $this->_helper->boleto();

     //instancia um objeto vazio para alocar os dados

     $dadosboleto = new DadosBoleto();

     // Carteira SR: 80, 81 ou 82  -  Carteira CR: 90 (Confirmar com gerente qual usar)

     $dadosboleto->inicio_nosso_numero = "80";  

     // Nosso numero sem o DV - REGRA: Máximo de 8 caracteres!

     $dadosboleto->nosso_numero = "19525086";  

     // Num do pedido ou do documento

     $dadosboleto->numero_documento = "27.030195.10";

     // Data de Vencimento do Boleto - REGRA: Formato DD/MM/AAAA // Prazo de X dias  OU  informe data: "13/04/2006"  OU  informe "" se Contra Apresentacao;

     $dadosboleto->data_vencimento = date("d/m/Y", time() + (5 * 86400)); 

     // Data de emissão do Boleto

     $dadosboleto->data_documento = date("d/m/Y"); 

     // Data de processamento do boleto (opcional)

     $dadosboleto->data_processamento = date("d/m/Y"); 

     // Valor - REGRA: Sem pontos na milhar e tanto faz com "." ou "," ou com 1 ou 2 ou sem casa decimal;  

     // Valor do Boleto - REGRA: Com vírgula e sempre com duas casas depois da virgula

     $dadosboleto->valor_boleto = number_format(str_replace(",", ".","2950,00")+2.95, 2, ',', ''); 

     

     // DADOS DO SEU CLIENTE

     $dadosboleto->sacado = "Nome do seu Cliente";

     $dadosboleto->endereco1 = "Endereço do seu Cliente";

     $dadosboleto->endereco2 = "Cidade - Estado -  CEP: 00000-000";

     

     // INFORMACOES PARA O CLIENTE

     $dadosboleto->demonstrativo1 = "Pagamento de Compra na Loja Nonononono";

     $dadosboleto->demonstrativo2 = "Mensalidade referente a nonon nonooon nononon<br>Taxa bancária - R$ ".number_format(2.95, 2, ',', '');

     $dadosboleto->demonstrativo3 = "BoletoPhp - http://www.boletophp.com.br";

     

     // INSTRUÇÕES PARA O CAIXA

     $dadosboleto->instrucoes1 = "- Sr. Caixa, cobrar multa de 2% após o vencimento";

     $dadosboleto->instrucoes2 = "- Receber até 10 dias após o vencimento";

     $dadosboleto->instrucoes3 = "- Em caso de dúvidas entre em contato conosco: xxxx@xxxx.com.br";

     $dadosboleto->instrucoes4 = "&nbsp; Emitido pelo sistema Projeto BoletoPhp - www.boletophp.com.br";

     

     // DADOS OPCIONAIS DE ACORDO COM O BANCO OU CLIENTE

     $dadosboleto->quantidade = "";

     $dadosboleto->valor_unitario = "";

     $dadosboleto->aceite = "";

     $dadosboleto->especie = "R$";

     $dadosboleto->especie_doc = "";



     // ---------------------- DADOS FIXOS DE CONFIGURAÇÃO DO SEU BOLETO --------------- //

     

     // DADOS DA SUA CONTA - CEF

     // Num da agencia, sem digito

     $dadosboleto->agencia = "1565"; 

     // Num da conta, sem digito

     $dadosboleto->conta = "13877";  

     // Digito do Num da conta

     $dadosboleto->conta_dv = "4";  

     

     // DADOS PERSONALIZADOS - CEF

     // ContaCedente do Cliente, sem digito (Somente Números)

     $dadosboleto->conta_cedente = "87000000414"; 

     // Digito da ContaCedente do Cliente

     $dadosboleto->conta_cedente_dv = "3"; 

     // Código da Carteira: pode ser SR (Sem Registro) ou CR (Com Registro) - (Confirmar com gerente qual usar)

     $dadosboleto->carteira = "SR"; 

     

     // SEUS DADOS

     $dadosboleto->identificacao = "BoletoPhp - Código Aberto de Sistema de Boletos";

     $dadosboleto->cpf_cnpj = "";

     $dadosboleto->endereco = "Coloque o endereço da sua empresa aqui";

     $dadosboleto->cidade_uf = "Cidade / Estado";

     $dadosboleto->cedente = "Coloque a Razão Social da sua empresa aqui";

  

     //envia os dados para o helper

     $boleto->setDados($dadosboleto);

     //seta qual o banco do boleto

     $boleto->setBanco('real'); 

     //renderiza o boleto

     $boleto->geraBoleto();

    }

    public function imagensAction(){

     //instancia o helper boleto

     $boleto = $this->_helper->boleto();

     //seta uma nova logo

     $boleto->setLogo("/images/site/logo.gif");

     //renderiza todas as imagens

     $boleto->imagens();

    }

Como podem ver, utilizei como exemplo o boleto da caixa, porem pode ser usado com todos, apenas trocando os dados pelo requerido pelo banco, para saber quais sao, eh so olhar os arquivos do boleto php, toda a nomenclatura foi mantida, mudando apenas de chaves de array, para parametros de classe, para ficar mais amigável e para manter a estrutura utilizada pelo zend.