Problema com onChangeRadio no classe habilita / desabilita campo Olá pessoal. Estou testando algumas funcionalidades para usar no meu projeto. Abaixo estou usando o tutor de habilitar/desabilitar campos (http://www.adianti.com.br/framework_files/tutor/index.php?class=FormEnableDisableView). No exemplo do tutor, no array do RadioGrupo, é setado a posição 1 como padrão. No onSave tanto a opção '1'=>'Grupo 1' quando opção '2'=>'Grupo ...
HB
Problema com onChangeRadio no classe habilita / desabilita campo  
Olá pessoal.
Estou testando algumas funcionalidades para usar no meu projeto. Abaixo estou usando o tutor de habilitar/desabilitar campos (www.adianti.com.br/framework_files/tutor/index.php?class=FormEnableD).

No exemplo do tutor, no array do RadioGrupo, é setado a posição 1 como padrão. No onSave tanto a opção '1'=>'Grupo 1' quando opção '2'=>'Grupo 2' gravam normalmente, como vocês podem ver na imagem, o problema está no onEdit.
 
  1. <?php
  2. $radio_enable = new TRadioGroup('testeum_id');
  3. $radio_enable->addItems(array('1'=>'Grupo 1', '2'=>'Grupo 2'));
  4. $radio_enable->setLayout('horizontal');
  5. $radio_enable->setValue(1);
  6. ?>

Ao recuperar o registro (onEdit), o registro que foi gravado com a opção '2'=>'Grupo 2', não é recuperado corretamente (veja também na imagem). O RadioGrupo vem marcado direitinho, só que os campos do Grupo 2 ficam desabilitados e obviamente não exibe o conteúdo gravado.

Alguém pode me ajudar a resolver essa questão?

Código Completo
 
  1. <?php
  2. /**
  3. * TestedoisForm Form
  4. * @author <your name here>
  5. */
  6. class TestedoisForm 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_Testedois');
  18. $this->form->class = 'tform'; // change CSS class
  19. $this->form = new BootstrapFormWrapper($this->form);
  20. $this->form->style = 'display: table;width:100%'; // change style
  21. // define the form title
  22. $this->form->setFormTitle('Testedois');
  23. // create the form fields
  24. $id = new TEntry('id');
  25. $campo1 = new TEntry('campo1');
  26. $campo2 = new TEntry('campo2');
  27. $campo3 = new TEntry('campo3');
  28. $campo4 = new TEntry('campo4');
  29. //$testeum_id = new TEntry('testeum_id');
  30. $radio_enable = new TRadioGroup('testeum_id');
  31. $radio_enable->addItems(array('1'=>'Grupo 1', '2'=>'Grupo 2'));
  32. $radio_enable->setLayout('horizontal');
  33. $radio_enable->setValue(1);
  34. // add the fields
  35. $this->form->addQuickField('Id', $id, '10%' );
  36. $this->form->addQuickField('', $radio_enable, 80);
  37. $this->form->addQuickField('Grupo 1', $campo1, '40%' );
  38. $this->form->addQuickField('', $campo2, '40%' );
  39. $this->form->addQuickField('Grupo 2', $campo3, '40%' );
  40. $this->form->addQuickField('', $campo4, '40%' );
  41. //$this->form->addQuickField('Testeum Id', $testeum_id, '50%' );
  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: 90%';
  60. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  61. $container->add(TPanelGroup::pack('Teste Habilita / Desabilita Campos', $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. $object->store(); // save the object
  83. // get the generated id
  84. $data->id = $object->id;
  85. $this->form->setData($data); // fill form data
  86. TTransaction::close(); // close the transaction
  87. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  88. }
  89. catch (Exception $e) // in case of exception
  90. {
  91. new TMessage('error', $e->getMessage()); // shows the exception error message
  92. $this->form->setData( $this->form->getData() ); // keep form data
  93. TTransaction::rollback(); // undo all pending operations
  94. }
  95. }
  96. /**
  97. * Clear form data
  98. * @param $param Request
  99. */
  100. public function onClear( $param )
  101. {
  102. $this->form->clear(TRUE);
  103. }
  104. /**
  105. * Load object to form data
  106. * @param $param Request
  107. */
  108. public function onEdit( $param )
  109. {
  110. try
  111. {
  112. if (isset($param['key']))
  113. {
  114. $key = $param['key']; // get the parameter $key
  115. TTransaction::open('teste'); // open a transaction
  116. $object = new Testedois($key); // instantiates the Active Record
  117. $this->form->setData($object); // fill the form
  118. TTransaction::close(); // close the transaction
  119. }
  120. else
  121. {
  122. $this->form->clear(TRUE);
  123. }
  124. }
  125. catch (Exception $e) // in case of exception
  126. {
  127. new TMessage('error', $e->getMessage()); // shows the exception error message
  128. TTransaction::rollback(); // undo all pending operations
  129. }
  130. }
  131. /**
  132. * on ChangeRadio change
  133. * @param $param Action parameters
  134. */
  135. public static function onChangeRadio($param)
  136. {
  137. if ($param['testeum_id'] == 1)
  138. {
  139. TEntry::enableField('form_Testedois', 'campo1');
  140. TEntry::enableField('form_Testedois', 'campo2');
  141. TEntry::disableField('form_Testedois', 'campo3');
  142. TEntry::disableField('form_Testedois', 'campo4');
  143. TEntry::clearField('form_Testedois', 'campo3');
  144. TEntry::clearField('form_Testedois', 'campo4');
  145. }
  146. else
  147. {
  148. TEntry::disableField('form_Testedois', 'campo1');
  149. TEntry::disableField('form_Testedois', 'campo2');
  150. TEntry::enableField('form_Testedois', 'campo3');
  151. TEntry::enableField('form_Testedois', 'campo4');
  152. TEntry::clearField('form_Testedois', 'campo1');
  153. TEntry::clearField('form_Testedois', 'campo2');
  154. }
  155. }
  156. }
  157. ?>


Obrigado,
José Humberto Júnior

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


NR

Veja o exemplo abaixo:
adianti.com.br/framework_files/tutor/index.php?class=FormHierarchica

O segredo está na função sendData.
HB

Nataniel obrigado pelo retorno.

Fiz a implementação do meu onEdit conforme o código abaixo, mais não sei se era assim mesmo. Fazendo assim, funcionou em partes e aí eu tenho duas questões:
1) agora está recuperando o conteúdo dos campos corretamente, mais está exibindo os campos do Grupo 2 desabilitado sendo que no momento da gravação estes campos estavam habilitados para digitação. Como resolver isso?

2) o que eu não entendo é que quando o registro é gravado com a opção do array 1('1'=>'Grupo 1') funciona direitinho, mais quando o array é com o 2('2'=>'Grupo 2') não funciona, ou seja, na opção 1 os campos envolvidos ficam desabilitados e eu consigo editar cada campo; na opção 2 agora eu visualizo o conteúdo dos campos, mais não consigo editar. Pode me explicar por que isso acontece?

 
  1. <?php
  2. /**
  3. * Load object to form data
  4. * @param $param Request
  5. */
  6. public function onEdit( $param )
  7. {
  8. try
  9. {
  10. if (isset($param['key']))
  11. {
  12. $key = $param['key']; // get the parameter $key
  13. TTransaction::open('teste'); // open a transaction
  14. $object = new Testedois($key); // instantiates the Active Record
  15. $this->form->setData($object); // fill the form
  16. TTransaction::close(); // close the transaction
  17. $obj = new stdClass;
  18. $obj->campo1 = $object->campo1;
  19. $obj->campo2 = $object->campo2;
  20. $obj->campo3 = $object->campo3;
  21. $obj->campo4 = $object->campo4;
  22. $obj->testeum_id = $object->testeum_id;
  23. TForm::sendData('form_Testedois', $obj);
  24. }
  25. else
  26. {
  27. $this->form->clear(TRUE);
  28. }
  29. }
  30. catch (Exception $e) // in case of exception
  31. {
  32. new TMessage('error', $e->getMessage()); // shows the exception error message
  33. TTransaction::rollback(); // undo all pending operations
  34. }
  35. }
  36. ?>
NR

Você precisa usar o sendData também na função onSave. Se ainda assim não resolver 100%, tente debugar a função onChangeRadio, para ver quando ela está sendo chamada e os valores que está recebendo.
HB

Olá Nataniel.

Implementei sendData no onSave. Ao meu ver, está rodando corretamente, mais como eu disse anteriormente, o problema está quando eu recupero o registro, e o problema é só quando seleciono o grupo 2 (array ('2'=>'Grupo 2') ). É como eu mencionei na minha dúvida número 2 acima, o campo fica desabilitado no onEdit, isso só acontece quando o registro é gravado como grupo 2 (array ('2'=>'Grupo 2') ).

Quanto ao F12 que eu fiz, a aplicação executa onChangeRadio, duas vezes. A primeira quando eu clico no rádio 2. Em seguida, executa o onSave, e logo depois do onSave executa novamente o onChangeRadio. Mais não sei porque no grupo 2 os campos continuam desabilitados no onEdit.

No F12 do onEdit, o onChangeRadio não é executado nenhuma vez. É aqui o problema?

Query String Parameters
class:TestedoisForm
method:onChangeRadio
static:1

Form Data
id:
testeum_id:2
campo1:
campo2:
campo3:
campo4:
_field_value:2
_field_id:
_field_name:testeum_id
_form_name:form_Testedois
_field_data:
key:2
ajax_lookup:1

Query String Parameters
class:TestedoisForm
method:onSave

Form Data
id:
testeum_id:2
campo1:
campo2:
campo3:campo 3 do grupo 2
campo4:campo 4 do grupo 2

Query String Parameters
class:TestedoisForm
method:onChangeRadio
static:1

Form Data
id:3
testeum_id:2
campo1:
campo2:
campo3:campo 3 do grupo 2
campo4:campo 4 do grupo 2
_field_value:2
_field_id:
_field_name:testeum_id
_form_name:form_Testedois
_field_data:
key:2
ajax_lookup:1

NR

Ao invés de usar o sendData nesse caso, tente chamar a função diretamente:
 
  1. <?php
  2. //onEdit
  3. self::onChangeRadio(['testeum_id'=>$object->testeum_id]);
  4. ?>
HB

Nataniel, desta forma que você indicou funcionou direitinho.

Mais uma vez muito obrigado.
PC

Gostaria de tirar uma dúvida, se no banco de dados crio somente um atributo exemplo cpfCnpj.
Ou crio dosi atributos cpf e cnpj separdos.