Validação CPF e CNPJ com onChangeRadio Olá pessoal Estou dando continuidade em testes para aprofundar no framework, e na minha última dúvida que foi esclarecida estou agora fazendo mais uma implementação. Seguindo o conceito de habilitar e desabilitar campo, implementei uma validação de CPF e CNPJ. É basicamente o mesmo código fonte com as respectivas validações, mais com um problema semelhante ao post anteri...
HB
Validação CPF e CNPJ com onChangeRadio  
Olá pessoal

Estou dando continuidade em testes para aprofundar no framework, e na minha última dúvida que foi esclarecida estou agora fazendo mais uma implementação.

Seguindo o conceito de habilitar e desabilitar campo, implementei uma validação de CPF e CNPJ.

É basicamente o mesmo código fonte com as respectivas validações, mais com um problema semelhante ao post anterior ((www.adianti.com.br/forum/pt/view_3918?problema-com-onchangeradio-no-)),
só que agora com a seguinte situação:

Seu eu marco a opção 1 do array('1'=>'Física') a aplicação grava corretamente e no caso de inconsistência do CPF é emitida a mensagem e os valores continuam no formulário para que eu faça a digitação correta do CPF.
Agora, se eu marco a opção 2 do array('2'=>'Jurídica') e não havendo inconsistência do CNPJ a gravação fica correta, porém, se não for um CNPJ válido a validação é acionada, só que os campos do CNPJ ficam desabilitados e os dados não permanecem na tela para que eu faça a digitação correta do CNPJ.

Vejam na imagem no anexo.

Podem me ajudar com mais essa situação?

Código Fonte
 
  1. <?php
  2. /**
  3. * TestetresForm Form
  4. * @author <your name here>
  5. */
  6. class TestetresForm extends TPage
  7. {
  8. protected $form; // form
  9. /**
  10. * Form constructor
  11. * @param $param Request
  12. */
  13. public function __construct( $param )
  14. {
  15. parent::__construct();
  16. // creates the form
  17. $this->form = new TQuickForm('form_Testetres');
  18. $this->form->class = 'tform'; // change CSS class
  19. $this->form = new BootstrapFormWrapper($this->form);
  20. $this->form->style = 'display: table;width:70%'; // change style
  21. // define the form title
  22. $this->form->setFormTitle('Testetres');
  23. $radio_enable = new TRadioGroup('testeum_id');
  24. $radio_enable->addItems(array('1'=>'Física', '2'=>'Jurídica'));
  25. $radio_enable->setLayout('horizontal');
  26. $radio_enable->setValue(1);
  27. // create the form fields
  28. $id = new TEntry('id');
  29. $campo1 = new TEntry('campo1');
  30. $campo2 = new TEntry('campo2');
  31. $campo3 = new TEntry('campo3');
  32. $campo4 = new TEntry('campo4');
  33. $campo2->setMask('999.999.999-99');
  34. $campo4->setMask('99.999.999/9999-99');
  35. // add the fields
  36. $this->form->addQuickField('Id', $id, '10%' );
  37. $this->form->addQuickField('Tipo', $radio_enable, 80);
  38. $this->form->addQuickField('CPF', $campo1, '40%' );
  39. $this->form->addQuickField('', $campo2, '40%' );
  40. $this->form->addQuickField('CNPJ', $campo3, '40%' );
  41. $this->form->addQuickField('', $campo4, '40%' );
  42. $radio_enable->setChangeAction( new TAction( array($this, 'onChangeRadio')) );
  43. self::onChangeRadio( array('testeum_id'=>1) );
  44. if (!empty($id))
  45. {
  46. $id->setEditable(FALSE);
  47. }
  48. /** samples
  49. $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  50. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  51. $fieldX->setSize( 100, 40 ); // set size
  52. **/
  53. // create the form actions
  54. $btn = $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
  55. $btn->class = 'btn btn-sm btn-primary';
  56. $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
  57. // vertical box container
  58. $container = new TVBox;
  59. $container->style = 'width: 60%';
  60. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  61. $container->add(TPanelGroup::pack('Validando CPF e CNPJ', $this->form));
  62. parent::add($container);
  63. }
  64. /**
  65. * Save form data
  66. * @param $param Request
  67. */
  68. public function onSave( $param )
  69. {
  70. try
  71. {
  72. TTransaction::open('teste'); // open a transaction
  73. /**
  74. // Enable Debug logger for SQL operations inside the transaction
  75. TTransaction::setLogger(new TLoggerSTD); // standard output
  76. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  77. **/
  78. $this->form->validate(); // validate form data
  79. $object = new Testedois; // create an empty object
  80. $data = $this->form->getData(); // get form data as array
  81. $object->fromArray( (array) $data); // load the object with data
  82. // Valida o CPF
  83. if($data->testeum_id == 1 )
  84. {
  85. $validacpf = new TCPFValidator;
  86. $validacpf->validate('CPF', $data->campo2);
  87. }
  88. // Valida o CNPJ
  89. if($data->testeum_id == 2 )
  90. {
  91. $validator = new TCNPJValidator;
  92. $validator->validate('CNPJ', $data->campo4);
  93. }
  94. $object->store(); // save the object
  95. // get the generated id
  96. $data->id = $object->id;
  97. $obj = new stdClass;
  98. $obj->campo1 = $object->campo1;
  99. $obj->campo2 = $object->campo2;
  100. $obj->campo3 = $object->campo3;
  101. $obj->campo4 = $object->campo4;
  102. self::onChangeRadio(['testeum_id'=>$object->testeum_id]);
  103. TForm::sendData('form_Testetres', $obj);
  104. $this->form->setData($data); // fill form data
  105. TTransaction::close(); // close the transaction
  106. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  107. }
  108. catch (Exception $e) // in case of exception
  109. {
  110. new TMessage('error', $e->getMessage()); // shows the exception error message
  111. $this->form->setData( $this->form->getData() ); // keep form data
  112. TTransaction::rollback(); // undo all pending operations
  113. }
  114. }
  115. /**
  116. * Clear form data
  117. * @param $param Request
  118. */
  119. public function onClear( $param )
  120. {
  121. $this->form->clear(TRUE);
  122. }
  123. /**
  124. * Load object to form data
  125. * @param $param Request
  126. */
  127. public function onEdit( $param )
  128. {
  129. try
  130. {
  131. if (isset($param['key']))
  132. {
  133. $key = $param['key']; // get the parameter $key
  134. TTransaction::open('teste'); // open a transaction
  135. $object = new Testedois($key); // instantiates the Active Record
  136. $this->form->setData($object); // fill the form
  137. TTransaction::close(); // close the transaction
  138. $obj = new stdClass;
  139. $obj->campo1 = $object->campo1;
  140. $obj->campo2 = $object->campo2;
  141. $obj->campo3 = $object->campo3;
  142. $obj->campo4 = $object->campo4;
  143. self::onChangeRadio(['testeum_id'=>$object->testeum_id]);
  144. TForm::sendData('form_Testetres', $obj);
  145. }
  146. else
  147. {
  148. $this->form->clear(TRUE);
  149. }
  150. }
  151. catch (Exception $e) // in case of exception
  152. {
  153. new TMessage('error', $e->getMessage()); // shows the exception error message
  154. TTransaction::rollback(); // undo all pending operations
  155. }
  156. }
  157. /**
  158. * on ChangeRadio change
  159. * @param $param Action parameters
  160. */
  161. public static function onChangeRadio($param)
  162. {
  163. if ($param['testeum_id'] == 1)
  164. {
  165. TEntry::enableField('form_Testetres', 'campo1');
  166. TEntry::enableField('form_Testetres', 'campo2');
  167. TEntry::disableField('form_Testetres', 'campo3');
  168. TEntry::disableField('form_Testetres', 'campo4');
  169. TEntry::clearField('form_Testetres', 'campo3');
  170. TEntry::clearField('form_Testetres', 'campo4');
  171. }
  172. if ($param['testeum_id'] == 2)
  173. {
  174. TEntry::enableField('form_Testetres', 'campo3');
  175. TEntry::enableField('form_Testetres', 'campo4');
  176. TEntry::disableField('form_Testetres', 'campo1');
  177. TEntry::disableField('form_Testetres', 'campo2');
  178. TEntry::clearField('form_Testetres', 'campo1');
  179. TEntry::clearField('form_Testetres', 'campo2');
  180. }
  181. }
  182. }
  183. ?>

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


NR

Acontece que no momento que você chama a função validate, quando o cnpj é incorreto, uma exceção é lançada. Com isso o restante do processamento é abortado, sendo executado o código dentro da função catch. Passe o código para antes das validações que deve funcionar.

Outra coisa, eu recomendo tirar "self::onChangeRadio( array('testeum_id'=>1) );" do construtor para evitar que ele seja executado toda vez houver uma ação dentro da classe.
HB

Olá Nataniel.
Segui as suas orientações e deu certo.
Muito obrigado.