Conheça  A Ferramenta LowCode mais moderna e veloz para desenvolvimento PHP: Adianti Creator
Retorno de valores usando TFieldList Segue meu codigo. Estou fazendo uma entrada de produto utilizando um TFieldList, coloquei no produto o evento onChangeProduct que deveria retornar o preco de venda do produto , só que isso nao esta acontecendo, ja procurei mas nao consegui localizar o erro, na function onChangeProduct esta trazendo os valores ja testei, o problema esta em atualizar a tela. obrigado. ...
PG
Retorno de valores usando TFieldList  
Segue meu codigo.

Estou fazendo uma entrada de produto utilizando um TFieldList,
coloquei no produto o evento onChangeProduct que
deveria retornar o preco de venda do produto , só que
isso nao esta acontecendo, ja procurei mas nao consegui localizar o erro,
na function onChangeProduct esta trazendo os valores ja testei,
o problema esta em atualizar a tela.
obrigado.



 
  1. <?php
  2. /**
  3. * ComprasForm Master/Detail
  4. * @author <your name here>
  5. */
  6. class ComprasForm extends TPage
  7. {
  8. protected $form; // form
  9. protected $fieldlist;
  10. /**
  11. * Class constructor
  12. * Creates the page and the registration form
  13. */
  14. function __construct($param)
  15. {
  16. parent::__construct($param);
  17. // creates the form
  18. $this->form = new BootstrapFormBuilder('form_Compras');
  19. $this->form->setFormTitle('Compras');
  20. // master fields
  21. $id = new TEntry('id');
  22. $fornecedor_id = new TDBUniqueSearch('fornecedor_id', 'tutorerpdfe', 'Pessoa', 'id', 'nome');
  23. $usuario_id = new THidden('usuario_id');
  24. $nfnumero = new TEntry('nfnumero');
  25. $observacao = new TEntry('observacao');
  26. $totalprodutos = new TEntry('totalprodutos');
  27. $desconto = new TEntry('desconto');
  28. $totalnota = new TEntry('totalnota');
  29. $data_nota = new TDate('data_nota');
  30. $nfrete = new TEntry('nfrete');
  31. $xml_path = new TEntry('xml_path');
  32. $xml_chave = new TEntry('xml_chave');
  33. // sizes
  34. $id->setSize('100%');
  35. $fornecedor_id->setSize('100%');
  36. $usuario_id->setSize('100%');
  37. $nfnumero->setSize('100%');
  38. $observacao->setSize('100%');
  39. $totalprodutos->setSize('100%');
  40. $desconto->setSize('100%');
  41. $totalnota->setSize('100%');
  42. $data_nota->setSize('50%');
  43. $nfrete->setSize('100%');
  44. $xml_path->setSize('100%');
  45. $xml_chave->setSize('100%');
  46. $totalprodutos->setNumericMask(2, ',', '.', true);
  47. $desconto->setNumericMask(2, ',', '.', true);
  48. $totalnota->setNumericMask(2, ',', '.', true);
  49. $nfrete->setNumericMask(2, ',', '.', true);
  50. $totalprodutos->setValue('0');
  51. $desconto->setValue('0');
  52. $totalnota->setValue('0');
  53. $nfrete->setValue('0');
  54. $fornecedor_id->setMinLength(0);
  55. $data_nota->setMask('dd/mm/yyyy',true);
  56. $data_nota->setDatabaseMask('yyyy-mm-dd');
  57. $data_nota->setOption('showOnFocus', false);
  58. $data_nota->setOption('triggerEvent', 'dblclick');
  59. if (!empty($id))
  60. {
  61. $id->setEditable(FALSE);
  62. }
  63. $this->form->addField($usuario_id );
  64. // add form fields to the form
  65. $row=$this->form->addFields( [new TLabel('Fornecedor')], [$fornecedor_id] , [new TLabel('Id')], [$id] );
  66. $row->layout = [ 'col-sm-2 control-label', 'col-sm-7', 'col-sm-2 control-label', 'col-sm-1' ];
  67. $row->class = 'form-control-sm';
  68. $row=$this->form->addFields( [new TLabel('Data Nota')], [$data_nota] , [new TLabel('NF. Numero')], [$nfnumero] );
  69. $row->class = 'form-control-sm';
  70. $row=$this->form->addFields( [new TLabel('R$ Desconto')], [$desconto] , [new TLabel('R$ Frete')], [$nfrete] );
  71. $row->class = 'form-control-sm';
  72. $row=$this->form->addFields( [new TLabel('R$ Produtos')], [$totalprodutos] , [new TLabel(' R$ Nota')], [$totalnota] );
  73. $row->class = 'form-control-sm';
  74. $row=$this->form->addFields( [new TLabel('Observacao')], [$observacao] );
  75. $row->class = 'form-control-sm';
  76. $row=$this->form->addFields( [new TLabel('Xml Path')], [$xml_path] );
  77. $row->class = 'form-control-sm';
  78. $row=$this->form->addFields( [new TLabel('Xml Chave')], [$xml_chave] );
  79. $row->class = 'form-control-sm';
  80. // detail fields
  81. $this->fieldlist = new TFieldList;
  82. $this->fieldlist-> width = '100%';
  83. $this->fieldlist->enableSorting();
  84. $produto_id = new TDBUniqueSearch('list_produto_id[]', 'tutorerpdfe', 'Produto', 'id', 'sdescricao');
  85. $produto_id->setChangeAction(new TAction(array($this, 'onChangeProduct')));
  86. $nvalorunitario = new TEntry('list_nvalorunitario[]');
  87. $nvalorunitario->setNumericMask(2,',','.', true);
  88. $nvalorunitario->setSize('100%');
  89. $nvalorunitario->style = 'text-align: right';
  90. $nquantidade = new TEntry('list_nquantidade[]');
  91. $nquantidade->setNumericMask(2,',','.', true);
  92. $nquantidade->setSize('100%');
  93. $nquantidade->setExitAction(new TAction(array($this, 'onUpdateTotal')));
  94. $nquantidade->style = 'text-align: right';
  95. $ntotalitem = new TEntry('list_ntotalitem[]');
  96. $ntotalitem->setNumericMask(2,',','.', true);
  97. $ntotalitem->setSize('100%');
  98. $ntotalitem->style = 'text-align: right';
  99. $unidade_id = new TDBUniqueSearch('list_unidade_id[]', 'tutorerpdfe', 'Unidade', 'id', 'sdescricao');
  100. $produto_id->setSize('100%');
  101. $nvalorunitario->setSize('100%');
  102. $nquantidade->setSize('100%');
  103. $ntotalitem->setSize('100%');
  104. $unidade_id->setSize('100%');
  105. $produto_id->setMinLength(0);
  106. $unidade_id->setMinLength(0);
  107. $this->fieldlist->addField( '<p style="color:navy"><b>Produto</b></p>', $produto_id,['width' => '30%']);
  108. $this->fieldlist->addField( '<p style="color:navy"><b>Unidade</b></p>', $unidade_id,['width' => '15%']);
  109. $this->fieldlist->addField( '<p style="color:navy"><b>R$ Unitário</b></p>', $nvalorunitario);
  110. $this->fieldlist->addField( '<p style="color:navy"><b>Quantidade</b></p>', $nquantidade);
  111. $this->fieldlist->addField( '<p style="color:navy"><b>R$ Total</b></p>', $ntotalitem ,['sum' => true] );
  112. $this->form->addField($produto_id);
  113. $this->form->addField($unidade_id);
  114. $this->form->addField($nvalorunitario);
  115. $this->form->addField($nquantidade);
  116. $this->form->addField($ntotalitem);
  117. $this->form->addFields( [new TFormSeparator('Itens da Compra', 'navy', '18', '#eeeeee')] );
  118. $this->form->addFields( [$this->fieldlist] );
  119. // create actions
  120. $this->form->addAction( _t('Save'), new TAction( [$this, 'onSave'] ), 'fa:save green' );
  121. $this->form->addAction( _t('Clear'), new TAction( [$this, 'onClear'] ), 'fa:eraser red' );
  122. // create the page container
  123. $container = new TVBox;
  124. $container->style = 'width: 100%';
  125. //$container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  126. $container->add($this->form);
  127. parent::add($container);
  128. }
  129. /**
  130. * Executed whenever the user clicks at the edit button da datagrid
  131. */
  132. function onEdit($param)
  133. {
  134. try
  135. {
  136. TTransaction::open('tutorerpdfe');
  137. if (isset($param['key']))
  138. {
  139. $key = $param['key'];
  140. $object = new Compras($key);
  141. $this->form->setData($object);
  142. $items = ComprasItem::where('compras_id', '=', $key)->load();
  143. if ($items)
  144. {
  145. $this->fieldlist->addHeader();
  146. foreach($items as $item )
  147. {
  148. $detail = new stdClass;
  149. $detail->list_produto_id = $item->produto_id;
  150. $detail->list_nvalorunitario = $item->nvalorunitario;
  151. $detail->list_nquantidade = $item->nquantidade;
  152. $detail->list_ntotalitem = $item->ntotalitem;
  153. $detail->list_unidade_id = $item->unidade_id;
  154. $this->fieldlist->addDetail($detail);
  155. }
  156. $this->fieldlist->addCloneAction();
  157. }
  158. else
  159. {
  160. $this->onClear($param);
  161. }
  162. TTransaction::close(); // close transaction
  163. }
  164. else
  165. {
  166. $this->onClear($param);
  167. }
  168. }
  169. catch (Exception $e) // in case of exception
  170. {
  171. new TMessage('error', $e->getMessage());
  172. TTransaction::rollback();
  173. }
  174. }
  175. /**
  176. * Clear form
  177. */
  178. public function onClear($param)
  179. {
  180. $this->fieldlist->addHeader();
  181. $this->fieldlist->addDetail( new stdClass );
  182. $this->fieldlist->addCloneAction();
  183. }
  184. /**
  185. * Save the Compras and the ComprasItem's
  186. */
  187. public static function onSave($param)
  188. {
  189. try
  190. {
  191. TTransaction::open('tutorerpdfe');
  192. $id = (int) $param['id'];
  193. $master = new Compras;
  194. $master->fromArray( $param);
  195. $master->store(); // save master object
  196. // delete details
  197. ComprasItem::where('compras_id', '=', $master->id)->delete();
  198. if( !empty($param['list_produto_id']) AND is_array($param['list_produto_id']) )
  199. {
  200. foreach( $param['list_produto_id'] as $row => $produto_id)
  201. {
  202. if (!empty($produto_id))
  203. {
  204. $detail = new ComprasItem;
  205. $detail->compras_id = $master->id;
  206. $detail->produto_id = $param['list_produto_id'][$row];
  207. $detail->nvalorunitario = $param['list_nvalorunitario'][$row];
  208. $detail->nquantidade = $param['list_nquantidade'][$row];
  209. $detail->ntotalitem = $param['list_ntotalitem'][$row];
  210. $detail->unidade_id = $param['list_unidade_id'][$row];
  211. $detail->store();
  212. }
  213. }
  214. }
  215. $data = new stdClass;
  216. $data->id = $master->id;
  217. TForm::sendData('form_Compras', $data);
  218. TTransaction::close(); // close the transaction
  219. new TMessage('info', AdiantiCoreTranslator::translate('Record saved'));
  220. }
  221. catch (Exception $e) // in case of exception
  222. {
  223. new TMessage('error', $e->getMessage());
  224. TTransaction::rollback();
  225. }
  226. }
  227. public static function onChangeProduct($param)
  228. {
  229. $input_id = $param['_field_id'];
  230. $produto_id = $param['_field_value'];
  231. $input_pieces = explode('_', $input_id);
  232. $unique_id = end($input_pieces);
  233. if ($produto_id)
  234. {
  235. $response = new stdClass;
  236. try
  237. {
  238. TTransaction::open('tutorerpdfe');
  239. $produto = Produto::find($produto_id);
  240. $response->{'nvalorunitario_'.$unique_id} = number_format($produto->nprecovenda,2,',', '.');
  241. $response->{'nquantidade_'.$unique_id} = '1,00';
  242. $response->{'ntotalitem_'.$unique_id} = number_format($produto->nprecovenda,2,',', '.');
  243. TForm::sendData('form_Compras', $response);
  244. TTransaction::close();
  245. }
  246. catch (Exception $e)
  247. {
  248. TTransaction::rollback();
  249. }
  250. }
  251. }
  252. /**
  253. * Update the total based on the sale price, amount and discount
  254. */
  255. public static function onUpdateTotal($param)
  256. {
  257. $input_id = $param['_field_id'];
  258. $produto_id = $param['_field_value'];
  259. $input_pieces = explode('_', $input_id);
  260. $unique_id = end($input_pieces);
  261. parse_str($param['_field_data'], $field_data);
  262. $row = $field_data['row'];
  263. $sale_price = (double) str_replace(['.', ','], ['', '.'], $param['nvalorunitario'][$row]);
  264. $amount = (double) str_replace(['.', ','], ['', '.'], $param['nquantidade'][$row]);
  265. $obj = new StdClass;
  266. $obj->{'ntotalitem_'.$unique_id} = number_format( ($sale_price * $amount), 2, ',', '.');
  267. TForm::sendData('form_Compras', $obj);
  268. }
  269. }

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


NR

O nome dos campos está errado:
 
  1. <?php
  2. // construct
  3. $nvalorunitario = new TEntry('list_nvalorunitario[]');
  4. // onChangeProduct - falta o list_
  5. $response->{'nvalorunitario_'.$unique_id} = number_format($produto->nprecovenda,2,',', '.');
  6. ?>