RA
getData não retorna valores do Datagrid
Olá pessoal, preciso de uma ajuda, copiei aqui mesmo do forum um exemplo para gerar Parcelamento de títulos (https://www.adianti.com.br/forum/pt/view_1630?simulacao-de-financiamento) autor Flavio Maidl, fiz algumas adequações para meu uso, porém não estou conseguindo pegar os valores do datagrid na Action do boão Confirmar, usando $data = $this->form->getData();, porém não retorna os valores da datagrid;
Segue codigo:
segue também o var_dump($data);
Segue codigo:
- <?php
- class geradorFinaciamentos extends TWindow {
- protected $form;
- private $datagrid;
- use Adianti\base\AdiantiStandardListTrait;
- public function __construct($param) {
- parent::__construct();
- $this->setDatabase('gecom'); // defines the database
- $this->setActiveRecord('Contas'); // defines the active record
- $this->setDefaultOrder('id', 'asc'); // defines the default order
- $this->form = new TForm('form_Vencimentos');
- // $this->setTitle('Simulador de Parcelamento');
- $Clientes_id = new TDBUniqueSearch('Clientes_id', 'gecom', 'Clientes', 'id', 'CLI_NOME');
- $Clientes_id->setSize('100%');
- $Planoct_id = new TDBUniqueSearch('Planoct_id', 'gecom', 'Planoct', 'id', 'PLA_DESCRICAO');
- $Planoct_id->setMask('{PLA_DESCRICAO} - ({id})');
- $Planoct_id->setSize('100%');
- $this->form->add(new TLabel('<b>Cliente/Fornecedor:</b>'));
- $this->form->add($Clientes_id);
- $this->form->add(new TLabel('<b>Plano de Contas::</b>'));
- $this->form->add($Planoct_id);
- $Historico = new TEntry('Historico');
- $Historico->setSize('100%');
- $this->form->add(new TLabel('Histórico:'));
- $this->form->add($Historico);
- $Dias = new TNumeric(2, ',', '.', true);
- $Dias->setValue(30);
- $Dias->setSize('20%');
- // with: 500, height: automatic
- // parent::setSize(0.4, 0.7); // use 0.6, 0.4 (for relative sizes 60%, 40%)
- $texto = new TEntry('texto');
- $texto->setSize('40%');
- // $texto->setValue('1');
- $venci = new TDate('venci');
- $venci->setSize('30%');
- $total = new TEntry('total');
- $doc = new TEntry('doc');
- // $titulo = new TLabel('<font color = blue>Simulador de Parcelas</font');
- // $this->label = new TLabel('Resultado');
- $this->vtotal = new TLabel('-');
- $botao = TButton::create('testar', array($this, 'onTeste'), 'Simular parcelamento', 'fa:eye green');
- $confirmar = TButton::create('confirmar', array($this, 'onConfirmar'), 'Confirmar', 'fa:check green');
- $Dias->popover = 'true';
- $Dias->poptitle = '<font color = blue /><b>Nº de dias de intervalo entre as parcelas.</b>';
- $texto->popover = 'true';
- $texto->poptitle = '<font color = blue /><b>Quantidade de Parcelas.</b>';
- $botao->popover = 'true';
- $botao->poptitle = '<font color = red /><b>SIMULAR PARCELAMENTO</b>';
- $botao->popcontent = '<font color = blue>Simula o parcelamento, deixando parcelas com valor exato e calculando vencimentos.</font>';
- $venci->setMask('dd/mm/yyyy');
- $this->form->add(new TLabel('Data Base: '));
- $this->form->add($venci);
- $this->form->add(new TLabel('Intervalo:'));
- $this->form->add($Dias);
- $this->form->add('<br>');
- $this->form->add(new TLabel('Documento:'));
- $this->form->add($doc);
- $this->form->add('<br>');
- $this->form->add(new TLabel('Parcelas:'));
- $this->form->add($texto);
- $this->form->add('<br>');
- $this->form->add(new TLabel('Valor: '));
- $this->form->add($total);
- $this->form->add('<br>');
- $this->form->add($botao);
- $this->form->add($confirmar);
- // creates one datagrid
- $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
- $this->datagrid->setHeight(320);
- $this->datagrid->style = 'width: 100%';
- $this->form->add($this->datagrid);
- $col_parcela = new TDataGridColumn('CON_PARCELA','Parcela', 'left');
- $col_doc = new TDataGridColumn('CON_DOCUMENTO','Documento', 'center');
- $col_vencto = new TDataGridColumn('CON_VENCTO','Vencimento', 'left');
- $col_valor = new TDataGridColumn('CON_VALOR', 'Valor', 'right');
- $this->datagrid->addColumn($col_parcela);
- $this->datagrid->addColumn($col_doc);
- $this->datagrid->addColumn($col_vencto);
- $this->datagrid->addColumn($col_valor);
- $this->form->setFields(array($Clientes_id,$Historico, $texto,$doc, $venci, $botao, $confirmar, $total));
- $this->datagrid->createModel();
- $container = new TVBox;
- $container->style = 'width: 90%';
- $container->add($this->form);
- parent::add($container);
- }
- function onTeste() {
- $data = $this->form->getData();
- $date = TDate::date2us(date($data->venci));
- $date = new DateTime( $date );
- $vezes = (double) str_replace(['.', ','], ['', '.'], $data->texto);
- $total = (double) str_replace(['.', ','], ['', '.'], $data->total);
- $valor = ($total / $vezes);
- $this->datagrid->clear();
- for ($n=1; $n<=$vezes; $n++)
- {
- $date->add(new DateInterval('P1M')); //'P1M'
- //echo $date->format('Y-m-d');
- //echo "n";
- $nueba = $nueba . $date->format('Y-m-d').';';
- //echo $nueba;
- }
- $binda = explode(';', $nueba);
- $NumerodeParcelas = $data->texto;
- $Documento = $data->doc;
- if(substr($data->total, -3, 1) == ',') {
- $data->total = substr_replace($data->total, '.', -3, 1);
- }
- // joga o valor total informado na var $ValordaCompra
- $ValordaCompra = $data->total;
- //desta forma se obtem o valor das parcelas desprezando os centavos
- $Parcelas = floor($ValordaCompra/$NumerodeParcelas);
- //obtendo o valor da primeira parcela
- $PrimeiraParcela = $ValordaCompra-($Parcelas*($NumerodeParcelas-1));
- echo "<br/><br/>";
- for ($y = 1; $y<=$vezes; $y++)
- {
- $x = $y;
- $x -= 1;
- // while($y <= $vezes) {
- // cria a classe standard para armazenar os resultados
- $item = new StdClass;
- $item->CON_VENCTO = TDate::date2br($binda[$x]);
- $item->CON_PARCELA = $y;
- $item->CON_DOCUMENTO = $Documento;
- // se for a primeira parcela exibe a var $PrimeiraParcela
- if($y == 1){
- $item->CON_VALOR = number_format($PrimeiraParcela,2,",",".");
- } else { // se não for a 1º parcela exibe o valor de $Parcelas
- $item->CON_VALOR = number_format($Parcelas,2,",",".");
- }
- $this->datagrid->addItem($item);
- // }
- }
- // soma as parcelas alteradas
- $totala = ($Parcelas*($NumerodeParcelas-1)) + $PrimeiraParcela;
- $cacaca = number_format($totala,2,",",".");
- //$data->texto = 'texto para o label';
- // $this->label->setValue('<br/>Dividido em '.$data->texto.' vezes de R$ '.number_format($valor,2,",",".") . '<br/>');
- $this->form->setData($data);
- // exibe as parcelas
- $this->vtotal->setValue('<br/> TOTAL: R$<b> '.number_format($totala,2,",",".").'</b>');
- // libera as variáveis da memória
- // TSession::setValue('dados',$this->datagrid);
- unset($totala);
- unset($cacaca);
- unset($valor);
- // unset($data);
- unset($date);
- unset($item);
- unset($doc);
- unset($ValordaCompra);
- }
- public function onReload()
- {
- // $this->datagrid->clear();
- }
- public function onConfirmar($param)
- {
- try
- {
- TTransaction::open('gecom'); // open a transaction
- /**
- // Enable Debug logger for SQL operations inside the transaction
- TTransaction::setLogger(new TLoggerSTD); // standard output
- TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
- **/
- $this->form->validate(); // validate form data
- $data = $this->form->getData(); // get form data as array
- // $this->form->setData($data);
- var_dump($data);
- $object = new Contas; // create an empty object
- $object->fromArray( (array) $data); // load the object with data
- $object->store(); // save the object
- // get the generated id
- $data->id = $object->id;
- $this->form->setData($data); // fill form data
- TTransaction::close(); // close the transaction
- new TMessage('info', 'Titulos Gravados.');
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- $this->form->setData( $this->form->getData() ); // keep form data
- TTransaction::rollback(); // undo all pending operations
- }
- }
- function show()
- {
- $this->onReload();
- parent::show();
- }
- }
- ?>
segue também o var_dump($data);
object(stdClass)[107]
public 'Clientes_id' => string '1350' (length=4)
public 'Historico' => string 'meu historico' (length=13)
public 'texto' => string '3' (length=1)
public 'doc' => string 'GTY' (length=3)
public 'venci' => string '23/04/2020' (length=10)
public 'total' => string '2569' (length=4)
O post de formulário no html só retorna o valor de campos. Pelo que vi não há nenhum campo em sua grid, somente labels.
Mas se os dados da grid são só pra visualização mesmo, sem possibilidade de alteração, você pode recriar os dados da parcela na função onConfirmar.
Outra opção é usar a função generateHiddenFields da datagrid. Nesse caso não dá pra usar a função getData, vai ter que pegar as informações através de $param. Tem um mestre x detalhe que trabalha dessa maneira:
https://adianti.com.br/framework_files/tutor/index.php?class=SaleForm
Nataniel Rabaioli, seguinte a sua dica com generateHiddenFields mas mesmo assim em no var_dump em param só retorna
na grid setei a configuração
..Complementando.
Não teria que colocar em setFields o datagrid, se for isso, não consegui fazer.
Não precisa colocar no setFields. Só acrescentei o generateHiddenFields e funcionou. Lembrando que deve clicar no "Simular parcelamento" antes, pois a grid precisa estar populada. O retorno foi o seguinte:
Nataniel, vc pegou este retorno na Action do botão Confirmar ,
public function onConfirmar($param)
{
....
var_dump($param)
foi aqui ?
Sim, na função onConfirmar
Obrigado pela ajuda Nataniel, mas aqui não consegui pegar esse array no retorno de jeito nenhum, só retorna mesmo a parte do setfield do formulário, poderia postar seu codigo para compração :
Nataniel obrigado pela paciência, olha só eu testei seu codigo aqui, mas aprece o seguinte
Não tenho esse método na classe TDataGird generateHiddenFields, , uso o Studio 5.5.0