Dinamic Datagrids with Checkbutton (Not static) Pessoal, estou tentando usar chackbox em uma table list. Para recuperar o valor id de cada listagem. Seguindo o exemplo do Tutor eu consegui adicionar os checkbox de forma dinâmica, visto que o do Tutor é estático. Segue o link do Tutor: http://www.adianti.com.br/framework_files/tutor/index.php?class=DatagridCheckView Ocorre que não consigo de forma alguma obter o valor do checkbox. E...
FA
Dinamic Datagrids with Checkbutton (Not static)  
Pessoal, estou tentando usar chackbox em uma table list. Para recuperar o valor id de cada listagem.

Seguindo o exemplo do Tutor eu consegui adicionar os checkbox de forma dinâmica, visto que o do Tutor é estático.

Segue o link do Tutor: www.adianti.com.br/framework_files/tutor/index.php?class=DatagridChe

Ocorre que não consigo de forma alguma obter o valor do checkbox. Estou colocando abaixo o código em questão:

 
  1. <?php
  2. /**
  3. * ContaPagarList Listing
  4. * @author Fred Az.
  5. */
  6. class ContaPagarList extends TStandardList
  7. {
  8. protected $form; // registration form
  9. protected $datagrid; // listing
  10. protected $pageNavigation;
  11. protected $transformCallback;
  12. protected $formGrid;
  13. /**
  14. * Page constructor
  15. */
  16. public function __construct()
  17. {
  18. parent::__construct();
  19. parent::setDatabase('sample'); // defines the database
  20. parent::setActiveRecord('ContaPagar'); // defines the active record
  21. parent::setDefaultOrder('id', 'asc'); // defines the default order
  22. // parent::setCriteria($criteria) // define a standard filter
  23. parent::addFilterField('id', '=', 'id'); // filterField, operator, formField
  24. parent::addFilterField('data_conta', '=', 'data_conta'); // filterField, operator, formField
  25. parent::addFilterField('descricao', 'like', 'descricao'); // filterField, operator, formField
  26. parent::addFilterField('documento', 'like', 'documento'); // filterField, operator, formField
  27. parent::addFilterField('data_vencimento', '=', 'data_vencimento'); // filterField, operator, formField
  28. parent::addFilterField('valor', '=', 'valor'); // filterField, operator, formField
  29. // creates the form
  30. $this->form = new TQuickForm('form_search_ContaPagar');
  31. $this->form->class = 'tform'; // change CSS class
  32. $this->form = new BootstrapFormWrapper($this->form);
  33. $this->form->style = 'display: table;width:100%'; // change style
  34. $this->form->setFormTitle('ContasPagar');
  35. // create the form fields
  36. $id = new TEntry('id');
  37. $data_conta = new TDate('data_conta');
  38. $descricao = new TEntry('descricao');
  39. $documento = new TEntry('documento');
  40. $data_vencimento = new TDate('data_vencimento');
  41. $valor = new TEntry('valor');
  42. // add the fields
  43. $this->form->addQuickField('ID', $id, '100%' );
  44. $this->form->addQuickField('Data Conta', $data_conta, '100%' );
  45. $this->form->addQuickField('Descrição', $descricao, '100%' );
  46. $this->form->addQuickField('Documento', $documento, '100%' );
  47. $this->form->addQuickField('Vencimento', $data_vencimento, '100%' );
  48. $this->form->addQuickField('Valor', $valor, '100%' );
  49. // keep the form filled during navigation with session data
  50. $this->form->setData( TSession::getValue('ContaPagar_filter_data') );
  51. // add the search form actions
  52. $btn = $this->form->addQuickAction(_t('Find'), new TAction(array($this, 'onSearch')), 'fa:search');
  53. $btn->class = 'btn btn-sm btn-primary';
  54. $btn = $this->form->addQuickAction(_t('New'), new TAction(array('ContaPagarForm', 'onEdit')), 'bs:plus-sign green');
  55. $btnBaixar = $this->form->addQuickAction('Baixar', new TAction(array($this, 'onSave')), 'fa:arrow-circle-down');
  56. // creates a DataGrid
  57. $this->datagrid = new TDataGrid;
  58. $this->datagrid->disableDefaultClick();
  59. $this->datagrid = new BootstrapDatagridWrapper($this->datagrid);
  60. $this->datagrid->style = 'width: 100%';
  61. $this->datagrid->datatable = 'true';
  62. // $this->datagrid->enablePopover('Popover', 'Hi <b> {name} </b>');
  63. // form grid
  64. $this->formGrid = new TForm;
  65. $this->formGrid->add($this->form);
  66. // creates the datagrid columns
  67. $column_check = new TDataGridColumn('checkbox', 'Selecione', 'center');
  68. $column_id = new TDataGridColumn('id', 'ID', 'right');
  69. $column_data_conta = new TDataGridColumn('data_conta', 'Data Conta', 'center');
  70. $column_descricao = new TDataGridColumn('descricao', 'Descrição', 'left');
  71. $column_documento = new TDataGridColumn('documento', 'Documento', 'left');
  72. $column_data_vencimento = new TDataGridColumn('data_vencimento', 'Vencimento', 'center');
  73. $column_valor = new TDataGridColumn('valor', 'Valor', 'right');
  74. // add the columns to the DataGrid
  75. $this->datagrid->addColumn($column_check);
  76. $this->datagrid->addColumn($column_id);
  77. $this->datagrid->addColumn($column_data_conta);
  78. $this->datagrid->addColumn($column_descricao);
  79. $this->datagrid->addColumn($column_documento);
  80. $this->datagrid->addColumn($column_data_vencimento);
  81. $this->datagrid->addColumn($column_valor);
  82. // creates the datagrid column actions
  83. $order_id = new TAction(array($this, 'onReload'));
  84. $order_id->setParameter('order', 'id');
  85. $column_id->setAction($order_id);
  86. $order_data_conta = new TAction(array($this, 'onReload'));
  87. $order_data_conta->setParameter('order', 'data_conta');
  88. $column_data_conta->setAction($order_data_conta);
  89. $order_data_vencimento = new TAction(array($this, 'onReload'));
  90. $order_data_vencimento->setParameter('order', 'data_vencimento');
  91. $column_data_vencimento->setAction($order_data_vencimento);
  92. $order_valor = new TAction(array($this, 'onReload'));
  93. $order_valor->setParameter('order', 'valor');
  94. $column_valor->setAction($order_valor);
  95. // inline editing
  96. /*$data_conta_edit = new TDataGridAction(array($this, 'onInlineEdit'));
  97. $data_conta_edit->setField('id');
  98. $column_data_conta->setEditAction($data_conta_edit);
  99. $documento_edit = new TDataGridAction(array($this, 'onInlineEdit'));
  100. $documento_edit->setField('id');
  101. $column_documento->setEditAction($documento_edit);
  102. $data_vencimento_edit = new TDataGridAction(array($this, 'onInlineEdit'));
  103. $data_vencimento_edit->setField('id');
  104. $column_data_vencimento->setEditAction($data_vencimento_edit);*/
  105. // define the transformer method over image
  106. $column_data_conta->setTransformer( function($value, $object, $row) {
  107. $date = new DateTime($value);
  108. return $date->format('d/m/Y');
  109. });
  110. // define the transformer method over image
  111. $column_data_vencimento->setTransformer( function($value, $object, $row) {
  112. $date = new DateTime($value);
  113. return $date->format('d/m/Y');
  114. });
  115. // define the transformer method over image
  116. $column_valor->setTransformer( function($value, $object, $row) {
  117. return 'R$ ' . number_format($value, 2, ',', '.');
  118. });
  119. // create EDIT action
  120. $action_edit = new TDataGridAction(array('ContaPagarForm', 'onEdit'));
  121. //$action_edit->setUseButton(TRUE);
  122. //$action_edit->setButtonClass('btn btn-default');
  123. $action_edit->setLabel(_t('Edit'));
  124. $action_edit->setImage('fa:pencil-square-o blue fa-lg');
  125. $action_edit->setField('id');
  126. $this->datagrid->addAction($action_edit);
  127. // create DELETE action
  128. $action_del = new TDataGridAction(array($this, 'onDelete'));
  129. //$action_del->setUseButton(TRUE);
  130. //$action_del->setButtonClass('btn btn-default');
  131. $action_del->setLabel(_t('Delete'));
  132. $action_del->setImage('fa:trash-o red fa-lg');
  133. $action_del->setField('id');
  134. $this->datagrid->addAction($action_del);
  135. // create the datagrid model
  136. $this->datagrid->createModel();
  137. // create the page navigation
  138. $this->pageNavigation = new TPageNavigation;
  139. $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
  140. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  141. // vertical box container
  142. $container = new TVBox;
  143. $container->style = 'width: 100%';
  144. $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  145. $container->add(TPanelGroup::pack('Contas a Pagar', $this->form));
  146. $container->add(TPanelGroup::pack('', $this->datagrid, $this->pageNavigation));
  147. parent::add($container);
  148. }
  149. function onReload($param = NULL)
  150. {
  151. try
  152. {
  153. // open a transaction with database 'samples'
  154. TTransaction::open('sample');
  155. // creates a repository for Category
  156. $repository = new TRepository('ContaPagar');
  157. // creates a criteria, ordered by id
  158. $criteria = new TCriteria;
  159. $order = isset($param['order']) ? $param['order'] : 'id';
  160. $criteria->setProperty('order', $order);
  161. // load the objects according to criteria
  162. $categories = $repository->load($criteria);
  163. $this->datagrid->clear();
  164. if ($categories)
  165. {
  166. $count = 1;
  167. // iterate the collection of active records
  168. foreach ($categories as $item)
  169. {
  170. $nameCheck = $count++;
  171. $item->checkbox = new TCheckButton('checkbox'.$nameCheck);
  172. $item->checkbox->setIndexValue($item->id);
  173. $this->datagrid->addItem($item);
  174. $this->form->addField($item->checkbox);
  175. }
  176. }
  177. // close the transaction
  178. TTransaction::close();
  179. $this->loaded = true;
  180. }
  181. catch (Exception $e) // in case of exception
  182. {
  183. // shows the exception error message
  184. new TMessage('error', $e->getMessage());
  185. // undo all pending operations
  186. TTransaction::rollback();
  187. }
  188. }
  189. public function onSave($param)
  190. {
  191. $data = $this->form->getData(); // optional parameter: active record class
  192. // put the data back to the form
  193. $this->form->setData($data);
  194. // creates a string with the form element's values
  195. $message = 'Escolhido : ' . $data->checkbox . '<br>';
  196. // show the message
  197. new TMessage('info', $message);
  198. }
  199. /**
  200. * shows the page
  201. */
  202. function show()
  203. {
  204. $this->onReload();
  205. parent::show();
  206. }
  207. }
  208. ?>


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


NR

Você está criando os checks com o nome "checkbox" + contador, ficando "checkbox1", "checkbox2", "checkbox3":
 
  1. <?php
  2. $item->checkbox = new TCheckButton('checkbox'.$nameCheck);
  3. ?>

E na função onSave está tentando recuperar o valor do campo "checkbox", que não foi criado:
 
  1. <?php
  2. $message = 'Escolhido : ' . $data->checkbox . '<br>';
  3. ?>

Os nomes acessados na onSave devem ser os mesmos da criação dos componente, como mostra o exemplo abaixo:
adianti.com.br/framework_files/tutor/index.php?class=DatagridCheckVi
FA

Obrigado pelo Retorno Nataniel, mas nesse caso como vou fazer no onSave pra que ele consiga "enxergar" o que foi marcado nos chackboxs pra poder trazer os seus valores respectivos ?

No exemplo, fica fácil de compreender por ser estático, mas como faria isso no onSave de forma dinâmica? Você já fez algo do tipo?
NR

Você pode trazer todos os campos do form e filtrar por nome, por exemplo. Algo bem parecido ao exemplo abaixo:
adianti.com.br/framework_files/tutor/index.php?class=ProductUpdateLi
FA

Nataniel se perceber a forma que estou montando a list é na mesma lógica do seu exemplo.
Eu andei estudando mais o tutor e vi esse exemplo que ajudou bastante:

www.adianti.com.br/framework_files/tutor/index.php?class=MultiCheckV

Abaixo eu deixei o código mais limpo. Estou conseguindo percorrer os valores de cada registro (suas ids) porém não estou conseguindo recuperar o que foi selecionado no chackbox, a função responsável por essa ação é o getValue(), porém ela não esta funcionando no código abaixo.

O $field->getValue() esta indo como vazio, não entendo porque isso, poderia me ajudar nesse quesito?

 
  1. <?php
  2. public function onSave($param)
  3. {
  4. $data = $this->form->getData();
  5. $this->form->setData($data);
  6. $selecionados = [];
  7. foreach ($this->form->getFields() as $value => $field)
  8. {
  9. if ($field instanceof TCheckButton)
  10. {
  11. $parts = explode('checkbox', $value);
  12. $id = $parts[1];
  13. if ($field->getValue() == $id)
  14. {
  15. echo $selecionados[] = $id;
  16. }
  17. }
  18. }
  19. }
  20. ?>


Aqui o código completo:

 
  1. <?php
  2. /**
  3. * ContaPagarList Listing
  4. * @author Fred Az.
  5. */
  6. class ContaPagarList extends TStandardList
  7. {
  8. protected $form; // registration form
  9. protected $datagrid; // listing
  10. protected $pageNavigation;
  11. protected $transformCallback;
  12. protected $formGrid;
  13. /**
  14. * Page constructor
  15. */
  16. public function __construct()
  17. {
  18. parent::__construct();
  19. parent::setDatabase('sample'); // defines the database
  20. parent::setActiveRecord('ContaPagar'); // defines the active record
  21. parent::setDefaultOrder('id', 'asc'); // defines the default order
  22. // creates the form
  23. $this->form = new TQuickForm('form_search_ContaPagar');
  24. $this->form->class = 'tform'; // change CSS class
  25. $this->form = new BootstrapFormWrapper($this->form);
  26. $this->form->style = 'display: table;width:100%'; // change style
  27. $this->form->setFormTitle('ContasPagar');
  28. // add the search form actions
  29. $btn = $this->form->addQuickAction(_t('Find'), new TAction(array($this, 'onSearch')), 'fa:search');
  30. $btn->class = 'btn btn-sm btn-primary';
  31. $btn = $this->form->addQuickAction(_t('New'), new TAction(array('ContaPagarForm', 'onEdit')), 'bs:plus-sign green');
  32. $btnBaixar = $this->form->addQuickAction('Baixar', new TAction(array($this, 'onSave')), 'fa:arrow-circle-down');
  33. // creates a DataGrid
  34. $this->datagrid = new TDataGrid;
  35. $this->datagrid->disableDefaultClick();
  36. $this->datagrid = new BootstrapDatagridWrapper($this->datagrid);
  37. $this->datagrid->style = 'width: 100%';
  38. $this->datagrid->datatable = 'true';
  39. // $this->datagrid->enablePopover('Popover', 'Hi <b> {name} </b>');
  40. // form grid
  41. $this->formGrid = new TForm;
  42. $this->formGrid->add($this->form);
  43. // creates the datagrid columns
  44. $column_check = new TDataGridColumn('checkbox', 'Selecione', 'center');
  45. $column_id = new TDataGridColumn('id', 'ID', 'right');
  46. $column_data_conta = new TDataGridColumn('data_conta', 'Data Conta', 'center');
  47. $column_descricao = new TDataGridColumn('descricao', 'Descrição', 'left');
  48. $column_documento = new TDataGridColumn('documento', 'Documento', 'left');
  49. $column_data_vencimento = new TDataGridColumn('data_vencimento', 'Vencimento', 'center');
  50. $column_valor = new TDataGridColumn('valor', 'Valor', 'right');
  51. // add the columns to the DataGrid
  52. $this->datagrid->addColumn($column_check);
  53. $this->datagrid->addColumn($column_id);
  54. $this->datagrid->addColumn($column_data_conta);
  55. $this->datagrid->addColumn($column_descricao);
  56. $this->datagrid->addColumn($column_documento);
  57. $this->datagrid->addColumn($column_data_vencimento);
  58. $this->datagrid->addColumn($column_valor);
  59. // creates the datagrid column actions
  60. $order_id = new TAction(array($this, 'onReload'));
  61. $order_id->setParameter('order', 'id');
  62. $column_id->setAction($order_id);
  63. $order_data_conta = new TAction(array($this, 'onReload'));
  64. $order_data_conta->setParameter('order', 'data_conta');
  65. $column_data_conta->setAction($order_data_conta);
  66. $order_data_vencimento = new TAction(array($this, 'onReload'));
  67. $order_data_vencimento->setParameter('order', 'data_vencimento');
  68. $column_data_vencimento->setAction($order_data_vencimento);
  69. $order_valor = new TAction(array($this, 'onReload'));
  70. $order_valor->setParameter('order', 'valor');
  71. $column_valor->setAction($order_valor);
  72. // define the transformer method over image
  73. $column_data_conta->setTransformer( function($value, $object, $row) {
  74. $date = new DateTime($value);
  75. return $date->format('d/m/Y');
  76. });
  77. // define the transformer method over image
  78. $column_data_vencimento->setTransformer( function($value, $object, $row) {
  79. $date = new DateTime($value);
  80. return $date->format('d/m/Y');
  81. });
  82. // define the transformer method over image
  83. $column_valor->setTransformer( function($value, $object, $row) {
  84. return 'R$ ' . number_format($value, 2, ',', '.');
  85. });
  86. // create EDIT action
  87. $action_edit = new TDataGridAction(array('ContaPagarForm', 'onEdit'));
  88. //$action_edit->setUseButton(TRUE);
  89. //$action_edit->setButtonClass('btn btn-default');
  90. $action_edit->setLabel(_t('Edit'));
  91. $action_edit->setImage('fa:pencil-square-o blue fa-lg');
  92. $action_edit->setField('id');
  93. $this->datagrid->addAction($action_edit);
  94. // create DELETE action
  95. $action_del = new TDataGridAction(array($this, 'onDelete'));
  96. //$action_del->setUseButton(TRUE);
  97. //$action_del->setButtonClass('btn btn-default');
  98. $action_del->setLabel(_t('Delete'));
  99. $action_del->setImage('fa:trash-o red fa-lg');
  100. $action_del->setField('id');
  101. $this->datagrid->addAction($action_del);
  102. // create the datagrid model
  103. $this->datagrid->createModel();
  104. // create the page navigation
  105. $this->pageNavigation = new TPageNavigation;
  106. $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
  107. $this->pageNavigation->setWidth($this->datagrid->getWidth());
  108. // vertical box container
  109. $container = new TVBox;
  110. $container->style = 'width: 100%';
  111. $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  112. $container->add(TPanelGroup::pack('Contas a Pagar', $this->form));
  113. $container->add(TPanelGroup::pack('', $this->datagrid, $this->pageNavigation));
  114. parent::add($container);
  115. }
  116. function onReload($param = NULL)
  117. {
  118. try
  119. {
  120. // open a transaction with database 'samples'
  121. TTransaction::open('sample');
  122. // creates a repository for Category
  123. $repository = new TRepository('ContaPagar');
  124. // creates a criteria, ordered by id
  125. $criteria = new TCriteria;
  126. $order = isset($param['order']) ? $param['order'] : 'id';
  127. $criteria->setProperty('order', $order);
  128. // load the objects according to criteria
  129. $categories = $repository->load($criteria);
  130. $this->datagrid->clear();
  131. if ($categories)
  132. {
  133. // iterate the collection of active records
  134. foreach ($categories as $item)
  135. {
  136. $item->checkbox = new TCheckButton('checkbox'.$item->id);
  137. $item->checkbox->setIndexValue($item->id);
  138. $this->datagrid->addItem($item);
  139. $this->form->addField($item->checkbox);
  140. }
  141. }
  142. // close the transaction
  143. TTransaction::close();
  144. $this->loaded = true;
  145. }
  146. catch (Exception $e) // in case of exception
  147. {
  148. // shows the exception error message
  149. new TMessage('error', $e->getMessage());
  150. // undo all pending operations
  151. TTransaction::rollback();
  152. }
  153. }
  154. public function onSave($param)
  155. {
  156. $data = $this->form->getData();
  157. $this->form->setData($data);
  158. $selecionados = [];
  159. foreach ($this->form->getFields() as $value => $field)
  160. {
  161. if ($field instanceof TCheckButton)
  162. {
  163. $parts = explode('checkbox', $value);
  164. $id = $parts[1];
  165. if ($field->getValue() == $id)
  166. {
  167. echo $selecionados[] = $id;
  168. }
  169. }
  170. }
  171. }
  172. /**
  173. * shows the page
  174. */
  175. function show()
  176. {
  177. $this->onReload();
  178. parent::show();
  179. }
  180. }
  181. ?>
NR

Acho que tem um detalhe na criação dos containers, sua grid deve ser filha de uma classe de formulário(deve estar dentro de uma tag form no inspecionar), só assim os dados serão enviados no post. Você até criou uma variável $this->formGrid instanciando um formulário, mas adicionou o próprio formulário ao invés de adicionar a grid.

Além disso, após criar esse formulário para a grid, você precisa informar que o botão "Baixar" deve enviar as informações desse formulário e não do outro:
 
  1. <?php
  2. $this->formGrid->addField($btnBaixar);
  3. ?>
FA

Mais uma vez obrigado pelo retorno Nataniel, eu fiz os testes como comentou, no quesito de instanciar o próprio formulário a Grid, isso de fato esta sendo um erro de conceito meu sobre o Framework, pelo que entendi o correto seria isso?

 
  1. <?php
  2. $this->formGrid = new TForm;
  3. $this->formGrid->add($this->datagrid);
  4. $this->formGrid->addField($btnBaixar);
  5. ?>


Ainda o $field->getValue() continua vindo vazio! :(
NR

Você criou o $this->formGrid, mas está adicionando ao container principal da tela? No código que passou você estava adicionando somente a grid, desconsiderando o form:
 
  1. <?php
  2. //$container->add(TPanelGroup::pack('', $this->datagrid, $this->pageNavigation));
  3. $container->add(TPanelGroup::pack('', $this->formGrid, $this->pageNavigation));
  4. ?>
FA

Nataniel, funcionou 100%, muitíssimo obrigado. Isso prova que sinto dificuldades ainda no entendimento do conceito do framework. Mais uma vez obrigado.
EB

Nataniel, boa tarde.
Estou com o seguinte problema:
- Criei uma página como o exemplo - adianti.com.br/framework_files/tutor/index.php?class=ProductUpdateLi

Mas, quando edito os registros da página 1 e mudo para 2, tudo que eu editei na pagina anterior ficam zerados e assim acontece com todas a páginas, fica salvo apenas a paginação ativa.
Quando clico em salvar só salva os dados da página atual.

Sabe dizer como faço para editar todos os registros de todas as páginas e só no final clicar em salvar e salvar todos os itens?

Obrigado e grande abraço.