HT
TCheckButton com DataGrid
Fechado
Boa Tarde,
estou tentando implementar um Datagrid com Checkbuton, mais estou com uma grande dificuldade em alguns fases.
Para marcar todos estou tendo que jogar um valor na sessão e assim fazendo nova busca no banco setando o valor do checkbutom para true. Ate ae tudo bem, foi a maneira que achei, mais o problema maior esta para salvar os dados.
Explicando melhor:
Tenho um datagrid onde mostro uma serie de notas fiscais (Tabela: id, romaneio, nota, status), neste datagrid, acrescento os checkbuton. Quando for marcado algum checkbuton e clicado no botão salvar do form, quero que os marcados seja atualizado o campo status no banco de dados. Como os checkbuton são criados com o nome check concatenado com o id dos dados do banco(check1, check4 e etc), como vou salvar ou ao menos identificar esse parâmetro para poder fazer alguma ação, ate mesmo impedir que se todos estiver desmarcado e tentar salvar, dê uma mensagem de alerta. Outra questão seria como adicionar ação ao checkbuton ao marcar ou desmarcar algum da lista. Sei que são vários questionamento, mais agradeço demais quem puder ajudar. Não visualizei no livro, essas abordagens.
estou tentando implementar um Datagrid com Checkbuton, mais estou com uma grande dificuldade em alguns fases.
Para marcar todos estou tendo que jogar um valor na sessão e assim fazendo nova busca no banco setando o valor do checkbutom para true. Ate ae tudo bem, foi a maneira que achei, mais o problema maior esta para salvar os dados.
Explicando melhor:
Tenho um datagrid onde mostro uma serie de notas fiscais (Tabela: id, romaneio, nota, status), neste datagrid, acrescento os checkbuton. Quando for marcado algum checkbuton e clicado no botão salvar do form, quero que os marcados seja atualizado o campo status no banco de dados. Como os checkbuton são criados com o nome check concatenado com o id dos dados do banco(check1, check4 e etc), como vou salvar ou ao menos identificar esse parâmetro para poder fazer alguma ação, ate mesmo impedir que se todos estiver desmarcado e tentar salvar, dê uma mensagem de alerta. Outra questão seria como adicionar ação ao checkbuton ao marcar ou desmarcar algum da lista. Sei que são vários questionamento, mais agradeço demais quem puder ajudar. Não visualizei no livro, essas abordagens.
Herbert, acredito que estes links possam te ajudar:
adianti.com.br/framework_files/tutor/index.php?class=DatagridInputVi
adianti.com.br/framework_files/tutor/index.php?class=DatagridCheckVi
Para adicionar ações aos checks você pode fazer o seguinte:
$action = new TAction(array($this,'suaFuncao'));
$string_action = $action->serialize(FALSE);
$check = new TCheckButton('check1');
$check->setProperty('onChange',"__adianti_post_lookup('{$formName}', '{$string_action}', this)");
Vlw pela resposta. Consegui marcar todos os checks, criando um campo hidden e setando um valor nele, que é checado no reload. O salvamento peguei os dados pela $param que o framework envia. Só a ação que não consegui implementar. Você tem algum código de exemplo?
class RomaneioForm extends TPage
{
private $form; // registration form
private $datagrid;
/**
* Class constructor
* Creates the page, the form and the listing
*/
public function __construct()
{
parent::__construct();
$this->form = new TForm('form_romaneio');
$table = new TTable;
// $table-> border = '1';
// $table-> cellpadding = '4';
// $table-> style = 'border-collapse:collapse;';
$this->form->add($table);
$hidden_check = new THidden('hidden_check');
$cp_hidden = new THidden('cp_hidden');
$cp_romaneio = new TEntry('romaneio');
$cp_romaneio->setSize(280);
$cp_romaneio->addValidation('Romaneio', new TRequiredValidator);
// creates the action button
$bt_pesquisar=new TButton('bt_pesquisar');
$bt_pesquisar->setAction(new TAction(array($this, 'onSearch')), 'Pesquisar');
$bt_pesquisar->setImage('ico_find.png');
$bt_salvar=new TButton('bt_salvar');
$bt_salvar->setAction(new TAction(array($this, 'onSave')), 'Salvar');
$bt_salvar->setImage('ico_save.png');
$bt_marcar=new TButton('bt_marcar');
$bt_marcar->setAction(new TAction(array($this, 'onSelectedAll')), 'Marcar Todos');
//TButton::disableField('form_romaneio','bt_marcar');
$bt_desmarcar=new TButton('bt_desmarcar');
$bt_desmarcar->setAction(new TAction(array($this, 'offSelectedAll')), 'Desmarcar Todos');
TButton::disableField('form_romaneio','bt_desmarcar');
$this->form->addField($hidden_check);
$this->form->addField($cp_hidden);
$this->form->addField($cp_romaneio);
$this->form->addField($bt_pesquisar);
$this->form->addField($bt_salvar);
$this->form->addField($bt_marcar);
$this->form->addField($bt_desmarcar);
// creates one datagrid
$this->datagrid = new TQuickGrid;
$this->datagrid->disableDefaultClick(); // important!
$this->datagrid->setHeight(400);
$this->datagrid->makeScrollable();
// add the columns
$this->datagrid->addQuickColumn('Marcar/Desmarcar', 'check', 'center');
$this->datagrid->addQuickColumn('Código', 'id', 'right');
$this->datagrid->addQuickColumn('Romaneio', 'romaneio', 'right');
$this->datagrid->addQuickColumn('Nota Fiscal', 'numero', 'right');
$this->datagrid->addQuickColumn('Anexo', 'anexo', 'center');
// cria datagrid
$this->datagrid->createModel();
// adiciona botoes na tabela
$row=$table->addRow();
$row->addMultiCell(new TLabel('Romaneio:'),$cp_romaneio);
$row=$table->addRow();
$row->addMultiCell($bt_pesquisar, $bt_salvar, $bt_marcar, $bt_desmarcar);
$row=$table->addRow();
$cell = $row->addCell($this->datagrid);
$cell->colspan=4;
// wrap the page content using vertical box
$vbox = new TVBox;
$vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
$vbox->add($this->form);
parent::add($vbox);
}
/**
* method onSearch()
* Register the filter in the session when the user performs a search
*/
function onSearch()
{
try
{
$this->form->validate();
$data = $this->form->getData();
TTransaction::open('mysql');
$repository = new TRepository('Romaneio');
$criteria = new TCriteria;
$criteria->add(new TFilter('romaneio', '=', $data->romaneio));
$object = $repository->load($criteria);
if(empty($object))
{
$rm = new RomaneioService;
$romaneio_ally = $rm->get('rm', $data->romaneio);
if(!empty($romaneio_ally))
{
$data = $this->form->getData('Romaneio');
$data->store();
$rm = new RomaneioService;
$notas = $rm->get('nt', $data->romaneio);
foreach ($notas as $nota) {
$notaFiscal = new NotaFiscal;
$notaFiscal->numero = $nota->Num_Nota;
$notaFiscal->romaneio = $data->romaneio;
$notaFiscal->store();
}
TTransaction::close();
$this->onReload($data);
}
else
{
new TMessage('info', 'Romaneio não encontrado no banco de dados AllyPharma!');
//$this->datagrid->clear();
}
}
else
{
TTransaction::close();
new TMessage('info', 'Romaneio já cadastrado, verificar notas pendentes!');
$this->onReload($data);
}
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
TTransaction::close();
}
}
/**
* method onReload()
* Load the datagrid with the database objects
*/
function onReload($data)
{
$check = $data->hidden_check;
$this->datagrid->clear();
try
{
TTransaction::open('mysql');
$repository = new TRepository('NotaFiscal');
$criteria = new TCriteria;
$criteria->add(new TFilter('status','=','0'));
$criteria->add(new TFilter('romaneio','=',"$data->romaneio"));
$objects = $repository->load($criteria);
if ($objects)
{
foreach ($objects as $object)
{
$item = new StdClass;
$item->check = new TCheckButton('check'.$object->id);
$item->check->setIndexValue($object->id);
if($check == 'false'):
$item->check->setValue(false);
endif;
if($check == 'true'):
$item->check->setValue(true);
endif;
$item->anexo = new TFile('anexo'.$object->id);
$item->id = $object->id;
$item->romaneio = $object->romaneio;
$item->numero = $object->numero;
$this->datagrid->addItem($item);
$this->form->addField($item->check); // important!
$this->form->addField($item->anexo); // important!
}
}
TTransaction::close();
$data->cp_hidden = $data->romaneio;
$this->form->setData($data);
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
TTransaction::close();
}
}
/**
* method onSelectedAll()
* Executed when the user clicks at the marcar todos button
*/
function onSelectedAll()
{
$data = $this->form->getData();
if($data->romaneio != '')
{
$data->hidden_check = 'true';
TButton::enableField('form_romaneio','bt_desmarcar');
$this->onReload($data);
}
}
/**
* method offSelectedAll()
* Executed when the user clicks at the desmarcar todos button
*/
function offSelectedAll()
{
$data = $this->form->getData();
$data->hidden_check = 'false';
TButton::disableField('form_romaneio','bt_desmarcar');
$this->onReload($data);
}
function onSave($param)
{
$data = $this->form->getData();
$checks = array();
foreach ($param as $key => $value)
{
if($key != 'class' and $key != 'method' and $key != 'romaneio')
{
$checks[$key] = $value;
}
}
if(!empty($checks))
{
try
{
TTransaction::open('mysql');
foreach ($checks as $key => $value)
{
$notaFiscal = NotaFiscal::find($value);
if ($notaFiscal)
{
$notaFiscal->status = 1;
$notaFiscal->store();
}
}
new TMessage('info', 'Notas fiscais validada com sucesso!');
TTransaction::close();
$this->onReload($data);
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
TTransaction::rollback();
TTransaction::close();
}
}
else
{
new TMessage('erro', 'Nem um item marcado!');
$this->onReload($data);
}
}
}
function onReload($data)
{
$check = $data->hidden_check;
$this->datagrid->clear();
try
{
TTransaction::open('mysql');
$repository = new TRepository('Romaneio');
$criteria = new TCriteria;
$criteria->add(new TFilter('status','=','0'));
$criteria->add(new TFilter('romaneio','=',"$data->romaneio"));
$objects = $repository->load($criteria);
$action = new TAction(array($this,'novaFuncao'));
$string_action = $action->serialize(FALSE);
if ($objects)
{
foreach ($objects as $object)
{
$item = new StdClass;
$item->check = new TCheckButton('check'.$object->id);
$item->check->setIndexValue($object->id);
$item->check->setProperty('onChange',"__adianti_post_lookup('{$this->form->getName()}', '{$string_action}', this)");
if($check == 'false'):
$item->check->setValue(false);
endif;
if($check == 'true'):
$item->check->setValue(true);
endif;
$item->anexo = new TFile('anexo'.$object->id);
$item->id = $object->id;
$item->romaneio = $object->romaneio;
$item->numero = $object->numero;
$this->datagrid->addItem($item);
$this->form->addField($item->check); // important!
$this->form->addField($item->anexo); // important!
}
}
TTransaction::close();
$data->cp_hidden = $data->romaneio;
$this->form->setData($data);
}
catch (Exception $e)
{
new TMessage('error', $e->getMessage());
TTransaction::close();
}
}
public static function novaFuncao($param)
{
var_dump($param);
}
Vlw, a função rodou certinho. Meu problema esta agora em fazer marcar sem que seja feito refresh, por que coloquei um campo de arquivo para anexo e quando clico em marcar todos, os arquivos anexados somem. Se tiver alguma ideia, estou aceitando.
como funciona essas duas opções abaixo, sou iniciante?.
$string_action = $action->serialize(FALSE);
$item->check->setProperty('onChange',"__adianti_post_lookup('{$this->form->getName()}', '{$string_action}', this)");
Para marcar/desmarcar sem refresh você pode usar javascript:
Vlw Nataniel Rabaioli, você esta me ajudando bastante. Eu tinha pensado em java script, só não sabia como implementar dentro do framework.
como funciona essas duas opções:
$string_action = $action->serialize(FALSE);
$item->check->setProperty('onChange',"__adianti_post_lookup('{$this->form->getName()}', '{$string_action}', this)");