HB
HABILITAR E DESABILITAR CAMPOS A PARTIR DE UM TCombo
www.adianti.com.br/forum/pt/view_3863?desabilitar-habilitar-campos-u
Pessoal, fiz uma configuração no meu aplicativo utilizando o TCombo para desabilitar dois campos, CPF ou CNPJ conforme seleção, porém está acontecendo o seguinte:
Quando faço uma inserção está normal, ou seja, quando seleciono TIPO = FÍSICA, desabilita o campo CNPJ e vise e versa. Mais o meu cadastro parte de uma datagrid e aí tenho o seguinte:
1) se vocês observarem tenho validação do CPF e CNPJ (entre outras mais simples usando new TRequiredValidator);
2) também faço validação de conteúdo de campos que são unicos, como por exemplo o próprio CPF e CNPJ que não deixo cadastrar em duplicidade;
Assim, tenho duas situações:
1) quando ocorre quaquer validação e a aplicação mostra a mensagem de erro na tela, ao fechar a tela da mensagem, o campo fica habilitado novamente, ou seja, se seleciono TIPO = FÍSICA, o campo CNPJ que deveria ficar desabilitado, após a mensagem fica habilitado, e o que é pior, consigo preencher os dois campos.
2) quando estou na datagrid e pressiono o botão EDITAR, a aplicação carrega o registro, mais o campo CNPJ (do exemplo acima) que deveria estar desabilitado é carregado habilitado, permitindo também que eu faça o preenchimento do mesmo.
Alguém pode me auxiliar a resolver esta situação?
Vejam o meu código do cadastro de cliente abaixo, e caso necessário, acessem o código da datagrid de cliente no anexo.
Pessoal, fiz uma configuração no meu aplicativo utilizando o TCombo para desabilitar dois campos, CPF ou CNPJ conforme seleção, porém está acontecendo o seguinte:
Quando faço uma inserção está normal, ou seja, quando seleciono TIPO = FÍSICA, desabilita o campo CNPJ e vise e versa. Mais o meu cadastro parte de uma datagrid e aí tenho o seguinte:
1) se vocês observarem tenho validação do CPF e CNPJ (entre outras mais simples usando new TRequiredValidator);
2) também faço validação de conteúdo de campos que são unicos, como por exemplo o próprio CPF e CNPJ que não deixo cadastrar em duplicidade;
Assim, tenho duas situações:
1) quando ocorre quaquer validação e a aplicação mostra a mensagem de erro na tela, ao fechar a tela da mensagem, o campo fica habilitado novamente, ou seja, se seleciono TIPO = FÍSICA, o campo CNPJ que deveria ficar desabilitado, após a mensagem fica habilitado, e o que é pior, consigo preencher os dois campos.
2) quando estou na datagrid e pressiono o botão EDITAR, a aplicação carrega o registro, mais o campo CNPJ (do exemplo acima) que deveria estar desabilitado é carregado habilitado, permitindo também que eu faça o preenchimento do mesmo.
Alguém pode me auxiliar a resolver esta situação?
Vejam o meu código do cadastro de cliente abaixo, e caso necessário, acessem o código da datagrid de cliente no anexo.
- <?php
- /**
- * clienteForm Form
- * @author <your name here>
- */
- class clienteForm extends TPage
- {
- protected $form; // form
- /**
- * Form constructor
- * @param $param Request
- */
- public function __construct( $param )
- {
- parent::__construct();
- // creates the form
- $this->form = new TQuickForm('form_cliente');
- $this->form->class = 'tform'; // change CSS class
- $this->form->style = 'display: table;width: 90%'; // change style
- // define the form title
- $this->form->setFormTitle('Cadastro de Clientes');
- $CLI01Tipo = new TCombo('CLI01Tipo');
- $CLI01Tipo->addItems(array('1'=>'Física', '2'=>'Jurídica'));
- $id = new TEntry('id');
- $CLI01Nome = new TEntry('CLI01Nome');
- $CLI01CPF = new TEntry('CLI01CPF');
- $CLI01CNPJ = new TEntry('CLI01CNPJ');
- $CLI01CEP = new TEntry('CLI01CEP');
- $CLI01Endereco = new TEntry('CLI01Endereco');
- $CLI01Bairro = new TEntry('CLI01Bairro');
- $CLI01Cidade = new TEntry('CLI01Cidade');
- $estado_id = new ">TDBSeekButton('estado_id', 'sistema', 'form_cliente', 'estado', 'EST01Nome', 'estado_id', 'estado_nome');
- $estado_nome = new TEntry('estado_nome');
- $CLI01Comer = new TEntry('CLI01Comer');
- $CLI01Celular = new TEntry('CLI01Celular');
- $CLI01DtCadas = new TDate('CLI01DtCadas');
- $CLI01Ativo = new TCombo('CLI01Ativo');
- // adicionando os campos no formulário
- $this->form->addQuickField('Código', $id, 80 );
- $this->form->addQuickField('Tipo', $CLI01Tipo, 80 );
- $this->form->addQuickFields('CPF', array($CLI01CPF, new TLabel(' CNPJ'), $CLI01CNPJ));
- $this->form->addQuickField('Nome', $CLI01Nome, 319 , new TRequiredValidator);
- $this->form->addQuickField('CEP', $CLI01CEP, 135 );
- $this->form->addQuickFields('Endereço', array($CLI01Endereco, new TLabel(' Bairro'), $CLI01Bairro));
- $this->form->addQuickField('Cidade', $CLI01Cidade, 319 , new TRequiredValidator);
- $this->form->addQuickFields('UF', array($estado_id, $estado_nome ));
- $this->form->addQuickFields('Fone Comercial', array($CLI01Comer, new TLabel(' Fone Celular'), $CLI01Celular));
- $this->form->addQuickField('Cadastro', $CLI01DtCadas, 100 , new TRequiredValidator);
- $this->form->addQuickField('Ativo', $CLI01Ativo, 80 , new TRequiredValidator);
- //Chamar o método onChangeRadio
- $CLI01Tipo->setChangeAction( new TAction( array($this, 'onChangeRadio')));
- // minhas modificações
- $estado_nome->setEditable(FALSE);
- $CLI01CPF->setSize(135);
- $CLI01CNPJ->setSize(135);
- $CLI01Endereco->setSize(250);
- $CLI01Bairro->setSize(250);
- $CLI01Comer->setSize(180);
- $CLI01Celular->setSize(180);
- $estado_id->setSize(80);
- $estado_nome->setSize(218);
- $CLI01Nome->forceUpperCase();
- $CLI01Endereco->forceUpperCase();
- $CLI01Bairro->forceUpperCase();
- $CLI01Cidade->forceUpperCase();
- $CLI01DtCadas->setMask('dd/mm/yyyy');
- $CLI01DtCadas->setDatabaseMask('yyyy-mm-dd');
- $CLI01Comer->setMask('(99)9999-9999');
- $CLI01Celular->setMask('(99)9.9999-9999');
- $CLI01CEP->setMask('99.999-999');
- $CLI01CNPJ->setMask('99.999.999/9999-99');
- $CLI01CPF->setMask('999.999.999-99');
- $CLI01Ativo->addItems( [ '1' => 'Sim', '2' => 'Não'] );
- 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
- $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
- $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
- // minhas modificações
- $this->form->addQuickAction('Retorna', new TAction(array('clienteCadastroGrid', 'onReload')), 'fa:table blue' );
- // vertical box container
- $container = new TVBox;
- $container->style = 'width: 90%';
- //$container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $container->add($this->form);
- parent::add($container);
- }
- /**
- * on ChangeRadio change - AÇÕES PARA O GRUPO DE CAMPOS
- * @param $param Action parameters
- */
- public static function onChangeRadio($param)
- {
- if ($param['CLI01Tipo'] == 1)
- {
- TEntry::enableField('form_cliente', 'CLI01CPF');
- TEntry::disableField('form_cliente', 'CLI01CNPJ');
- TEntry::clearField('form_cliente', 'CLI01CNPJ');
- }
- if ($param['CLI01Tipo'] == 2)
- {
- TEntry::disableField('form_cliente', 'CLI01CPF');
- TEntry::clearField('form_cliente', 'CLI01CPF');
- TEntry::enableField('form_cliente', 'CLI01CNPJ');
- }
- }
- /**
- * Save form data
- * @param $param Request
- */
- public function onSave( $param )
- {
- try
- {
- TTransaction::open('sistema'); // 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
- **/
- $data = $this->form->getData(); // get form data as array
- // Valida o CPF para pessoas físicas
- if($data->CLI01Tipo == 1 )
- {
- $validacpf = new TRequiredValidator;
- $validacpf->validate('CPF', $data->CLI01CPF);
- if($data->CLI01CPF != '000.000.000-00')
- {
- $validacpf = new TCPFValidator;
- $validacpf->validate('CPF', $data->CLI01CPF);
- }
- }
- if($data->CLI01Tipo == 2 )
- {
- $validator = new TRequiredValidator;
- $validator->validate('CNPJ', $data->CLI01CNPJ);
- if($data->CLI01CNPJ != '00.000.000/0000-00')
- {
- $validator = new TCNPJValidator;
- $validator->validate('CNPJ', $data->CLI01CNPJ);
- }
- }
- $this->form->validate(); // validate form data
- $object = new cliente; // create an empty object
- $object->fromArray( (array) $data); // load the object with data
- $object->store(); // save the object
- // get the generated id
- $data->id = $object->id;
- $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
- {
- if($e->getCode() == 23000){
- new TMessage('error', '<b>Menssagem: CPF ou CNPJ já cadastrado!</b>');
- $this->form->setData( $this->form->getData() );
- }else{
- new TMessage('error', 'Erro: ' .$e->getCode(). '-' . $e->getMessage());
- $this->form->setData( $this->form->getData() );
- }
- 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('sistema'); // open a transaction
- $object = new cliente($key); // instantiates the Active Record
- $this->form->setData($object); // fill the form
- TTransaction::close(); // close the transaction
- }
- 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
- }
- }
- }
- ?>
Você pode usar a função sendData nesses casos. Ela identifica os campos que possuem ações vinculadas e as executa corretamente:
adianti.com.br/framework_files/tutor/index.php?class=FormHierarchica
Olá Nataniel, valeu pela dica.
Obrigado.