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:
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:
- <?php
- /**
- * ContaPagarList Listing
- * @author Fred Az.
- */
- class ContaPagarList extends TStandardList
- {
- protected $form; // registration form
- protected $datagrid; // listing
- protected $pageNavigation;
- protected $transformCallback;
- protected $formGrid;
- /**
- * Page constructor
- */
- public function __construct()
- {
- parent::__construct();
- parent::setDatabase('sample'); // defines the database
- parent::setActiveRecord('ContaPagar'); // defines the active record
- parent::setDefaultOrder('id', 'asc'); // defines the default order
- // parent::setCriteria($criteria) // define a standard filter
- parent::addFilterField('id', '=', 'id'); // filterField, operator, formField
- parent::addFilterField('data_conta', '=', 'data_conta'); // filterField, operator, formField
- parent::addFilterField('descricao', 'like', 'descricao'); // filterField, operator, formField
- parent::addFilterField('documento', 'like', 'documento'); // filterField, operator, formField
- parent::addFilterField('data_vencimento', '=', 'data_vencimento'); // filterField, operator, formField
- parent::addFilterField('valor', '=', 'valor'); // filterField, operator, formField
- // creates the form
- $this->form = new TQuickForm('form_search_ContaPagar');
- $this->form->class = 'tform'; // change CSS class
- $this->form = new BootstrapFormWrapper($this->form);
- $this->form->style = 'display: table;width:100%'; // change style
- $this->form->setFormTitle('ContasPagar');
- // create the form fields
- $id = new TEntry('id');
- $data_conta = new TDate('data_conta');
- $descricao = new TEntry('descricao');
- $documento = new TEntry('documento');
- $data_vencimento = new TDate('data_vencimento');
- $valor = new TEntry('valor');
- // add the fields
- $this->form->addQuickField('ID', $id, '100%' );
- $this->form->addQuickField('Data Conta', $data_conta, '100%' );
- $this->form->addQuickField('Descrição', $descricao, '100%' );
- $this->form->addQuickField('Documento', $documento, '100%' );
- $this->form->addQuickField('Vencimento', $data_vencimento, '100%' );
- $this->form->addQuickField('Valor', $valor, '100%' );
- // keep the form filled during navigation with session data
- $this->form->setData( TSession::getValue('ContaPagar_filter_data') );
- // add the search form actions
- $btn = $this->form->addQuickAction(_t('Find'), new TAction(array($this, 'onSearch')), 'fa:search');
- $btn->class = 'btn btn-sm btn-primary';
- $btn = $this->form->addQuickAction(_t('New'), new TAction(array('ContaPagarForm', 'onEdit')), 'bs:plus-sign green');
- $btnBaixar = $this->form->addQuickAction('Baixar', new TAction(array($this, 'onSave')), 'fa:arrow-circle-down');
- // creates a DataGrid
- $this->datagrid = new TDataGrid;
- $this->datagrid->disableDefaultClick();
- $this->datagrid = new BootstrapDatagridWrapper($this->datagrid);
- $this->datagrid->style = 'width: 100%';
- $this->datagrid->datatable = 'true';
- // $this->datagrid->enablePopover('Popover', 'Hi <b> {name} </b>');
- // form grid
- $this->formGrid = new TForm;
- $this->formGrid->add($this->form);
- // creates the datagrid columns
- $column_check = new TDataGridColumn('checkbox', 'Selecione', 'center');
- $column_id = new TDataGridColumn('id', 'ID', 'right');
- $column_data_conta = new TDataGridColumn('data_conta', 'Data Conta', 'center');
- $column_descricao = new TDataGridColumn('descricao', 'Descrição', 'left');
- $column_documento = new TDataGridColumn('documento', 'Documento', 'left');
- $column_data_vencimento = new TDataGridColumn('data_vencimento', 'Vencimento', 'center');
- $column_valor = new TDataGridColumn('valor', 'Valor', 'right');
- // add the columns to the DataGrid
- $this->datagrid->addColumn($column_check);
- $this->datagrid->addColumn($column_id);
- $this->datagrid->addColumn($column_data_conta);
- $this->datagrid->addColumn($column_descricao);
- $this->datagrid->addColumn($column_documento);
- $this->datagrid->addColumn($column_data_vencimento);
- $this->datagrid->addColumn($column_valor);
- // creates the datagrid column actions
- $order_id = new TAction(array($this, 'onReload'));
- $order_id->setParameter('order', 'id');
- $column_id->setAction($order_id);
- $order_data_conta = new TAction(array($this, 'onReload'));
- $order_data_conta->setParameter('order', 'data_conta');
- $column_data_conta->setAction($order_data_conta);
- $order_data_vencimento = new TAction(array($this, 'onReload'));
- $order_data_vencimento->setParameter('order', 'data_vencimento');
- $column_data_vencimento->setAction($order_data_vencimento);
- $order_valor = new TAction(array($this, 'onReload'));
- $order_valor->setParameter('order', 'valor');
- $column_valor->setAction($order_valor);
- // inline editing
- /*$data_conta_edit = new TDataGridAction(array($this, 'onInlineEdit'));
- $data_conta_edit->setField('id');
- $column_data_conta->setEditAction($data_conta_edit);
- $documento_edit = new TDataGridAction(array($this, 'onInlineEdit'));
- $documento_edit->setField('id');
- $column_documento->setEditAction($documento_edit);
- $data_vencimento_edit = new TDataGridAction(array($this, 'onInlineEdit'));
- $data_vencimento_edit->setField('id');
- $column_data_vencimento->setEditAction($data_vencimento_edit);*/
- // define the transformer method over image
- $column_data_conta->setTransformer( function($value, $object, $row) {
- $date = new DateTime($value);
- return $date->format('d/m/Y');
- });
- // define the transformer method over image
- $column_data_vencimento->setTransformer( function($value, $object, $row) {
- $date = new DateTime($value);
- return $date->format('d/m/Y');
- });
- // define the transformer method over image
- $column_valor->setTransformer( function($value, $object, $row) {
- return 'R$ ' . number_format($value, 2, ',', '.');
- });
- // create EDIT action
- $action_edit = new TDataGridAction(array('ContaPagarForm', 'onEdit'));
- //$action_edit->setUseButton(TRUE);
- //$action_edit->setButtonClass('btn btn-default');
- $action_edit->setLabel(_t('Edit'));
- $action_edit->setImage('fa:pencil-square-o blue fa-lg');
- $action_edit->setField('id');
- $this->datagrid->addAction($action_edit);
- // create DELETE action
- $action_del = new TDataGridAction(array($this, 'onDelete'));
- //$action_del->setUseButton(TRUE);
- //$action_del->setButtonClass('btn btn-default');
- $action_del->setLabel(_t('Delete'));
- $action_del->setImage('fa:trash-o red fa-lg');
- $action_del->setField('id');
- $this->datagrid->addAction($action_del);
- // create the datagrid model
- $this->datagrid->createModel();
- // create the page navigation
- $this->pageNavigation = new TPageNavigation;
- $this->pageNavigation->setAction(new TAction(array($this, 'onReload')));
- $this->pageNavigation->setWidth($this->datagrid->getWidth());
- // vertical box container
- $container = new TVBox;
- $container->style = 'width: 100%';
- $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
- $container->add(TPanelGroup::pack('Contas a Pagar', $this->form));
- $container->add(TPanelGroup::pack('', $this->datagrid, $this->pageNavigation));
- parent::add($container);
- }
- function onReload($param = NULL)
- {
- try
- {
- // open a transaction with database 'samples'
- TTransaction::open('sample');
- // creates a repository for Category
- $repository = new TRepository('ContaPagar');
- // creates a criteria, ordered by id
- $criteria = new TCriteria;
- $order = isset($param['order']) ? $param['order'] : 'id';
- $criteria->setProperty('order', $order);
- // load the objects according to criteria
- $categories = $repository->load($criteria);
- $this->datagrid->clear();
- if ($categories)
- {
- $count = 1;
- // iterate the collection of active records
- foreach ($categories as $item)
- {
- $nameCheck = $count++;
- $item->checkbox = new TCheckButton('checkbox'.$nameCheck);
- $item->checkbox->setIndexValue($item->id);
- $this->datagrid->addItem($item);
- $this->form->addField($item->checkbox);
- }
- }
- // close the transaction
- TTransaction::close();
- $this->loaded = true;
- }
- catch (Exception $e) // in case of exception
- {
- // shows the exception error message
- new TMessage('error', $e->getMessage());
- // undo all pending operations
- TTransaction::rollback();
- }
- }
- public function onSave($param)
- {
- $data = $this->form->getData(); // optional parameter: active record class
- // put the data back to the form
- $this->form->setData($data);
- // creates a string with the form element's values
- $message = 'Escolhido : ' . $data->checkbox . '<br>';
- // show the message
- new TMessage('info', $message);
- }
- /**
- * shows the page
- */
- function show()
- {
- $this->onReload();
- parent::show();
- }
- }
- ?>
Você está criando os checks com o nome "checkbox" + contador, ficando "checkbox1", "checkbox2", "checkbox3":
E na função onSave está tentando recuperar o valor do campo "checkbox", que não foi criado:
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
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?
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
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?
Aqui o código completo:
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:
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?
Ainda o $field->getValue() continua vindo vazio! :(
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:
Nataniel, funcionou 100%, muitíssimo obrigado. Isso prova que sinto dificuldades ainda no entendimento do conceito do framework. Mais uma vez obrigado.
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.