Desabilitar / Habilitar campos utilizando um tipo TCombo Olá pessoal. Vi através do tutor (http://www.adianti.com.br/framework_files/tutor/index.php?class=FormEnableDisableView) uma forma de desabilitar campos através de um TRadioGroup. Fiz teste e deu certo como vocês podem ver na imagem do anexo. Mais o que de fato eu gostaria é que o meu campo TIPO(pessoal física ou jurídica) seja um campo do tipo TCombo. Existe uma forma no framework d...
HB
Desabilitar / Habilitar campos utilizando um tipo TCombo  
Olá pessoal.
Vi através do tutor (www.adianti.com.br/framework_files/tutor/index.php?class=FormEnableD) uma forma de desabilitar campos através de um TRadioGroup. Fiz teste e deu certo como vocês podem ver na imagem do anexo.

Mais o que de fato eu gostaria é que o meu campo TIPO(pessoal física ou jurídica) seja um campo do tipo TCombo.

Existe uma forma no framework de fazer a mesma coisa que foi feita no TRadioGroup para o TCombo para desabilitar UM CONJUNTO DE CAMPOS?

Obrigado
José Humberto

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

Sim José, use a mesma lógica pra isso:
 
  1. <?php
  2. $tipo = new TCombo('tipo');
  3. $itens = array('F' => 'Física', 'J' => 'Jurídica');
  4. $tipo->addItems($itens);
  5. ?>

e no método:
 
  1. <?php
  2. if ($param['tipo']=='F')
  3. {
  4. TEntry::disableField('form', 'cnpj');
  5. TEntry::enableField('form', 'cpf');
  6. }
  7. if ($param['tipo']=='J')
  8. {
  9. TEntry::enableField('form', 'cnpj');
  10. TEntry::disableField('form', 'cpf');
  11. }
  12. ?>
HB

Ivan, primeiramente obrigado por ter respondido meu questionamento.

Ivan, sou novo no framework e ainda tenho várias dúvidas.

Para o TRadioGroup pelo que percebi exite um método, conforme abaixo.
A minha dúvida está na parte que você me orientou a incluir o código de desabilitar e habilitar no método.
E no caso do TCombo também tem um método nativo? Se não tem, pode me ajudar implementar?

Ação do Radio Group: este trecho extrai do tutor e só troquei para os meus atributos

 
  1. <?php
  2. $CLI01Tipo->setChangeAction( new TAction( array($this, 'onChangeRadio')) );
  3. self::onChangeRadio( array('CLI01Tipo'=>1) );
  4. $CLI01Tipo->setValue(1);
  5. ?>
IF

O método é o mesmo setChangeAction, poste o seu código aqui pra eu dar uma olhada e tentar te instruir melhor.
HB

Segue o código Ivan

 
  1. <?php
  2. /**
  3. * clienteForm Form
  4. * @author <your name here>
  5. */
  6. class clienteForm 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_cliente');
  18. $this->form->class = 'tform'; // change CSS class
  19. $this->form->style = 'display: table;width: 90%'; // change style
  20. // define the form title
  21. $this->form->setFormTitle('Cadastro de Clientes');
  22. // CAMPO TIPO DE PESSOA (FÍSICA ou JURÍDICA)
  23. $CLI01Tipo = new TRadioGroup('CLI01Tipo');
  24. $CLI01Tipo->addItems(array('1'=>'Física', '2'=>'Jurídica'));
  25. $CLI01Tipo->setLayout('vertical');
  26. $id = new TEntry('id');
  27. $CLI01Nome = new TEntry('CLI01Nome');
  28. $CLI01CPF = new TEntry('CLI01CPF');
  29. $CLI01CNPJ = new TEntry('CLI01CNPJ');
  30. $CLI01CEP = new TEntry('CLI01CEP');
  31. $CLI01Endereco = new TEntry('CLI01Endereco');
  32. $CLI01Bairro = new TEntry('CLI01Bairro');
  33. $CLI01Cidade = new TEntry('CLI01Cidade');
  34. $estado_id = new ">TDBSeekButton('estado_id', 'sistema', 'form_cliente', 'estado', 'EST01Nome', 'estado_id', 'estado_nome');
  35. $estado_nome = new TEntry('estado_nome');
  36. $CLI01Comer = new TEntry('CLI01Comer');
  37. $CLI01Celular = new TEntry('CLI01Celular');
  38. $CLI01DtCadas = new TDate('CLI01DtCadas');
  39. $CLI01Ativo = new TCombo('CLI01Ativo');
  40. // adicionando os campos no formulário
  41. $this->form->addQuickField('Código', $id, 80 );
  42. $this->form->addQuickField('Tipo', $CLI01Tipo, 80 );
  43. $this->form->addQuickFields('CPF', array($CLI01CPF, new TLabel(' CNPJ'), $CLI01CNPJ));
  44. $this->form->addQuickField('Nome', $CLI01Nome, 319 , new TRequiredValidator);
  45. $this->form->addQuickField('CEP', $CLI01CEP, 135 );
  46. $this->form->addQuickFields('Endereço', array($CLI01Endereco, new TLabel(' Bairro'), $CLI01Bairro));
  47. $this->form->addQuickField('Cidade', $CLI01Cidade, 319 , new TRequiredValidator);
  48. $this->form->addQuickFields('UF', array($estado_id, $estado_nome ));
  49. $this->form->addQuickFields('Fone Comercial', array($CLI01Comer, new TLabel(' Fone Celular'), $CLI01Celular));
  50. $this->form->addQuickField('Cadastro', $CLI01DtCadas, 100 , new TRequiredValidator);
  51. $this->form->addQuickField('Ativo', $CLI01Ativo, 80 , new TRequiredValidator);
  52. // adicionando as ações conforme o grupo
  53. $CLI01Tipo->setChangeAction( new TAction( array($this, 'onChangeRadio')) );
  54. self::onChangeRadio( array('CLI01Tipo'=>1) );
  55. $CLI01Tipo->setValue(1);
  56. // minhas modificações
  57. $estado_nome->setEditable(FALSE);
  58. $CLI01CPF->setSize(135);
  59. $CLI01CNPJ->setSize(135);
  60. $CLI01Endereco->setSize(250);
  61. $CLI01Bairro->setSize(250);
  62. $CLI01Comer->setSize(180);
  63. $CLI01Celular->setSize(180);
  64. $estado_id->setSize(80);
  65. $estado_nome->setSize(218);
  66. $CLI01Nome->forceUpperCase();
  67. $CLI01Endereco->forceUpperCase();
  68. $CLI01Bairro->forceUpperCase();
  69. $CLI01Cidade->forceUpperCase();
  70. $CLI01DtCadas->setMask('dd/mm/yyyy');
  71. $CLI01DtCadas->setDatabaseMask('yyyy-mm-dd');
  72. $CLI01Comer->setMask('(99)9999-9999');
  73. $CLI01Celular->setMask('(99)9.9999-9999');
  74. $CLI01CEP->setMask('99.999-999');
  75. $CLI01CNPJ->setMask('99.999.999/9999-99');
  76. $CLI01CPF->setMask('999.999.999-99');
  77. $CLI01Ativo->addItems( [ '1' => 'Sim', '2' => 'Não'] );
  78. if (!empty($id))
  79. {
  80. $id->setEditable(FALSE);
  81. }
  82. /** samples
  83. $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  84. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  85. $fieldX->setSize( 100, 40 ); // set size
  86. **/
  87. // create the form actions
  88. $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
  89. $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
  90. // minhas modificações
  91. $this->form->addQuickAction('Retorna', new TAction(array('clienteCadastroGrid', 'onReload')), 'fa:table blue' );
  92. // vertical box container
  93. $container = new TVBox;
  94. $container->style = 'width: 90%';
  95. //$container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  96. $container->add($this->form);
  97. parent::add($container);
  98. }
  99. /**
  100. * on ChangeRadio change - AÇÕES PARA O GRUPO DE CAMPOS
  101. * @param $param Action parameters
  102. */
  103. public static function onChangeRadio($param)
  104. {
  105. if ($param['CLI01Tipo'] == 1)
  106. {
  107. TEntry::enableField('form_cliente', 'CLI01CPF');
  108. TEntry::disableField('form_cliente', 'CLI01CNPJ');
  109. TEntry::clearField('form_cliente', 'CLI01CNPJ');
  110. }
  111. if ($param['CLI01Tipo'] == 2)
  112. {
  113. TEntry::disableField('form_cliente', 'CLI01CPF');
  114. TEntry::clearField('form_cliente', 'CLI01CPF');
  115. TEntry::enableField('form_cliente', 'CLI01CNPJ');
  116. }
  117. }
  118. /**
  119. * Save form data
  120. * @param $param Request
  121. */
  122. public function onSave( $param )
  123. {
  124. try
  125. {
  126. TTransaction::open('sistema'); // open a transaction
  127. /**
  128. // Enable Debug logger for SQL operations inside the transaction
  129. TTransaction::setLogger(new TLoggerSTD); // standard output
  130. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  131. **/
  132. $data = $this->form->getData(); // get form data as array
  133. // Valida o CPF para pessoas físicas
  134. if($data->CLI01Tipo == 1 )
  135. {
  136. $validacpf = new TRequiredValidator;
  137. $validacpf->validate('CPF', $data->CLI01CPF);
  138. if($data->CLI01CPF != '000.000.000-00')
  139. {
  140. $validacpf = new TCPFValidator;
  141. $validacpf->validate('CPF', $data->CLI01CPF);
  142. }
  143. }
  144. if($data->CLI01Tipo == 2 )
  145. {
  146. $validator = new TRequiredValidator;
  147. $validator->validate('CNPJ', $data->CLI01CNPJ);
  148. if($data->CLI01CNPJ != '00.000.000/0000-00')
  149. {
  150. $validator = new TCNPJValidator;
  151. $validator->validate('CNPJ', $data->CLI01CNPJ);
  152. }
  153. }
  154. $this->form->validate(); // validate form data
  155. $object = new cliente; // create an empty object
  156. $object->fromArray( (array) $data); // load the object with data
  157. $object->store(); // save the object
  158. // get the generated id
  159. $data->id = $object->id;
  160. $this->form->setData($data); // fill form data
  161. TTransaction::close(); // close the transaction
  162. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  163. }
  164. catch (Exception $e) // in case of exception
  165. {
  166. if($e->getCode() == 23000){
  167. new TMessage('error', '<b>Menssagem: CPF ou CNPJ já cadastrado!</b>');
  168. $this->form->setData( $this->form->getData() );
  169. }else{
  170. new TMessage('error', 'Erro: ' .$e->getCode(). '-' . $e->getMessage());
  171. $this->form->setData( $this->form->getData() );
  172. }
  173. TTransaction::rollback(); // undo all pending operations
  174. }
  175. }
  176. /**
  177. * Clear form data
  178. * @param $param Request
  179. */
  180. public function onClear( $param )
  181. {
  182. $this->form->clear(TRUE);
  183. }
  184. /**
  185. * Load object to form data
  186. * @param $param Request
  187. */
  188. public function onEdit( $param )
  189. {
  190. try
  191. {
  192. if (isset($param['key']))
  193. {
  194. $key = $param['key']; // get the parameter $key
  195. TTransaction::open('sistema'); // open a transaction
  196. $object = new cliente($key); // instantiates the Active Record
  197. $this->form->setData($object); // fill the form
  198. TTransaction::close(); // close the transaction
  199. }
  200. else
  201. {
  202. $this->form->clear(TRUE);
  203. }
  204. }
  205. catch (Exception $e) // in case of exception
  206. {
  207. new TMessage('error', $e->getMessage()); // shows the exception error message
  208. TTransaction::rollback(); // undo all pending operations
  209. }
  210. }
  211. }
  212. ?>
</your>
IF

Faça assim:
 
  1. <?php
  2. $CLI01Tipo = new TCombo('CLI01Tipo');
  3. $CLI01Tipo->addItems(array('1'=>'Física', '2'=>'Jurídica'));
  4. //Chamar o método onChangeRadio
  5. $CLI01Tipo->setChangeAction( new TAction( array($this, 'onChangeRadio')) );
  6. ?>

O método onChangeRadio continua como está, assim vai continuar funcionando normalmente
HB

Ivian, deu certo.

Ainda nesse contexto 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ê observar 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.

Pode me ajudar também com essas situações aproveitando que meu código já está postado aí?