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.