Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
loop na exitAction na busca de cep ...
AN
loop na exitAction na busca de cep  
 
  1. <?php
  2. public static function buscaCep($param)
  3. {
  4. $cep = $param['cep'];
  5. $resultado = @file_get_contents("https://viacep.com.br/ws/" . $cep . "/json/");
  6. echo $resultado;
  7. $retorno = json_decode($resultado);
  8. if ($retorno)
  9. {
  10. $objects = new stdClass;
  11. $objects->cep = $param['cep'];
  12. $objects->logradouro = $retorno->logradouro;
  13. $objects->bairro = $retorno->bairro;
  14. $objects->cidade = $retorno->localidade;
  15. $objects->estado = $retorno->uf;
  16. TForm::sendData('form_Clientes', $objects);
  17. }
  18. }
  19. ?>

Este código busca o cep, coloca nos campos e fica em loop, já fiz "N" pesquisas e várias tentativas e não consegui parar o loop.
Tenho certeza que já resolveram este problema, alguém pode auxiliar?

Muito grato.

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (7)


IF

Olá Antônio.
eu fiz um teste isolado usando a sua lógica e deu certo aqui. Talvez seja alguma coisa com o seu formulário.

 
  1. <?php
  2. class TesteCep extends TPage
  3. {
  4. protected $form; // form
  5. /**
  6. * Page constructor
  7. */
  8. public function __construct()
  9. {
  10. parent::__construct();
  11. $this->form = new BootstrapFormBuilder('form_Clientes');
  12. $this->form->setFormTitle('Teste cep');
  13. $this->form->setFieldSizes('100%');
  14. $cep = new TEntry('cep');
  15. $cep->setMask('00000-000');
  16. $logradouro = new TEntry('logradouro');
  17. $bairro = new TEntry('bairro');
  18. $cidade = new TEntry('cidade');
  19. $estado = new TEntry('estado');
  20. $btn_cep = TButton::create('btn_cep', [$this, 'buscaCep'], '', 'fa:check green');
  21. $btn_cep->getAction()->setParameter('static','1');
  22. $row = $this->form->addFields([ new TLabel('Cep') , $cep ],
  23. [ $btn_cep ]);
  24. $row->layout = [ 'col-sm-3', 'col-sm-1'];
  25. $row = $this->form->addFields([ new TLabel('Logradouro') , $logradouro ],
  26. [ new TLabel('Bairro'), $bairro ]);
  27. $row->layout = [ 'col-sm-6', 'col-sm-6'];
  28. $row = $this->form->addFields([ new TLabel('Cidade') , $cidade ],
  29. [ new TLabel('Estado'), $estado ]);
  30. $row->layout = [ 'col-sm-6', 'col-sm-6'];
  31. parent::add($this->form);
  32. }
  33. public static function buscaCep($param)
  34. {
  35. $cep = $param['cep'];
  36. $resultado = @file_get_contents("https://viacep.com.br/ws/" . $cep . "/json/");
  37. //echo $resultado;
  38. $retorno = json_decode($resultado);
  39. if ($retorno)
  40. {
  41. $objects = new stdClass;
  42. $objects->cep = $param['cep'];
  43. $objects->logradouro = $retorno->logradouro;
  44. $objects->bairro = $retorno->bairro;
  45. $objects->cidade = $retorno->localidade;
  46. $objects->estado = $retorno->uf;
  47. TForm::sendData('form_Clientes', $objects);
  48. }
  49. }
  50. }
  51. ?>
AN

Ivan, muito grato pelo seu retorno, vc colocou um botão para busca, realmente funciona mas estou usando a exitAction
 
  1. <?php
  2. $cep->setExitAction( new TAction ( [ $this, 'buscaCep' ] ) );
  3. ?>

assim que o cep é digitado os campos são preenchidos automaticamente, após um tab.

Aih coloquei aquele "echo" pra verificar o retorno e verifiquei que o Formulário entra em loop e fica executando o echo.

Tentei para o looping de várias formas e não consegui, alterei o formulário de muitas formas e ainda não parou o looping.

IF

Realmente acho que é um bug do Framework.


Só consegui fazendo uma gambiarra com javascript:


 
  1. <?php
  2. class TesteCep extends TPage
  3. {
  4. protected $form; // form
  5. /**
  6. * Page constructor
  7. */
  8. public function __construct()
  9. {
  10. parent::__construct();
  11. TScript::create('
  12. document.getElementById("cep").addEventListener("blur", function () {
  13. let cep = this.value.replace(/\D/g, "");
  14. if (cep.length === 8) {
  15. fetch("https://viacep.com.br/ws/" + cep + "/json/")
  16. .then(response => response.json())
  17. .then(data => {
  18. document.getElementById("logradouro").value = data.logradouro;
  19. document.getElementById("bairro").value = data.bairro;
  20. document.getElementById("cidade").value = data.localidade;
  21. document.getElementById("estado").value = data.uf;
  22. })
  23. .catch(() => alert("Erro ao buscar o CEP."));
  24. }
  25. });
  26. ');
  27. $this->form = new BootstrapFormBuilder('form_Clientes');
  28. $this->form->setFormTitle('Teste cep');
  29. $this->form->setFieldSizes('100%');
  30. $cep = new TEntry('cep');
  31. $cep->setMask('00000-000');
  32. $cep->setId('cep');
  33. $logradouro = new TEntry('logradouro');
  34. $logradouro->setId('logradouro');
  35. $bairro = new TEntry('bairro');
  36. $bairro->setId('bairro');
  37. $cidade = new TEntry('cidade');
  38. $cidade->setId('cidade');
  39. $estado = new TEntry('estado');
  40. $estado->setId('estado');
  41. $row = $this->form->addFields([ new TLabel('Cep'), $cep ]);
  42. $row->layout = [ 'col-sm-3' ];
  43. $row = $this->form->addFields([ new TLabel('Logradouro') , $logradouro ],
  44. [ new TLabel('Bairro'), $bairro ]);
  45. $row->layout = [ 'col-sm-6', 'col-sm-6'];
  46. $row = $this->form->addFields([ new TLabel('Cidade') , $cidade ],
  47. [ new TLabel('Estado'), $estado ]);
  48. $row->layout = [ 'col-sm-6', 'col-sm-6'];
  49. parent::add($this->form);
  50. }
  51. }
  52. ?>
AN

Eu tenho um script em javascript dentro de um arquivo, vou tentar utilizar ele ou copiar e colar da mesma forma que fez, acho que pode dar certo eu também utilizar pra outros fins também, mas deixo aberto ai pro pessoal do FRAMEWORK, fazer o teste e dar um retorno.
Muito grato Ivan!
LA

Tenta assim:

 
  1. <?php
  2. public static function onCep($param = null) {
  3. /*
  4. * Arquivo usado: app/service/CepService.php
  5. */
  6. try {
  7. $logradouro = CepService::getCep($param['cep'], 'json');
  8. if (isset($logradouro->erro)) {
  9. throw new Exception($logradouro->mensagem);
  10. } else {
  11. $dados = new stdClass();
  12. $dados->logradouro = $logradouro->logradouro;
  13. $dados->numero = $logradouro->complemento;
  14. $dados->bairro = $logradouro->bairro;
  15. $dados->cidade = $logradouro->localidade;
  16. $dados->estado = $logradouro->uf;
  17. TForm::sendData('form_meuform', $dados);
  18. TScript::create('setTimeout(function() { $("input[name=\'numero\']").focus() }, 500);');
  19. }
  20. } catch (Exception $e) {
  21. new TMessage('error', $e->getMessage());
  22. }
  23. }
  24. ?>


app/service/CepService.php

 
  1. <?php
  2. /**
  3. * ConsultaCepService
  4. *
  5. * webservice cliente para buscar os dados do CEP, fornecidos pelo site www.viacep.com.br
  6. * @package service
  7. * @author Ricardo Câmara (camaramachado@gmail.com)
  8. * @version 1.0
  9. */
  10. class CepService {
  11. /**
  12. * Method getCep
  13. * Consulta o CEP utilizando o webservice do site www.viacep.com.br
  14. * @param $cep string - CEP a ser consultado
  15. * @param $formato string - formato da resposta. Suportados json, xml, piped ou querty.
  16. * @return stdClass, XML, string (depende do formato) com os dados do CEP
  17. * Se o CEP não possuir 8 digitos ou não existir, $stdClass->erro retorna TRUE e $stdClass->mensagem informa o erro.
  18. * Exemplo de uso: $endereco = ConsultaCepService::getCep('99999999');
  19. */
  20. public static function getCep($cep, $formato = 'json') {
  21. try {
  22. if (isset($cep)) {
  23. //valida os formatos
  24. $formatos = ['json', 'xml', 'piped', 'querty'];
  25. if (!in_array($formato, $formatos)) {
  26. $retorno = new stdClass;
  27. $retorno->erro = TRUE;
  28. $retorno->mensagem = "Formato <b>{$formato}</b> não suportado!";
  29. return $retorno;
  30. }
  31. //pega apenas os numeros, retirando os demais caracteres
  32. $cep = preg_replace("/[^0-9]/", "", $cep);
  33. //o CEP deve ter 8 digitos
  34. if (strlen($cep) != 8) {
  35. $retorno = new stdClass;
  36. $retorno->erro = TRUE;
  37. $retorno->mensagem = "CEP: <b>{$cep}</b> não possui 8 digitos!";
  38. return $retorno;
  39. }
  40. switch ($formato) {
  41. case 'json':
  42. $retorno = json_decode(file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}"));
  43. break;
  44. case 'xml':
  45. $retorno = htmlentities(file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}"));
  46. break;
  47. case 'piped':
  48. $retorno = file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
  49. break;
  50. case 'querty':
  51. $retorno = file_get_contents("https://viacep.com.br/ws/{$cep}/{$formato}");
  52. break;
  53. }
  54. //checa se o cep não existe, neste caso o atributo erro será TRUE
  55. if (isset($retorno->erro)) {
  56. $retorno->mensagem = "CEP: <b>{$cep}</b> não existe na base de dados!";
  57. }
  58. return $retorno;
  59. }
  60. } catch (Exception $e) {
  61. echo 'Error: ' . $e->getMessage();
  62. }
  63. }
  64. }
  65. /* --------------------------------------------------------------------------- */
  66. // FORMATO JSON
  67. // Retorno quando o CEP existe:
  68. /*
  69. stdClass Object
  70. (
  71. [cep] => 51111-000
  72. [logradouro] => Avenida Boa Viagem
  73. [complemento] => de 1382/1383 a 2173/2174
  74. [bairro] => Boa Viagem
  75. [localidade] => Recife
  76. [uf] => PE
  77. [unidade] =>
  78. [ibge] => 2611606
  79. [gia] =>
  80. )
  81. */
  82. // Retorno quando o CEP não tem 8 digitos:
  83. /*
  84. stdClass Object
  85. (
  86. [erro] => 1
  87. [mensagem] => CEP: 5111100 não existe na base de dados!
  88. )
  89. */
  90. // Retorno quando o CEP não existe:
  91. /*
  92. stdClass Object
  93. (
  94. [erro] => 1
  95. [mensagem] => CEP: 99999999 não existe na base de dados!
  96. )
  97. */
  98. // Retorno se o formato não for suportado
  99. /*
  100. stdClass Object
  101. (
  102. [erro] => 1
  103. [mensagem] => Formato java não suportado!
  104. )
  105. */
  106. ?>






Editado 23/07/2025 (há 1 mês) - Ver alterações
AN

Ok Ivan, muito grato

Vou testar estes códigos!
JL

Implementando Loopback para Consumo de APIs com Adianti

No desenvolvimento de um formulário de censo onde trabalho, precisei consumir 3 APIs diferentes.
Um dos desafios foi garantir a disponibilidade: se uma das APIs ficasse fora do ar, o sistema não poderia parar.

Pra resolver, implementei um loopback inteligente:
O sistema tenta acessar a primeira API;
Se ela estiver indisponível, automaticamente chama a próxima.

Caso ainda precise falar CMG por email ou por aqui que posto ou te envio...
joaodevtool@gmail.com