AN
ExitAction em um Input - Problema com TForm::sendData
Olá.
Descrevendo o problema.
Tenho um formulário onde deve-se entrar a quantidade e o valor unitário. Usando o ExitAction quando o usuário sai do campo valor unitário, o valor total é atualizado (pela multiplicação dos campos.... evidentemente). Tudo funciona bem EXCETO se:
Supondo que eu já tenha gravado anteriormente as informações eu queira alterá-la. Daí através de uma funcao estatica eu recarrego os valores previamente cadastrados através de um TForm::sendData. Deste ponto em diante o programa se perde e não atualiza mais tanto o valor final quanto outros campos tais como SeekButton e afins.
Com a finalidade para que possam testar segue uma tela simples. Nela entre o valor unitario e a quantidade. Ao sair da quantidade o valor total será atualizado normalmente. Após clique no botão Testar Send (ela irá colocar o valor 500 e o valor 2 e tentará passar a multiplicação 1000 para o total e verá que não irá atualizar). Entre novamente o valor unitario e a quantidade. Verá que o ExitAcion não será executado. Se nessa tela tivesse seekbutton... idem. Segue um screenshot da tela do sistema e um exemplo simples do codigo para teste.
ARQUIVO XML
<?xml version="1.0" encoding="UTF-8"?>
<form>
<tlabel id="0">
<class>TLabel</class>
<name>label1</name>
<x>105</x>
<y>15</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Consistência de ExitAction</value>
</tlabel>
<tlabel id="1">
<class>TLabel</class>
<name>label2</name>
<x>20</x>
<y>60</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Valor Unitário:</value>
</tlabel>
<tlabel id="2">
<class>TLabel</class>
<name>label3</name>
<x>310</x>
<y>60</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Quantidade:</value>
</tlabel>
<tentry id="3">
<class>TEntry</class>
<name>unitario</name>
<x>115</x>
<y>55</y>
<value></value>
<mask></mask>
<width>160</width>
<maxlen>15</maxlen>
<editable>1</editable>
<tip></tip>
<required></required>
</tentry>
<tentry id="4">
<class>TEntry</class>
<name>quantidade</name>
<x>395</x>
<y>55</y>
<value></value>
<mask></mask>
<width>160</width>
<maxlen>0</maxlen>
<editable>1</editable>
<tip></tip>
<required></required>
</tentry>
<tlabel id="5">
<class>TLabel</class>
<name>label4</name>
<x>140</x>
<y>110</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Valor Total:</value>
</tlabel>
<tentry id="6">
<class>TEntry</class>
<name>total</name>
<x>215</x>
<y>105</y>
<value></value>
<mask></mask>
<width>160</width>
<maxlen>15</maxlen>
<editable>1</editable>
<tip></tip>
<required></required>
</tentry>
<tbutton id="7">
<class>TButton</class>
<name>button1</name>
<x>435</x>
<y>105</y>
<value>Testar Send</value>
<icon>ico_question.png</icon>
<action>OnTeste</action>
<template></template>
</tbutton>
</form>
Descrevendo o problema.
Tenho um formulário onde deve-se entrar a quantidade e o valor unitário. Usando o ExitAction quando o usuário sai do campo valor unitário, o valor total é atualizado (pela multiplicação dos campos.... evidentemente). Tudo funciona bem EXCETO se:
Supondo que eu já tenha gravado anteriormente as informações eu queira alterá-la. Daí através de uma funcao estatica eu recarrego os valores previamente cadastrados através de um TForm::sendData. Deste ponto em diante o programa se perde e não atualiza mais tanto o valor final quanto outros campos tais como SeekButton e afins.
Com a finalidade para que possam testar segue uma tela simples. Nela entre o valor unitario e a quantidade. Ao sair da quantidade o valor total será atualizado normalmente. Após clique no botão Testar Send (ela irá colocar o valor 500 e o valor 2 e tentará passar a multiplicação 1000 para o total e verá que não irá atualizar). Entre novamente o valor unitario e a quantidade. Verá que o ExitAcion não será executado. Se nessa tela tivesse seekbutton... idem. Segue um screenshot da tela do sistema e um exemplo simples do codigo para teste.
- <?php
- /**
- * testesend Registration
- * @author <your name here>
- */
- class testesend extends TPage
- {
- private $form;
- /**
- * Class constructor
- * Creates the page and the registration form
- */
- function __construct()
- {
- parent::__construct();
- // creates the form
- $this->form = new TForm('form_teste');
- try
- {
- // TUIBuilder object
- $ui = new TUIBuilder(500,500);
- $ui->setController($this);
- $ui->setForm($this->form);
- // reads the xml form
- $ui->parseFile('app/forms/testesend.form.xml');
- $unitario = $ui->getWidget('unitario');
- $unitario->setNumericMask(2,',','.',TRUE);
- $quantidade = $ui->getWidget('quantidade');
- $quantidade->setNumericMask(2,',','.',TRUE);
- $total = $ui->getWidget('total');
- $total->setNumericMask(2,',','.',TRUE);
- $quantidade->setValue(0);
- $unitario->setValue(0);
- $total->setValue(0);
- $exit_action = new TAction(array($this, 'onExitAction'));
- $quantidade->setExitAction($exit_action);
- // get the interface widgets
- $fields = $ui->getWidgets();
- // add the TUIBuilder panel inside the TForm object
- $this->form->add($ui);
- // set form fields from interface fields
- $this->form->setFields($ui->getFields());
- }
- catch (Exception $e)
- {
- new TMessage('error', $e->getMessage());
- }
- // add the form to the page
- parent::add($this->form);
- }
- public static function onExitAction($param)
- {
- $valor = str_replace('.','',$param['unitario']);
- $valor = str_replace(',','.',$valor);
- $lunitario = $valor;
- $valor = str_replace('.','',$param['quantidade']);
- $valor = str_replace(',','.',$valor);
- $lqtdade = $valor;
- $ltotal = $lunitario*$lqtdade;
- $ltotal = number_format($ltotal,2,",",".");
- $send = new StdClass;
- $send->total = $ltotal;
- TForm::sendData('form_teste', $send);
- }
- public static function OnTeste($param)
- {
- $send = new StdClass;
- $send->unitario = 500;
- $send->quantidade = 2;
- $send->total = 1000;
- TForm::sendData('form_teste', $send);
- }
- }
- ?>
ARQUIVO XML
<?xml version="1.0" encoding="UTF-8"?>
<form>
<tlabel id="0">
<class>TLabel</class>
<name>label1</name>
<x>105</x>
<y>15</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Consistência de ExitAction</value>
</tlabel>
<tlabel id="1">
<class>TLabel</class>
<name>label2</name>
<x>20</x>
<y>60</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Valor Unitário:</value>
</tlabel>
<tlabel id="2">
<class>TLabel</class>
<name>label3</name>
<x>310</x>
<y>60</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Quantidade:</value>
</tlabel>
<tentry id="3">
<class>TEntry</class>
<name>unitario</name>
<x>115</x>
<y>55</y>
<value></value>
<mask></mask>
<width>160</width>
<maxlen>15</maxlen>
<editable>1</editable>
<tip></tip>
<required></required>
</tentry>
<tentry id="4">
<class>TEntry</class>
<name>quantidade</name>
<x>395</x>
<y>55</y>
<value></value>
<mask></mask>
<width>160</width>
<maxlen>0</maxlen>
<editable>1</editable>
<tip></tip>
<required></required>
</tentry>
<tlabel id="5">
<class>TLabel</class>
<name>label4</name>
<x>140</x>
<y>110</y>
<color>#000000</color>
<size>10</size>
<style></style>
<value>Valor Total:</value>
</tlabel>
<tentry id="6">
<class>TEntry</class>
<name>total</name>
<x>215</x>
<y>105</y>
<value></value>
<mask></mask>
<width>160</width>
<maxlen>15</maxlen>
<editable>1</editable>
<tip></tip>
<required></required>
</tentry>
<tbutton id="7">
<class>TButton</class>
<name>button1</name>
<x>435</x>
<y>105</y>
<value>Testar Send</value>
<icon>ico_question.png</icon>
<action>OnTeste</action>
<template></template>
</tbutton>
</form>
Testei esse código que você forneceu e não tive problemas(Firefox e Chrome), atualizou certinho o total para 1000 após clicar no botão e modificando valor/quantidade continuou executando o exitAction.
Você está com os erros habilitados no php? O console não exibe nenhum erro javascript?
Desculpe a demora em responder Nataniel.
Tive que fazer uma cirurgia do estômago e a recuperação é bem dificil. Qual SO voce usa aí. Se Linux qual a distribuição?
Vou enviar no seu email duas telas que gravei em um screen recorder te mostrando o que está acontecendo.
Grato.