Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Datagrid com campos de formulario - salvando no banco Olá pessoal Ao verificar o exemplo abaixo no tutor do Pablo, não estava salvando no banco de dados, como estava precisando usar este exemplo implementei estou compartilhando o código caso alguém precise implementar. http://www.adianti.com.br/framework_files/tutor/index.php?class=DatagridInputView Código fonte - completo. www.pastebin.com/vHG0pHTg...
Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (7)


FM

O exemplo do Pablo era apenas didático para apresentação da edição inLine. Nem abre transação como o banco dados. Mas valeu por compartilhar, servirá muito para quem está começando com esse maravilhoso framework.
BI

Ficou bom!
eu fiz um código parecido, porem não funciona com os campos de filtro, na hora de filtrar os dados acusa duplicidade dos elementos na datagrid... será que este funciona corretamente nessa situação?
JM

Olá Betuel Inacio
Sim funciona, corrigi este problema no código, vc pode usar ele como exemplo para o que vc quer fazer.
GE

Oi Jackson.

Consegui implentar o seu script, entretanto para ele funcionar, a datagrid deve estar em uma tela separada.

Eu estou tentando usar em um form deste tipo:
www.adianti.com.br/framework_files/tutor/index.php?class=CompleteFor
com uma coluna extra que possa ser editada um campo TCombo.

Eu tenho a impressão que ele se perde nos índices.
Já usou algo parecido?
BI

Olá galera, fiz funcionar também... é só tirar o método 'onSearch()' ele armazena os dados em sessão e na hora de filtrar da conflito, ai só retirei ele e linkei o botão de pesquisa direto com o 'onReload()' ai é só adaptar o criterio.
JM

Olá Gustavo

Fico feliz por ter ajudado, isso fiz este datagrid em uma tela apenas como ele, fiz uma tela anterior que o usuario escolhe o filtro depois e direcionado para esta tela do datagrid.

Para n se perder nos indices criei uma variavel temporaria para add os indices logo em seguida armazeno em um vetor que jogo na sessão para pegar seu valor no metodo onSave.

Betuel pode ser utilizado assim tbm como vc falou no meu caso achei mais legal deixar os 2 metodos o onReload apenas para carregar o datagrid quando chamar a tela e o onSearch para a busca, da certo tbm.

Vlw pessoal!
FA

Bom dia,

Analisei diversas vezes o código original pois precisava que vários campos fossem atualizados. A forma apresentada no exemplo do Pablo funciona excepcionalmente bem mas notei que fazia várias interações com o BD o que seria um atraso. Resolvi esse problema trabalhando com array. Abaixo segue meu código.

  1. <?php
  2. /**
  3.  * servicoUpdateValores
  4.  *
  5.  * @version    1.0
  6.  * @author     Fernando de Pinho Araújo
  7.  */
  8. class servicoUpdateValores extends TStandardList
  9. {
  10.     protected $form;     // registration form
  11.     protected $datagrid// listing
  12.     protected $pageNavigation;
  13.     protected $formgrid;
  14.     protected $saveButton;
  15.     
  16.     /**
  17.      * Page constructor
  18.      */
  19.     public function __construct()
  20.     {
  21.         parent::__construct();
  22.         
  23.         parent::setDatabase('sicad');
  24.         parent::setActiveRecord('servico');
  25.         parent::setDefaultOrder('id''asc');
  26.         // add the filter (filter field, operator, form field)
  27.         parent::addFilterField('codigo''like''codigo');
  28.         parent::addFilterField('nome''like''nome');
  29.         
  30.         // creates the form
  31.         $this->form = new TQuickForm('form_search_Product');
  32.         $this->form->class='tform';
  33.         $this->form->style 'display: table;width:100%'// change style
  34.         $this->form->setFormTitle('Atualização de Valores');
  35.         
  36.         // create the form fields
  37.         $codigo = new TEntry('codigo');
  38.         $codigo->setTip('Filtragem pelo Código do Serviço na SEFAZ...');
  39.         $this->form->addQuickField('Código SEFAZ'$codigo,  '120' );
  40.         $nome = new TEntry('nome');
  41.         $nome->setTip('Filtragem pela descrição do Serviço');
  42.         $this->form->addQuickField('Descrição do Serviço'$nome,  '400' );        
  43.         $this->form->addQuickAction(_t('Find'), new TAction(array($this'onSearch')), 'fa:search');
  44.         // keep the form filled with session data
  45.         $this->form->setDataTSession::getValue('codigo_filter_data') );
  46.         
  47.         // creates the datagrid
  48.         $this->datagrid = new TDataGrid;
  49.         $this->datagrid->style 'width: 100%';
  50.         
  51.         // create the datagrid columns
  52.         $column_id           = new TDataGridColumn('id''Id''left');
  53.         $column_codigo       = new TDataGridColumn('codigo''Código''left');
  54.         $column_nome         = new TDataGridColumn('nome''Descrição do Serviço''center');
  55.         $column_oculto       = new TDataGridColumn('oculto_widget''Oculto?''right');
  56.         $column_valor_base   = new TDataGridColumn('valor_base_widget''Valor Base''right');
  57.         $column_valor_km     = new TDataGridColumn('valor_km_widget''Valor KM''right');
  58.         $column_valor_pm     = new TDataGridColumn('valor_pm_widget''Valor PM''right');
  59.         $column_valor_diaria = new TDataGridColumn('valor_diaria_widget''Valor Diária/Hora''right');
  60.         $this->datagrid->addColumn($column_id);
  61.         $this->datagrid->addColumn($column_codigo);
  62.         $this->datagrid->addColumn($column_nome);
  63.         $this->datagrid->addColumn($column_oculto);
  64.         $this->datagrid->addColumn($column_valor_base);
  65.         $this->datagrid->addColumn($column_valor_km);
  66.         $this->datagrid->addColumn($column_valor_pm);
  67.         $this->datagrid->addColumn($column_valor_diaria);
  68.         // create the datagrid model
  69.         $this->datagrid->createModel();
  70.         
  71.         // creates the pagination
  72.         $this->pageNavigation = new TPageNavigation;
  73.         $this->pageNavigation->setAction(new TAction(array($this'onReload')));
  74.         $this->pageNavigation->setWidth($this->datagrid->getWidth());
  75.         
  76.         $this->datagrid->disableDefaultClick();
  77.         
  78.         // put datagrid inside a form
  79.         $this->formgrid = new TForm;
  80.         $this->formgrid->add($this->datagrid);
  81.         
  82.         // creates the update collection button
  83.         $this->saveButton = new TButton('update_collection');
  84.         $this->saveButton->setAction(new TAction(array($this'onSaveCollection')), 'Save');
  85.         $this->saveButton->setImage('fa:save green');
  86.         $this->formgrid->addField($this->saveButton);
  87.         
  88.         $gridpack = new TVBox;
  89.         $gridpack->style 'width: 100%';
  90.         $gridpack->add($this->formgrid);
  91.         $gridpack->add($this->saveButton)->style 'background:whiteSmoke;border:1px solid #cccccc; padding: 3px;padding: 5px;';
  92.         
  93.         // define the datagrid transformer method
  94.         parent::setTransformer(array($this'onBeforeLoad'));
  95.         
  96.         // vertical box container
  97.         $container = new TVBox;
  98.         $container->add(new TXMLBreadCrumb('menu.xml'__CLASS__));
  99.         $container->add($this->form);
  100.         $container->add($gridpack);
  101.         $container->add($this->pageNavigation);
  102.         
  103.         parent::add($container);
  104.     }
  105.     
  106.     /**
  107.      * Run before the datagrid is loaded
  108.      */
  109.     public function onBeforeLoad($objects$param)
  110.     {
  111.         // update the action parameters to pass the current page to action
  112.         // without this, the action will only work for the first page
  113.         $saveAction $this->saveButton->getAction();
  114.         $saveAction->setParameters($param); // important!
  115.         
  116.         $gridfields = array( $this->saveButton );
  117.         $itemStatus= array();
  118.         $itemStatus['t'] = 'Sim';
  119.         $itemStatus['f'] = 'Não';
  120.         foreach ($objects as $object)
  121.         {
  122.             $object->valor_base_widget = new TEntry('valor_base' '-' $object->id);
  123.             $object->valor_base_widget->setValue$object->valor_base );
  124.             $object->valor_base_widget->setNumericMask(2,'.','');
  125.             $object->valor_base_widget->setSize(120);
  126.             $object->valor_base_widget->setTip('Valor Base se refere a uma taxa de preço fixo ou quando o serviço já tem um valor inicial...');
  127.             $gridfields[] = $object->valor_base_widget// important
  128.             $object->valor_km_widget = new TEntry('valor_km' '-' $object->id);
  129.             $object->valor_km_widget->setValue$object->valor_km );
  130.             $object->valor_km_widget->setNumericMask(2,'.','');
  131.             $object->valor_km_widget->setSize(120);
  132.             $object->valor_km_widget->setTip('Referente ao custo de deslocamento por Quilometro...');
  133.             $gridfields[] = $object->valor_km_widget// important
  134.             
  135.             $object->valor_pm_widget = new TEntry('valor_pm' '-' $object->id);
  136.             $object->valor_pm_widget->setValue$object->valor_pm );
  137.             $object->valor_pm_widget->setNumericMask(2,'.','');
  138.             $object->valor_pm_widget->setSize(120);
  139.             $object->valor_pm_widget->setTip('Referente ao custo por PM no serviço...');
  140.             $gridfields[] = $object->valor_pm_widget// important
  141.             
  142.             $object->valor_diaria_widget = new TEntry('valor_diaria' '-' $object->id);
  143.             $object->valor_diaria_widget->setValue$object->valor_diaria );
  144.             $object->valor_diaria_widget->setNumericMask(2,'.','');
  145.             $object->valor_diaria_widget->setSize(120);
  146.             $object->valor_base_widget->setTip('Referente a taxas cobradas por dia ou hora, ou ainda, Valor de prestação de serviço por dia/hora...');
  147.             $gridfields[] = $object->valor_diaria_widget// important
  148.             
  149.             $object->oculto_widget = new TCombo('oculto' '-' $object->id);
  150.             $object->oculto_widget->addItems($itemStatus);
  151.             $valor = ($object->oculto) ? 't' 'f';
  152.             $object->oculto_widget->setValue$valor);
  153.             $object->oculto_widget->setSize(50);
  154.             $object->oculto_widget->setTip('Opção que some com o serviço dos demais formulários...');
  155.             $gridfields[] = $object->oculto_widget// important
  156.             
  157.         }
  158.         
  159.         $this->formgrid->setFields($gridfields);
  160.     }
  161.     
  162.     /**
  163.      * Save the datagrid objects
  164.      */
  165.     public function onSaveCollection()
  166.     {
  167.         $data $this->formgrid->getData(); // get datagrid form data
  168.         $this->formgrid->setData($data); // keep the form filled
  169.         
  170.         try
  171.         {
  172.             // open transaction
  173.             TTransaction::open('sicad');
  174.             
  175.             // iterate datagrid form objects
  176.             $objects = array();
  177.             foreach ($this->formgrid->getFields() as $name => $field)
  178.             {
  179.                 if ($field instanceof TEntry)
  180.                 {
  181.                     $parts explode('-'$name);
  182.                     $id end($parts);
  183.                     switch ($parts[0])
  184.                     {
  185.                         case 'valor_base':
  186.                             $objects[$id]['valor_base'] = str_replace(','''$field->getValue());
  187.                             break;
  188.                         case 'valor_km':
  189.                             $objects[$id]['valor_km'] = str_replace(','''$field->getValue());
  190.                             break;
  191.                         case 'valor_pm':
  192.                             $objects[$id]['valor_pm'] = str_replace(','''$field->getValue());
  193.                             break;
  194.                         case 'valor_diaria':
  195.                             $objects[$id]['valor_diaria'] = str_replace(','''$field->getValue());
  196.                             break;
  197.                         case 'oculto':
  198.                             $objects[$id]['oculto'] = ($field->getValue()) ? 't' 'f';
  199.                             break;
  200.                     }
  201.                 }
  202.             }
  203.             foreach ($objects as $key=> $object)
  204.             {
  205.                 $dado servico::find($key);
  206.                 if ($dado)
  207.                 {
  208.                     $dado->fromArray( (array) $object);
  209.                     $dado->store();
  210.                 }
  211.             }
  212.             
  213.             new TMessage('info'AdiantiCoreTranslator::translate('Records updated'));
  214.             
  215.             // close transaction
  216.             TTransaction::close();
  217.         }
  218.         catch (Exception $e)
  219.         {
  220.             // show the exception message
  221.             new TMessage('error'$e->getMessage());
  222.         }
  223.     }
  224. }
  225. ?>