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 = " 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.