MG
Problemas ao carregar um DataGrid
Fechado
Pessoal, mais uma vez preciso da ajuda de vocês.
Tenho a seguinte classe no qual eu carrego um TCombo com os centros de custos do usuário logado.
Ao selecionar um centro de custo (onChangeAction), eu consigo acionar o evento, mas o $this->datagrid não é reconhecido.
Eu pensei que fosse o fato de estar num "static function", então eu criei um novo método, mas mesmo assim quando uso:
$this->datagrid->clear(); ou $this->datagrid->addItem(array) ele dá pau e não executa, se comento as linhas do datagrid, o métod funciona.
Alguém tem alguma luz?
Abraços
Marcelo
Tenho a seguinte classe no qual eu carrego um TCombo com os centros de custos do usuário logado.
Ao selecionar um centro de custo (onChangeAction), eu consigo acionar o evento, mas o $this->datagrid não é reconhecido.
Eu pensei que fosse o fato de estar num "static function", então eu criei um novo método, mas mesmo assim quando uso:
$this->datagrid->clear(); ou $this->datagrid->addItem(array) ele dá pau e não executa, se comento as linhas do datagrid, o métod funciona.
Alguém tem alguma luz?
Abraços
Marcelo
- <?php
- class FuncionarioHomeOffice extends TPage
- {
- private $form;
- private $datagrid;
- private $panel;
- public function __construct()
- {
- parent::__construct();
- $this->form = new TQuickForm('form_funcionario_homeoffice');
- $this->form->class = 'tform';
- $this->form->setFormTitle('Colaboradores em Home Office');
- $this->datagrid = new TDataGrid;
- $username = new TEntry('username');
- $matricula = new TEntry('matricula');
- $centrocustoid = new TCombo('centrocustoid');
- $matricula->setValue(TSession::getValue('login'));
- $matricula->setEditable(false);
- $username->setValue(TSession::getValue('username'));
- $username->setEditable(false);
- // Carrega o combo dos centros de custos do coordenador
- TTransaction::open('permission');
- $repository = new TRepository('UsuarioCentroCusto');
- $criteria = new TCriteria;
- $criteria->add(new TFilter('login','=',$matricula->getValue()));
- $cc = $repository->load($criteria);
- $itemsCombo = array();
- foreach($cc as $dados):
- $itemsCombo[$dados->centrocustoid] = $dados->centrocustoid;
- endforeach;
- $centrocustoid->addItems($itemsCombo);
- TTransaction::close();
- $matricula_colaborador = new TDataGridColumn('matricula','Matricula','center',80);
- $nome_funcionario = new TDataGridColumn('nome_funcionario','Nome do Funcionário','left',300);
- $this->datagrid->addColumn($matricula_colaborador);
- $this->datagrid->addColumn($nome_funcionario);
- $this->datagrid->createModel();
- $change_action = new TAction(array($this, 'onChangeAction'));
- $centrocustoid->setChangeAction($change_action);
- $this->form->addQuickField('Login',$matricula,200);
- $this->form->addQuickField('Coordenador : ',$username,400);
- $this->form->addQuickField('Centro de Custo',$centrocustoid,300);
- //$this->form->setFields(array($matricula,$centrocustoid));
- parent::add($this->form);
- parent::add($this->datagrid);
- }
- public static function onChangeAction($param)
- {
- try
- {
- $ccid = $param['centrocustoid'];
- TTransaction::open('permission');
- // limpa a grid
- //self::$datagrid->clear();
- // busca os dados para preencher a grid
- $repository = new TRepository('HomeOffice');
- $criteria = new TCriteria;
- $criteria->add(new TFilter('centro_custo','=',$ccid));
- $registros = $repository->count($criteria);
- $dados = $repository->load($criteria);
- self::carregaDataGrid($dados);
- TTransaction::close();
- }
- catch (Exception $e)
- {
- $msg = 'Erro : ' . $e->getCode() . ' - Mensagem : ' . $e->getMessage();
- new TMessage('error',$msg);
- }
- }
- function carregaDataGrid($param)
- {
- try
- {
- $this->datagrid->clear();
- $items = new stdClass;
- foreach($param as $dados):
- $items->matricula = $dados->matricula;
- $items->nome_funcionario = $dados->nome_funcionario;
- $this->datagrid->addItem($items);
- endforeach;
- }
- catch (Exception $e)
- {
- new TMessage('error',$e->getCode());
- }
- }
- }
- ?>
lá na declaração da variavel está private não seria protected ?
protected $datagrid;
Olá Felipe
Não funcionou.......
Dentro da class carrega normalmente, mas quando dentro de um método estático, nada mesmo mudando de private para protected.
O que pode ser?
Cara, estou amarrado com isso......
Mesmo assim obrigado.
Abraços
Da um print_r no $items para nós analisarmos
Olá Felipe, segue:
Os dados estão vindo então o problema é no
Array que vai para o data grid
Passei por isso uma vez comparei o array com o outro tive que alterar mais ou menos assim
$items->matrícula = stdClass;
Não tenho certeza que seu caso é esse.
Amanhã senão conseguir tento montar um exemplo para ver o erro.
People,
Nem tudo pode ser realizado de maneira estática no evento de saída de um campo.
Podemos enviar valores para um campo, mas não podemos recarregar uma datagrid ainda.
Na verdade, nunca foi objetivo do evento de saída de campo fazer esse tipo de coisa.
Mas podemos atingir objetivo similar. Acredito que você tenha um formulário acima
de sua datagrid. Basta acionar o evento de postagem sempre que sair do campo:
Para tal, experimente usar o método TApplication::postData():
Ex:
Esse método força a postagem de um formulário.
Como ele gera uma ação Javascript, ele pode ser usado dentro do changeAction.
Att,
Pablo
Oi Pablo, estive analisando o TCombo, não poderia existir um método estático de reload no TDataGrid igual ao TCombo?
Acho que isso resolveria....
Eu tentei fazer a alteração, utilizando como exemplo o código TCombo:reload(), mas sem sucesso!
Abraços
marcelo
Pablo
Fiz a alteração implementando
E funcionou..... um único detalhe. No carregamento da página, onde deveria aparecer "Carregando", está aparecendo "undefined".
Sabe dizer por que?
Mas a grid agora é carregada através de outro método chamado "onCarregarGrid" no qual passo no 3º parâmetro.
Como faço para deixar a mensagem como "Carregando"?
Obrigado novamente pela ajuda!
Abraços
Marcelo
Marcelo,
Entendi, é estranho pois a função __adianti_block_ui() que faz o bloqueio usa uma variável Javascipt chamada Adianti.waitMessage, que geralmente é definida na ação de um botão qualquer. Como geralmente para entrar no sistema já precisamos clicar em um botão para login, essa mensagem sempre é definida. Mas para evitar problemas, coloquei isso no início do application.js:
Abraço,
Pablo