Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
onChangeAction - Campo Data - Message Senhores, gostaria de uma nova ajuda. Tenho um formulário bastante simples. Nele possuo dois campos TDATE, data de ida e data de volta. Adicionei um Change Action a um dos campos: Porém ocorre um comportamento estranho, quando a data da viagem comparada a hoje for infer...
FW
onChangeAction - Campo Data - Message  
Fechado
Senhores, gostaria de uma nova ajuda.

Tenho um formulário bastante simples.
Nele possuo dois campos TDATE, data de ida e data de volta.
Adicionei um Change Action a um dos campos:

 
  1. <?php
  2. $change_action = new TAction(array($this, 'onChangeAction'));
  3. $dt_volta->setExitAction($change_action);
  4. ?>


Porém ocorre um comportamento estranho, quando a data da viagem comparada a hoje for inferior a 15 dias, gostaria de exibir uma mensagem avisando, e setar uma variável, porém ao exibir a mensagem, o campo de data fica em branco, como posso resolver este problema???

Na minha Change Action tenho o seguinte:

 
  1. <?php
  2. public static function onChangeAction($param)
  3. {
  4. $dt_ida = $param['dt_ida'];
  5. $dt_volta = $param['dt_volta'];
  6. $vlr_dia = 60; // valor de 60 reais por dia.
  7. $obj = new StdClass;
  8. $excessao = 0;
  9. $dt_ida = strtotime(str_replace('/', '-', $dt_ida));
  10. $dt_volta = strtotime(str_replace('/', '-', $dt_volta));
  11. $hoje = strtotime(str_replace('/', '-', date('d/m/Y')));
  12. $prazo_viagem = (int)floor( ($dt_ida - $hoje) / (60 * 60 * 24));
  13. if($dt_ida < $hoje)
  14. {
  15. new TMessage('error', 'A data de IDA não pode ser menor que hoje.');
  16. $obj->dt_ida = '';
  17. }else{
  18. if($prazo_viagem < 15)
  19. {
  20. $message = 'Viagem programada com data inferior a 15 dias.';
  21. $message .= '<br> Será cadastrada como exceção. ';
  22. new TMessage('info', $message);
  23. $excessao = 1;
  24. }
  25. $diff = $dt_volta - $dt_ida;
  26. // Calcula a diferença de dias
  27. $dias = (int)floor( $diff / (60 * 60 * 24));
  28. $vlr_total = $vlr_dia * ($dias + 1);
  29. $vlr_total = number_format($vlr_total, 2, ',', '.');
  30. $obj->dias_viagem = $dias;
  31. $obj->alimentacao = $vlr_total;
  32. $obj->dias_alimenta = ($dias + 1);
  33. }
  34. TForm::sendData('form_solicita_viagem', $obj);
  35. }
  36. ?>


Obrigado.

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


JC

João, tenta implementar a sua lógica dentro do bloco try/catch.
FW

Jorge.

Adicionei o Try/Catch e não mudou nada.

Quando seleciono a data, ele faz a operação, exibe o alerta, e quando fecho a mensagem, a data não fica no campo.
GE

Oi.

Tenta alterar a ultima linha do código para:

TForm::sendData('form_solicita_viagem', $obj, FALSE, FALSE);

GE

Uma dúvida, para que serve a variavel $excessao ?
FW

Gustavo.
Obrigado pela dica.

Mas também não funcionou... Tentei exibir um TAlert, mas não estou conseguindo também.
Se removo o TMessage, a data fica no campo, bem estranho.

FW

Gustavo, ela vai servir para destacar este registro em um GRID.

Depois do cadastro, vou verificar se ela é igual a 1, se sim, alterar a cor da linha, ou algo do gênero, caracterizando urgência, e valor fora da politica.

NR

Fernando, testei o código que você postou e aqui a data fica preenchida, independente de aparecer a mensagem ou não.
Poste todo o código que tento executar novamente.
GE

Eu acho que o teu problema deve ser na lógica.

Uma dica para 'debugar' o código, você pode usar o TMessage('info', 'valor: '.$variavel);

com esse código você pode vendo o valor da variável durante o percurso do código.

abraços
FW

Nataniel, mais estranho ainda.

Gustavo, fiz isto e não aparece o valor da data...

Segue o fonte do Form Completo.

 
  1. <?php
  2. /**
  3. * FormSolicitaViagem
  4. *
  5. * @version 1.0
  6. * @author Fernando Adam Wazny
  7. */
  8. class FormSolicitaViagem extends TPage
  9. {
  10. private $form;
  11. /**
  12. * Class constructor
  13. * Creates the page
  14. */
  15. function __construct()
  16. {
  17. parent::__construct();
  18. // create the form using TQuickForm class
  19. $this->form = new TQuickForm('form_solicita_viagem');
  20. $this->form->class = 'tform';
  21. $this->form->setFormTitle('Solicita Viagem');
  22. $this->form->style = 'width:600px';
  23. // create the form fields
  24. $id_viagem = new TEntry('id_viagem');
  25. $dt_ida = new TDate('dt_ida');
  26. $dt_volta = new TDate('dt_volta');
  27. $dias_viagem = new TEntry('dias_viagem');
  28. $origem_id = new ">TDBSeekButton('origem_id', 'gestao_viagens', 'form_solicita_viagem', 'City', 'nome', 'origem_id', 'origem_nome');
  29. $origem_nome = new TEntry('origem_nome');
  30. $destino_id = new ">TDBSeekButton('destino_id', 'gestao_viagens', 'form_solicita_viagem', 'City', 'nome', 'destino_id', 'destino_nome');
  31. $destino_nome = new TEntry('destino_nome');
  32. $justificativa = new TText('justificativa');
  33. $hotel = new TEntry('hotel');
  34. $vlr_hotel = new TEntry('vlr_hotel');
  35. $transporte = new TCombo('transporte');
  36. $vlr_transp = new TEntry('vlr_transp');
  37. $colaborador_id = new ">TDBSeekButton('colaborador_id', 'gestao_viagens', 'form_solicita_viagem', 'Colaboradores', 'NOME', 'colaborador_id', 'colab_nome');
  38. $colab_nome = new TEntry('colab_nome');
  39. $alimentacao = new TEntry('alimentacao');
  40. $dias_alimenta = new TEntry('dias_alimenta');
  41. $quem = new THidden('quem');
  42. $quando = new THidden('quando');
  43. $adiantamento = new TRadioGroup('adiantamento');
  44. $vlr_adianta = new TEntry('vlr_adiantamento');
  45. $diretoria = new TEntry('diretoria');
  46. $area = new TEntry('area');
  47. $treinamento = new TRadioGroup('treinamento');
  48. $cod_treina = new TEntry('cod_treina');
  49. // parameters (name, database, model, key, value)
  50. //$user = new TDBCombo('user', 'permission', 'SystemUser', 'id', 'name');
  51. $id_viagem->setEditable(FALSE);
  52. $dias_viagem->setEditable(FALSE);
  53. $dt_ida->setMask('dd/mm/yyyy');
  54. $dt_volta->setMask('dd/mm/yyyy');
  55. $origem_nome->setEditable(FALSE);
  56. $destino_nome->setEditable(FALSE);
  57. $vlr_hotel->setNumericMask(2, ',', '.');
  58. $vlr_transp->setNumericMask(2, ',', '.');
  59. $colab_nome->setEditable(FALSE);
  60. $alimentacao->setEditable(FALSE);
  61. $alimentacao->setNumericMask(2, ',', '.');
  62. $dias_alimenta->setEditable(FALSE);
  63. $adiantamento->setLayout('horizontal');
  64. //$vlr_adianta->setNumericMask(2, ',', '.');
  65. $diretoria->setEditable(FALSE);
  66. $area->setEditable(FALSE);
  67. $treinamento->setLayout('horizontal');
  68. //$cod_treina->setEditable(FALSE);
  69. $combo_trans = array();
  70. $combo_trans['1'] ='Aéreo';
  71. $combo_trans['2'] ='Rodoviário';
  72. $combo_trans['3'] ='Frota';
  73. $adia_item = array();
  74. $adia_item['1'] ='Sim';
  75. $adia_item['2'] ='Não';
  76. $dt_ida->setSize(86);
  77. $dt_volta->setSize(86);
  78. $dias_viagem->setSize(30);
  79. $origem_id->setSize(60);
  80. $origem_nome->setSize(216);
  81. $destino_id->setSize(60);
  82. $destino_nome->setSize(216);
  83. $hotel->setSize(150);
  84. $vlr_hotel->setSize(80);
  85. $transporte->addItems($combo_trans);
  86. $transporte->setSize(150);
  87. $vlr_transp->setSize(80);
  88. $transporte->setDefaultOption('Selecione');
  89. $colaborador_id->setSize(60);
  90. $colab_nome->setSize(216);
  91. $alimentacao->setSize(80);
  92. $dias_alimenta->setSize(30);
  93. $adiantamento->addItems($adia_item);
  94. $vlr_adianta->setSize(80);
  95. $adiantamento->setValue(2);
  96. $diretoria->setSize(120);
  97. $area->setSize(133);
  98. $treinamento->addItems($adia_item);
  99. $treinamento->setValue(2);
  100. $cod_treina->setSize(110);
  101. // define how many columns
  102. //$this->form->setFieldsByRow(2);
  103. // add the fields inside the form
  104. $this->form->addQuickField('Id', $id_viagem, 40);
  105. $this->form->addQuickFields('Ida', array($dt_ida, new TLabel('Volta'), $dt_volta, new TLabel('Dias Viagem'), $dias_viagem));
  106. $this->form->addQuickFields('Origem', array($origem_id, $origem_nome));
  107. $this->form->addQuickFields('Destino', array($destino_id, $destino_nome));
  108. $this->form->addQuickFields('Colaborador', array($colaborador_id, $colab_nome));
  109. $this->form->addQuickField('Diretoria', $diretoria, 299);
  110. $this->form->addQuickField('Área', $area, 299);
  111. $this->form->addQuickFields('Hotel', array($hotel, new TLabel('Cotação'), $vlr_hotel));
  112. $this->form->addQuickFields('Transporte', array($transporte, new TLabel('Cotação'), $vlr_transp));
  113. $this->form->addQuickFields('Alimentação', array($alimentacao, new TLabel('Dias Alimentação'), $dias_alimenta));
  114. $this->form->addQuickField('quem', $quem, 40);
  115. $this->form->addQuickField('quando', $quando, 40);
  116. $this->form->addQuickFields('Adiantamento', array($adiantamento, new TLabel('Valor'), $vlr_adianta));
  117. $this->form->addQuickFields('Treinamento I.F.?', array($treinamento, new TLabel('Código'), $cod_treina));
  118. $row = $this->form->addRow();
  119. $row->class = 'tformsection';
  120. $row->addCell( new TLabel(''))->colspan = 2;
  121. $this->form->addQuickField('Justificativa', $justificativa, 120);
  122. $justificativa->setSize(400, 50);
  123. // validations
  124. $dt_ida->addValidation('Ida', new TRequiredValidator);
  125. $dt_volta->addValidation('Volta', new TRequiredValidator);
  126. $origem_id->addValidation('Origem', new TRequiredValidator);
  127. $destino_id->addValidation('Destino', new TRequiredValidator);
  128. $colaborador_id->addValidation('Colaborador', new TRequiredValidator);
  129. //$hotel->addValidation('Hotel', new TRequiredValidator);
  130. //$vlr_hotel->addValidation('Cotação Hotel', new TRequiredValidator);
  131. $transporte->addValidation('Transporte', new TRequiredValidator);
  132. //$vlr_transp->addValidation('Cotação Transporte', new TRequiredValidator);
  133. $justificativa->addValidation('Justificativa', new TRequiredValidator);
  134. // define the form action
  135. $this->form->addQuickAction('Salvar', new TAction(array($this, 'onSave')), 'ico_save.png');
  136. $this->form->addQuickAction('Novo', new TAction(array($this, 'onEdit')), 'fa:plus-square green');
  137. $this->form->addQuickAction('Listar Viagens', new TAction(array('SolicitaViagemList','onReload')), 'fa:table blue');
  138. // set change action for input_exit
  139. $change_action = new TAction(array($this, 'onChangeAction'));
  140. $dt_volta->setExitAction($change_action);
  141. // set change action for radioButton
  142. $adiantamento->setChangeAction( new TAction( array($this, 'onChangeRadio')) );
  143. self::onChangeRadio( array('adiantamento'=>1) );
  144. $treinamento->setChangeAction( new TAction( array($this, 'onChangeRadioTreina')) );
  145. self::onChangeRadioTreina( array('treinamento'=>2) );
  146. // set change action for Colaborador ID
  147. $colaborador_id->setExitAction(new TAction(array($this, 'onExitColabId')));
  148. // wrap the page content using vertical box
  149. $vbox = new TVBox;
  150. $vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  151. $vbox->add($this->form);
  152. parent::add($vbox);
  153. }
  154. /**
  155. * onChangeAction
  156. * Calculo de datas e Valor alimentação
  157. */
  158. public static function onChangeAction($param)
  159. {
  160. try
  161. {
  162. $dt_ida = $param['dt_ida'];
  163. $dt_volta = $param['dt_volta'];
  164. $vlr_dia = 60; // valor de 60 reais por dia.
  165. $obj = new StdClass;
  166. $dt_ida = strtotime(str_replace('/', '-', $dt_ida));
  167. $dt_volta = strtotime(str_replace('/', '-', $dt_volta));
  168. $hoje = strtotime(str_replace('/', '-', date('d/m/Y')));
  169. $prazo_viagem = (int)floor( ($dt_ida - $hoje) / (60 * 60 * 24));
  170. if($dt_ida < $hoje)
  171. {
  172. new TMessage('error', 'A data de IDA não pode ser menor que hoje.');
  173. $obj->dt_ida = '';
  174. }else{
  175. if($prazo_viagem < 15)
  176. {
  177. $message = 'Viagem programada com data inferior a 15 dias.';
  178. $message .= '<br> Será cadastrada como exceção.';
  179. new TMessage('info', $message);
  180. }
  181. $diff = $dt_volta - $dt_ida;
  182. // Calcula a diferença de dias
  183. $dias = (int)floor( $diff / (60 * 60 * 24));
  184. $vlr_total = $vlr_dia * ($dias + 1);
  185. $vlr_total = number_format($vlr_total, 2, ',', '.');
  186. $obj->dias_viagem = $dias;
  187. $obj->alimentacao = $vlr_total;
  188. $obj->dias_alimenta = ($dias + 1);
  189. }
  190. //TForm::sendData('form_solicita_viagem', $obj);
  191. TForm::sendData('form_solicita_viagem', $obj, FALSE, FALSE);
  192. }
  193. catch (Exception $e)
  194. {
  195. // shows the exception error message
  196. new TMessage('error', '<b>Error:</b> ' . $e->getMessage());
  197. }
  198. }
  199. /**
  200. * method onSave()
  201. * Salvar registros na base
  202. */
  203. function onSave()
  204. {
  205. try
  206. {
  207. // open a transaction with database 'permission'
  208. TTransaction::open('gestao_viagens');
  209. // get the form data into an active record System_user
  210. $object = $this->form->getData('SolicitaViagem');
  211. // form validation
  212. $this->form->validate();
  213. $object->quem = TSession::getValue('id_user');
  214. $object->quando = date("Y-m-d H:i:s");
  215. $object->store(); // stores the object
  216. // fill the form with the active record data
  217. $this->form->setData($object);
  218. // close the transaction
  219. TTransaction::close();
  220. // shows the success message
  221. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  222. // reload the listing
  223. }
  224. catch (Exception $e) // in case of exception
  225. {
  226. // shows the exception error message
  227. new TMessage('error', '<b>Error:</b> ' . $e->getMessage());
  228. // undo all pending operations
  229. TTransaction::rollback();
  230. }
  231. }
  232. /**
  233. * method onEdit()
  234. * Editar registros da base
  235. */
  236. function onEdit($param)
  237. {
  238. try
  239. {
  240. if (isset($param['key']))
  241. {
  242. // open a transaction with database 'permission'
  243. TTransaction::open('gestao_viagens');
  244. // get PDO connection
  245. $conn = TTransaction::get();
  246. // make query
  247. $result = $conn->query('PRAGMA foreign_keys = ON');
  248. $key = $param['key'];
  249. $objetc = new SolicitaViagem($key);
  250. $objetc->origem_nome = $objetc->get_city_name_origem();
  251. $objetc->destino_nome = $objetc->get_city_name_destino();
  252. $objetc->colab_nome = $objetc->get_colaborador();
  253. $objetc->diretoria = $objetc->get_Diretoria_Colab();
  254. $objetc->area = $objetc->get_Area_Colab();
  255. if($objetc->adiantamento == 2)
  256. {
  257. TEntry::disableField('form_solicita_viagem', 'vlr_adiantamento');
  258. TEntry::clearField('form_solicita_viagem', 'vlr_adiantamento');
  259. }
  260. //$message = $objetc->get_CC_colab();
  261. //TMessage('info', $message);
  262. $dt_ida = $objetc->dt_ida;
  263. $dt_volta = $objetc->dt_volta;
  264. $dt_ida = strtotime(str_replace('/', '-', $dt_ida));
  265. $dt_volta = strtotime(str_replace('/', '-', $dt_volta));
  266. $diff = $dt_volta - $dt_ida;
  267. // Calcula a diferença de dias
  268. $dias = (int)floor( $diff / (60 * 60 * 24));
  269. $objetc->dias_viagem = $dias;
  270. $objetc->dias_alimenta = ($dias + 1);
  271. $this->form->setData($objetc);
  272. // close the transaction
  273. TTransaction::close();
  274. }
  275. else
  276. {
  277. $this->form->clear();
  278. }
  279. }
  280. catch (Exception $e)
  281. {
  282. // shows the exception error message
  283. new TMessage('error', '<b>Error:</b> ' . $e->getMessage());
  284. }
  285. }
  286. /**
  287. * method onChangeRadio()
  288. * Habilitar/Desabilitar Radio
  289. */
  290. public static function onChangeRadio($param)
  291. {
  292. if ($param['adiantamento'] == 1)
  293. {
  294. TEntry::enableField('form_solicita_viagem', 'vlr_adiantamento');
  295. }
  296. else
  297. {
  298. TEntry::clearField('form_solicita_viagem', 'vlr_adiantamento');
  299. TEntry::disableField('form_solicita_viagem', 'vlr_adiantamento');
  300. }
  301. }
  302. /**
  303. * method onChangeRadio()
  304. * Habilitar/Desabilitar Radio
  305. */
  306. public static function onChangeRadioTreina($param)
  307. {
  308. if ($param['treinamento'] == 1)
  309. {
  310. TEntry::enableField('form_solicita_viagem', 'cod_treina');
  311. }
  312. else
  313. {
  314. TEntry::disableField('form_solicita_viagem', 'cod_treina');
  315. TEntry::clearField('form_solicita_viagem', 'cod_treina');
  316. }
  317. }
  318. /**
  319. * Exit action for the field Colaborador
  320. * Busca informações adicionais
  321. */
  322. public static function onExitColabId($param)
  323. {
  324. $colab_id = $param['colaborador_id']; // get the product code
  325. try
  326. {
  327. TTransaction::open('gestao_viagens');
  328. $colab = new Colaboradores($colab_id); // reads the product
  329. $obj = new StdClass;
  330. $obj->diretoria = $colab->DIR2;
  331. $obj->area = $colab->AREA;
  332. TTransaction::close();
  333. TForm::sendData('form_solicita_viagem', $obj);
  334. }
  335. catch (Exception $e)
  336. {
  337. new TMessage('error', '<b>Error:</b> ' . $e->getMessage());
  338. }
  339. }
  340. }
  341. ?>
NR

Executei aqui, sem problemas. A data continua preenchida.

Faça o teste em outro navegador.
GE

Oi.

Se eu fosse desenvolver a aplicação, em primeiro lugar:

Criaria um OnChangeAction para cada validação de cada campo.
Por exemplo, eu tenho que preencher o campo de volta para ele validar a data de IDA.
E dai ele valida a data de ida e na linha 194:
$obj->dt_ida = '';
Ele seta vazio o campo de ida.

Ou seja, eu iria criar um validador para para quando o setasse uma data ele já validasse, como por exemplo no meu código aqui:

$change_status = new TAction(array ($this, 'onChangeDataInicio')); $data_inicio->setExitAction($change_status);



/** * Executed when user leaves the fields */ public static function onChangeDataInicio($param) { $string = new StringsUtil; $obj = new StdClass; if( strtotime( $string->formatDate( $param['data_inicio'] ) ) > strtotime(date('Y-m-d') ) ) { $obj->data_inicio = ''; $obj->data_inicio_oculta = ''; new TMessage('error', 'Data de inicio maior que data atual'); } TForm::sendData('form_Ticket', $obj, FALSE, FALSE); }


public function formatDate($date) { if($date) { $dt = explode('/', $date); $retorno = $dt[2].'-'.$dt[1].'-'.$dt[0]; return $retorno; } } public function formatDateBR($date) { if($date) { $dt = explode('-', $date); $retorno = $dt[2].'/'.$dt[1].'/'.$dt[0]; return $retorno; } }
FW

Nataniel,

Estou usando o Google Chrome, ultima versão.
IE 8 não funciona - Nem abre a tela de login.
IE 11 não funciona - Nem abre a tela de login.
Firefox 46 - Não armazena a data no campo.

Rodando no PHP 5.4.6.
FW

Gustavo,

Vou testar esta sua dica.
GE

talvez esse seja o teu problema:
Rodando no PHP 5.4.6.
FW

Gustavo.

Vou tentar atualizar, o problema que a maquina que estou usando como servidor é bastante antiga.
Esta executando em um Windows Server 2003.

Vou ver oq consigo fazer para atualizar, talvez resolva, se no teste do Nataniel funcionou normal.

Obrigado por hora.
FW

Não vou conseguir atualizar o PHP...

Será que existe alguma outra coisa que eu possa fazer?

Na versão atualizada da ferramenta, vem o PHP 5.4.31
FW

O estranho é que ele some o valor do campo dt_volta quando entra no if.
Mas quando a operação é maior que 15, funciona normalmente.
FW

Como posso substituir este TMessage por um TAlert??
Quando tiro o TMessage ele funciona de boas.
FW

Mais estranho ainda.

Se eu adicionar um Alert dentro do IF, ele aparece o alert e mais uma modal de erro, sem ter nenhuma modal adicionada.
E não calcula os demais campos, mas se eu clicar na data e der um TAB ele funciona, aparece o alert mas não a Modal de erro.

Alguma dica?? Creio que seja alguma coisa do TMessage, que causa isto.

FW

Pessoal...

Fazendo mais testes, cheguei ao seguinte cenário.

Ele dispara o evento antes de preencher o valor.
Removi o TMessage, e adicionei um var_dump / echo.
Quando clico no campo e seleciono uma data qualquer, ele dispara com o clique e depois dispara com com o valor preenchido.

Adicionei um if(dt_ida) e resolveu o problema.

Perdi a manhã e parte da tarde nisto, hahahaha, vivendo e aprendendo.
Talvez seja meu servidor ou a versão do PHP, mas consegui contornar.

Obrigado pela ajuda pessoal.