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


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 (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.             
  14.                 if ($field->getValue() == $id)
  15.                 {
  16.                     echo $selecionados[] = $id;
  17.                 }
  18.             }
  19.         }
  20.     }
  21. ?>


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