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 (6)


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á 17 dias) - Ver alterações
AN

Ok Ivan, muito grato

Vou testar estes códigos!