[BUG][DUVIDA] - Usando dois TDate no mesmo form Olá pessoal, estou com um problema estranho ao utilizar dois TDate no mesmo form, quando utilizo dois TDate um deles, mais precisamente o segundo que foi adicionado, fica sem o "data-picker" enquanto que o outro apresenta dois. Estou enviando o anexo com um print do form, notem os campos "Entrega Doc:" e "Data de Fundacao:" Vou deixar o código também. Deste já agradeço qualquer ajuda. Obr...
JD
[BUG][DUVIDA] - Usando dois TDate no mesmo form  
Fechado
Olá pessoal, estou com um problema estranho ao utilizar dois TDate no mesmo form, quando utilizo dois TDate um deles, mais precisamente o segundo que foi adicionado, fica sem o "data-picker" enquanto que o outro apresenta dois.
Estou enviando o anexo com um print do form, notem os campos "Entrega Doc:" e "Data de Fundacao:"
Vou deixar o código também.
Deste já agradeço qualquer ajuda.
Obrigado.

 
  1. <?php
  2. /**
  3. * ClientefinanceiroForm Registration
  4. * @author Jheferson Fonseca Gonçalves
  5. */
  6. class ClientefinanceiroForm extends TPage
  7. {
  8. protected $form; // form
  9. /**
  10. * Class constructor
  11. * Creates the page and the registration form
  12. */
  13. function __construct()
  14. {
  15. parent::__construct();
  16. // creates the notebook
  17. // creates the form
  18. $this->form = new TForm('form_Clientefinanceiro');
  19. $this->form->class = 'tform'; // CSS class
  20. $this->form->style = 'width: 100%';
  21. $page1 = new TTable;
  22. $page2 = new TTable;
  23. $page3 = new TTable;
  24. $page4 = new TTable;
  25. // add a table inside form
  26. $page1-> width = '100%';
  27. $page1->style = 'width: 100%';
  28. // add a row for the form title
  29. $row = $page1->addRow();
  30. $row->class = 'tformtitle'; // CSS class
  31. $row->addCell( new TLabel('Cliente') )->colspan = 2;
  32. // create the form fields
  33. $cod = new TEntry('cod');
  34. $nome = new TEntry('nome');
  35. $cnpj = new TEntry('cnpj');
  36. $estado = new TEntry('estado');
  37. $data_doc = new TDate('data_doc');
  38. $capital = new TEntry('capital');
  39. $data_fundacao = new TDate('data_fundacao');
  40. $limite_credito = new TEntry('limite_credito');
  41. $responsavel = new TEntry('responsavel');
  42. $representante = new TEntry('representante');
  43. $municipio = new TEntry('municipio');
  44. $observacoes = new TText('observacoes');
  45. // define the sizes
  46. $cod->setSize(200);
  47. $nome->setSize(200);
  48. $cnpj->setSize(100);
  49. $estado->setSize(200);
  50. $data_doc->setSize(150);
  51. $capital->setSize(200);
  52. $data_fundacao->setSize(150);
  53. $limite_credito->setSize(200);
  54. $responsavel->setSize(200);
  55. $representante->setSize(200);
  56. $municipio->setSize(200);
  57. $observacoes->setSize(200, 40);
  58. // validations
  59. //$cod->addValidation('cod', new TRequiredValidator);
  60. $nome->addValidation('nome', new TRequiredValidator);
  61. $cnpj->addValidation('cnpj', new TRequiredValidator);
  62. $estado->addValidation('estado', new TRequiredValidator);
  63. // add one row for each form field
  64. $page1->addRowSet( $label_cod = new TLabel('Cod:'), $cod );
  65. //$label_cod->setFontColor('#FF0000');
  66. $page1->addRowSet( $label_nome = new TLabel('Nome:'), $nome );
  67. $label_nome->setFontColor('#FF0000');
  68. $page1->addRowSet( $label_cnpj = new TLabel('CNPJ:'), $cnpj );
  69. $label_cnpj->setFontColor('#FF0000');
  70. $page1->addRowSet( new TLabel('Municipio:'), $municipio );
  71. $page1->addRowSet( $label_estado = new TLabel('Estado:'), $estado );
  72. $label_estado->setFontColor('#FF0000');
  73. $page1->addRowSet( new TLabel('Entrega Doc:'), $data_doc );
  74. $page1->addRowSet( new TLabel('Capital:'), $capital );
  75. $page1->addRowSet( new TLabel('Data de Fundacao:'), $data_fundacao );
  76. $page1->addRowSet( new TLabel('Limite De Crédito:'), $limite_credito );
  77. $page1->addRowSet( new TLabel('Responsável:'), $responsavel );
  78. $page1->addRowSet( new TLabel('Representante:'), $representante );
  79. $page1->addRowSet( new TLabel('Observação:'), $observacoes );
  80. $this->form->setFields(array($cod,$nome,$cnpj,$estado,$data_doc,$capital,$data_fundacao,$limite_credito,$responsavel,$representante,$municipio,$observacoes));
  81. // create the form actions
  82. $save_button = TButton::create('save', array($this, 'onSave'), _t('Save'), 'ico_save.png');
  83. $new_button = TButton::create('new', array($this, 'onEdit'), _t('New'), 'ico_new.png');
  84. $this->form->addField($save_button);
  85. $this->form->addField($new_button);
  86. $buttons_box = new THBox;
  87. $buttons_box->add($save_button);
  88. $buttons_box->add($new_button);
  89. // add a row for the form action
  90. $row = $page1->addRow();
  91. $row->class = 'tformaction'; // CSS class
  92. $row->addCell($buttons_box)->colspan = 2;
  93. $notebook = new TNotebook('100%',630);
  94. $notebook->appendPage('Dados Básicos', $page1);
  95. $notebook->appendPage('Sócios', $page2);
  96. $notebook->appendPage('Fornecedores/Ref', $page3);
  97. $notebook->appendPage('Histórico/Limites', $page4);
  98. $this->form->add($notebook);
  99. $vbox = new TVBox;
  100. $vbox->add(new TXMLBreadCrumb('menu.xml', 'ClientefinanceiroForm'));
  101. $vbox->add($this->form);
  102. $vbox->style = "width: 100%";
  103. parent::add($vbox);
  104. }
  105. /**
  106. * method onSave()
  107. * Executed whenever the user clicks at the save button
  108. */
  109. function onSave()
  110. {
  111. try
  112. {
  113. TTransaction::open('dados'); // open a transaction
  114. // get the form data into an active record Clientefinanceiro
  115. $object = $this->form->getData('Clientefinanceiro');
  116. $this->form->validate(); // form validation
  117. $object->store(); // stores the object
  118. $this->form->setData($object); // keep form data
  119. TTransaction::close(); // close the transaction
  120. // shows the success message
  121. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  122. }
  123. catch (Exception $e) // in case of exception
  124. {
  125. new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // shows the exception error message
  126. $this->form->setData( $this->form->getData() ); // keep form data
  127. TTransaction::rollback(); // undo all pending operations
  128. }
  129. }
  130. /**
  131. * method onEdit()
  132. * Executed whenever the user clicks at the edit button da datagrid
  133. */
  134. function onEdit($param)
  135. {
  136. try
  137. {
  138. if (isset($param['key']))
  139. {
  140. $key=$param['key']; // get the parameter $key
  141. TTransaction::open('dados'); // open a transaction
  142. $object = new Clientefinanceiro($key); // instantiates the Active Record
  143. $this->form->setData($object); // fill the form
  144. TTransaction::close(); // close the transaction
  145. }
  146. else
  147. {
  148. $this->form->clear();
  149. }
  150. }
  151. catch (Exception $e) // in case of exception
  152. {
  153. new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // shows the exception error message
  154. TTransaction::rollback(); // undo all pending operations
  155. }
  156. }
  157. }
  158. ?>

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


FC

Isso ocorre principalmente com o vertrigo troque pelo wamp ou atualize a versão de seu PHP.
JD

Estou utilizando o Xampp com PHP 5.6.11
FC

Compilação do xampp não roda legal com o adianti mude para o wamp que resolve.
JD

Entendi...
Não há nenhuma configuração que resolva o problema no Xampp ?
Pensei que o Adianti não dependesse de configurações no servidor, isso vai ser um problema.
Na empresa onde trabalho é utilizado o xampp, que já está com o Apache devidamente configurado para rodar algumas aplicações COM e .NET
Se souber de alguma maneira de resolver o problema sem trocar o pacote do servidor fico muito agradecido.
Obrigado.
FC

Não é aconselhável usar o xamp em ambiente de produção, porém como te falei é um problema que pode ser resolvido atualizando a versão do PHP, senão me engano tem alguns tutoriais na net mostrando como atualizar o xamp tente atualizar numa máquina a parte para testar.
JD

Atualizei para o PHP 5.6.15 e o erro continua.
Vou experimentar na maquina local utilizando o wamp pra ver se resolve.
Obrigado.
FC

não esqueça de limpar o cache dos navegadores.
GE

tb tinha esse problema quando usava wamps da vida...

caso utilize windows como SO, eu recomendo baixar o VBox,
configurar uma maquina virtual com ubuntu, instalar php, apache, base de dados, samba, e mapear no windows e começar a desenvolver.

Ou ainda você instalar os dois sistemas operacionais e gerenciar o uso pelo GRUB (é o que faço atualmente).
JD

Acessei o site do Wamp Server e verifiquei que a versão do php dele é a 5.5 o que não me agrada por não ser muito recente.
Confesso que não tenho experiencia com Wamp Server e isso me assusta um pouco, nunca tive problemas com o Xampp, está é a primeira vez.
Criar uma maquina virtual apenas para rodar um web server não acho legal, devido ao consumo de recursos que uma maquina virtual exige.
Um amigo meu utiliza o adianti com o Xampp vou ver com ele se ele teve este problema, estou suspeitando que a causa não é o Xampp e sim a versão ou configuração do PHP, afinal é o nucleo do PHP que é responsável por executar o código.
E tanto o Wamp quanto o Xampp ou um hambiente individual (Apache/PHP) deve ter o mesmo retorno do código, se a versão e o nucleo do php for o mesmo.
De qualquer forma as especificações do Adianti dizem o seguinte:

Independente de plataforma;

Compatível com PHP5.X;

Não necessita configuração especial para setup (Apenas descompacte e use);

Ou seja, ter que mudar o pacote de web server, criar uma maquina virtual com outro SO ou mudar versão do PHP do 5.6.11 pra outra versão inferior até 5.0 é fugir destes conceitos.
Agradeço a ajuda e compreensão de todos.
JD

Como já havia imaginado a causa do problema não é o Xampp...
Verifiquei que no construtor da classe TDate é setado um id da seguinte maneira:
 
  1. <?php
  2. public function __construct($name)
  3. {
  4. parent::__construct($name);
  5. $this->id = 'tdate_'.uniqid();
  6. ?>

Note que é utilizado a função uniqid() do PHP que gera um id "UNICO" de acordo com o tempo atual em milionésimos de segundo, porém identifiquei no html da tela que os dois campos estavam com o mesmo ID e esta é a verdadeira causa do problema.
Resolvi o problema trocando a função uniqid() para:
 
  1. <?php
  2. public function __construct($name)
  3. {
  4. parent::__construct($name);
  5. $this->id = 'tdate_'.date("His").rand(0,100);
  6. ?>


E assim garanti que fosse gerado um ID unico e o bug foi resolvido.

FC

Show de bola !!! Eu tinha parado de usar o vertrigo somente por causa disso.
JD

Uma solução mais limpa foi:

 
  1. <?php
  2. $this->id = 'tdate_'.uniqid(rand(0,100));
  3. ?>
PD

Esse bug já está resolvido, a próxima versão usará a mt_rand() que é melhor que a rand().
Vários componentes foram revisados.
Lembrando: a uniqid() é bugada em algumas versões do PHP para Windows.

Att,
JD

Maravilha !!!
Pablo já tem alguma previsão de quando vai ser lançada a próxima versão?
PD

Creio que no início do mês que vem.
Reta final :-)
JD

Não vejo a hora! kkk
Parabéns pelo framework, simplesmente incrível!