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
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
- <?php
- /**
- * TestetresForm Form
- * @author <your name here>
- */
- class TestetresForm extends TPage
- {
- protected $form; // form
- /**
- * Form constructor
- * @param $param Request
- */
- public function __construct( $param )
- {
- parent::__construct();
- // creates the form
- $this->form = new TQuickForm('form_Testetres');
- $this->form->class = 'tform'; // change CSS class
- $this->form = new BootstrapFormWrapper($this->form);
- $this->form->style = 'display: table;width:70%'; // change style
- // define the form title
- $this->form->setFormTitle('Testetres');
- $radio_enable = new TRadioGroup('testeum_id');
- $radio_enable->addItems(array('1'=>'Física', '2'=>'Jurídica'));
- $radio_enable->setLayout('horizontal');
- $radio_enable->setValue(1);
- // create the form fields
- $id = new TEntry('id');
- $campo1 = new TEntry('campo1');
- $campo2 = new TEntry('campo2');
- $campo3 = new TEntry('campo3');
- $campo4 = new TEntry('campo4');
- $campo2->setMask('999.999.999-99');
- $campo4->setMask('99.999.999/9999-99');
- // add the fields
- $this->form->addQuickField('Id', $id, '10%' );
- $this->form->addQuickField('Tipo', $radio_enable, 80);
- $this->form->addQuickField('CPF', $campo1, '40%' );
- $this->form->addQuickField('', $campo2, '40%' );
- $this->form->addQuickField('CNPJ', $campo3, '40%' );
- $this->form->addQuickField('', $campo4, '40%' );
- $radio_enable->setChangeAction( new TAction( array($this, 'onChangeRadio')) );
- self::onChangeRadio( array('testeum_id'=>1) );
- if (!empty($id))
- {
- $id->setEditable(FALSE);
- }
- /** samples
- $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
- $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
- $fieldX->setSize( 100, 40 ); // set size
- **/
- // create the form actions
- $btn = $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
- $btn->class = 'btn btn-sm btn-primary';
- $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
- // vertical box container
- $container = new TVBox;
- $container->style = 'width: 60%';
- // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $container->add(TPanelGroup::pack('Validando CPF e CNPJ', $this->form));
- parent::add($container);
- }
- /**
- * Save form data
- * @param $param Request
- */
- public function onSave( $param )
- {
- try
- {
- TTransaction::open('teste'); // open a transaction
- /**
- // Enable Debug logger for SQL operations inside the transaction
- TTransaction::setLogger(new TLoggerSTD); // standard output
- TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
- **/
- $this->form->validate(); // validate form data
- $object = new Testedois; // create an empty object
- $data = $this->form->getData(); // get form data as array
- $object->fromArray( (array) $data); // load the object with data
- // Valida o CPF
- if($data->testeum_id == 1 )
- {
- $validacpf = new TCPFValidator;
- $validacpf->validate('CPF', $data->campo2);
- }
- // Valida o CNPJ
- if($data->testeum_id == 2 )
- {
- $validator = new TCNPJValidator;
- $validator->validate('CNPJ', $data->campo4);
- }
- $object->store(); // save the object
- // get the generated id
- $data->id = $object->id;
- $obj = new stdClass;
- $obj->campo1 = $object->campo1;
- $obj->campo2 = $object->campo2;
- $obj->campo3 = $object->campo3;
- $obj->campo4 = $object->campo4;
- self::onChangeRadio(['testeum_id'=>$object->testeum_id]);
- TForm::sendData('form_Testetres', $obj);
- $this->form->setData($data); // fill form data
- TTransaction::close(); // close the transaction
- new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- $this->form->setData( $this->form->getData() ); // keep form data
- TTransaction::rollback(); // undo all pending operations
- }
- }
- /**
- * Clear form data
- * @param $param Request
- */
- public function onClear( $param )
- {
- $this->form->clear(TRUE);
- }
- /**
- * Load object to form data
- * @param $param Request
- */
- public function onEdit( $param )
- {
- try
- {
- if (isset($param['key']))
- {
- $key = $param['key']; // get the parameter $key
- TTransaction::open('teste'); // open a transaction
- $object = new Testedois($key); // instantiates the Active Record
- $this->form->setData($object); // fill the form
- TTransaction::close(); // close the transaction
- $obj = new stdClass;
- $obj->campo1 = $object->campo1;
- $obj->campo2 = $object->campo2;
- $obj->campo3 = $object->campo3;
- $obj->campo4 = $object->campo4;
- self::onChangeRadio(['testeum_id'=>$object->testeum_id]);
- TForm::sendData('form_Testetres', $obj);
- }
- else
- {
- $this->form->clear(TRUE);
- }
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- TTransaction::rollback(); // undo all pending operations
- }
- }
- /**
- * on ChangeRadio change
- * @param $param Action parameters
- */
- public static function onChangeRadio($param)
- {
- if ($param['testeum_id'] == 1)
- {
- TEntry::enableField('form_Testetres', 'campo1');
- TEntry::enableField('form_Testetres', 'campo2');
- TEntry::disableField('form_Testetres', 'campo3');
- TEntry::disableField('form_Testetres', 'campo4');
- TEntry::clearField('form_Testetres', 'campo3');
- TEntry::clearField('form_Testetres', 'campo4');
- }
- if ($param['testeum_id'] == 2)
- {
- TEntry::enableField('form_Testetres', 'campo3');
- TEntry::enableField('form_Testetres', 'campo4');
- TEntry::disableField('form_Testetres', 'campo1');
- TEntry::disableField('form_Testetres', 'campo2');
- TEntry::clearField('form_Testetres', 'campo1');
- TEntry::clearField('form_Testetres', 'campo2');
- }
- }
- }
- ?>
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.
Olá Nataniel.
Segui as suas orientações e deu certo.
Muito obrigado.