Lançado Adianti Framework 7.6!
Clique aqui para saber mais
usando o FormDynamicFilterView Oi Galera. Usei o exemplo desta pagina: http://www.adianti.com.br/framework_files/tutor/index.php?class=FormDynamicFilterView para criar campos TCombos dinâmicos. Conforme o resultado do primeiro, monto o segundo e conforme o resulta do segundo monto o terceiro. O problema que estou enfrentando é na hora do onEdit, eu não consigo deixar eles selecionados com os dados do banco. Alguem ...
GE
usando o FormDynamicFilterView  
Fechado
Oi Galera.

Usei o exemplo desta pagina:
www.adianti.com.br/framework_files/tutor/index.php?class=FormDynamic
para criar campos TCombos dinâmicos.
Conforme o resultado do primeiro, monto o segundo e conforme o resulta do segundo monto o terceiro.

O problema que estou enfrentando é na hora do onEdit, eu não consigo deixar eles selecionados com os dados do banco.
Alguem já enfrentou esse problema?

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


FC

Pela logica vc precisará dar o reload na combo antes de enviar ao form pelo sendData do dentro onEdit mais ou menos isso ae...
  1. <?php
  2. TTransaction::open('conn');
  3. $repo = new TRepository('Classe');
  4. $criteria = new TCriteria;
  5.    
  6. $criteria->add(new TFilter('seucampo','=',$object->campoclasse);//seu criterio virá no $object do onEdit
  7. $options = array();
  8. $dados $repo->load($criteria);
  9. TTransaction::close();
  10. foreach ($dados as $dado)
  11.         {
  12.             $options$dado->id] = $dado->name;
  13.         }
  14. TCombo::reload('form_seu_form'suacombo', $options);
  15. ?>
GE

Sim. Já tinha tentado isso. primeira fiz chamando as funçoes staticas que geram os TCombos e não funcionou.

Depois tentei gerar o código dentro do metodo onEdit conforme código abaixo:
if($object->solicitante_id) { TTransaction::open('tecbiz'); $pessoa = new Pessoa($object->solicitante_id); $object->tipo_origens = $pessoa->origem; $repo = new TRepository('Entidade'); $criteria = new TCriteria; $criteria->add( new TFilter('enttipent', '=', 1)); $newparam['order'] = 'entcodent'; $newparam['direction'] = 'asc'; $criteria->setProperties($newparam); // order, offset $entidades = $repo->load($criteria); $options [] = '--Selecione--'; foreach($entidades as $etd) { $options [ $etd->entcodent ] = str_pad($etd->entcodent, 4, "0", STR_PAD_LEFT).' - '.$etd->entnomfan; } TCombo::reload('form_Ticket', 'codigo_cadastro_origem', $options); $object->codigo_cadastro_origem = $pessoa->codigo_cadastro_origem; /* $vars['tipo_origens'] = $pessoa->origem; $vars['codigo_cadastro_origem'] = $pessoa->codigo_cadastro_origem; $this->onChangeOrigem($vars); $this->onChangeTipoOrigem($vars); $object->tipo_origens = $pessoa->origem; $object->solicitante_id = $pessoa->pessoa_codigo; print $pessoa->pessoa_nome; //TCombo::reload('form_Ticket', 'solicitante_id', $pessoa->pessoa_nome); */ TTransaction::close(); } $object->orcamento_horas ? $object->orcamento_horas = strstr($object->orcamento_horas, ':', true) : null; $this->form->setData($object); // fill the form


Mas continua não deixando selecionado os valores, mesmo atribuindo um valor valido ao objeto com o respectivo nome do form e chamando a funcao setData($object)
FC

TTransaction::close();//é nessa hora que executa a query

Tem que ser executado antes do TCombo::reload('form_Ticket', 'codigo_cadastro_origem', $options); uma outra coisa vc não precisa definir $options = array(); antes?


Sds
GE

Oi Felipe.

Não precisa.

Na tela ele chega a montar todos os selects, conforme os parametros utilizados, só não está atribuindo o valor.

Olhando o código eu verifiquei que $object é uma classe do tipo Ticket e os atributos das TCombo são do tipo Pessoa.
Vou tentar transformar o $object em uma new StdClass e passar um objeto nao vinculado a uma classe.

FC

Então ele está carregando a combo mais não esta selecionando o valor do id é isso?
GE

isso
FC

Será que não é porque a tela não está renderizada ?

passando assim acho que vai continuar o erro.
TForm::sendData('form_Ticket', $object);

e se salvar na seção e colocar como setValue ?
GE

Não sei...
Tentei varias coisas, sabe se tem como capturar o compomente atravez do $this->form->getFormByName

para que eu tenha acesso ao setValue do componente em especifico?

botei as imagens aqui para ver como ficou.

gustavoemmel.blogspot.com.br/2015/07/acessando-componentes.html

FC

Tem como minimizar esse projeto e me enviar para eu testar ?
GE

vou atualizar os arquivos no github e a noite eu passo os links
GE

https://github.com/GustavoEmmel/Atividades
JN

Boa tarde,

Acredito que na hora de enviar os dados para a tela está enviando o nome que está registrado no banco e não o id.

É registrado no banco o id ou o nome?

GE

Oi João.

Eu guardo o ID,

acredito que estou enviando para a tela nesses momentos:

$object->tipo_origens = $pessoa->origem; $object->codigo_cadastro_origem = $pessoa->codigo_cadastro_origem; $object->solicitante_id = $pessoa->pessoa_codigo; $this->form->setData($object); // fill the form
JN

E como está a configuração do campo abaixo do form dentro do construtor? Tem como postar o código.
Provavelmente você já verificou se está chegando o id do banco, então pode ser algo no form.
GE

o id do banco esta chegando sim.
veriquei atravez de var_dump do object e de print do atributo do objetct

o codigo eh esse:

https://github.com/GustavoEmmel/Atividades/blob/master/atividades/app/control/tickets/TicketForm.class.php

Aqui estou criando os campos no construtor:

$combo_tipo_origens = new TCombo('tipo_origens'); $combo_tipo_origens->addItems(array(1 => 'Entidade', 2 => 'Estabelecimento', 3 => 'Empresa') ); $combo_codigo_origem = new TCombo('codigo_cadastro_origem'); $combo_solicitante_id = new TCombo('solicitante_id'); $change_origem = new TAction(array ($this, 'onChangeOrigem')); $combo_tipo_origens->setChangeAction($change_origem); $change_tipo_origem = new TAction(array ($this, 'onChangeTipoOrigem')); $combo_codigo_origem->setChangeAction($change_tipo_origem);


ainda tenho os metodos staticos para alterar as TCombos:

public static function onChangeTipoOrigem($param) { if($param['tipo_origens'] && $param['codigo_cadastro_origem']) { try { TTransaction::open('tecbiz'); $repo = new TRepository('Pessoa'); $criteria = new TCriteria; $criteria->add(new TFilter("ativo", "=", 1)); $criteria->add(new TFilter('origem', '=', $param['tipo_origens']) ); $criteria->add(new TFilter('codigo_cadastro_origem', '=', $param['codigo_cadastro_origem']) ); $newparam['order'] = 'pessoa_nome'; $newparam['direction'] = 'asc'; $criteria->setProperties($newparam); // order, offset $pessoas = $repo->load($criteria); $options [] = '--Selecione--'; foreach($pessoas as $pessoa) { $options [ $pessoa->pessoa_codigo ] = $pessoa->pessoa_nome; } TTransaction::close(); } catch(Exception $e) { new TMessage('error', $e->getMessage()); } } TCombo::reload('form_Ticket', 'solicitante_id', $options); } public static function onChangeOrigem($param) { if($param['tipo_origens']) { try { TTransaction::open('tecbiz'); if($param['tipo_origens'] == 1) { $repo = new TRepository('Entidade'); $criteria = new TCriteria; $criteria->add( new TFilter('enttipent', '=', 1)); $newparam['order'] = 'entcodent'; $newparam['direction'] = 'asc'; $criteria->setProperties($newparam); // order, offset $entidades = $repo->load($criteria); $options [] = '--Selecione--'; foreach($entidades as $etd) { $options [ $etd->entcodent.$selecao ] = str_pad($etd->entcodent, 4, "0", STR_PAD_LEFT).' - '.$etd->entnomfan; } } if($param['tipo_origens'] == 2) { $repo = new TRepository('Estabelecimento'); $criteria = new TCriteria; // $criteria->add( new TFilter('enttipent', '=', 1)); $newparam['order'] = 'lojcodloj'; $newparam['direction'] = 'asc'; $criteria->setProperties($newparam); // order, offset $estabelecimentos = $repo->load($criteria); $options [] = '--Selecione--'; foreach($estabelecimentos as $ecs) { $options [ $ecs->lojcodloj ] = str_pad($ecs->lojcodloj, 4, "0", STR_PAD_LEFT).' - '.$ecs->lojnomfan; } } if($param['tipo_origens'] == 3) { $repo = new TRepository('Empresa'); $criteria = new TCriteria; // $criteria->add( new TFilter('enttipent', '=', 1)); $newparam['order'] = 'id'; $newparam['direction'] = 'asc'; $criteria->setProperties($newparam); // order, offset $empresas = $repo->load($criteria); $options [] = '--Selecione--'; foreach($empresas as $emp) { $options [ $emp->id ] = str_pad($emp->id, 4, "0", STR_PAD_LEFT).' - '.$emp->razao_social; } } TTransaction::close(); } catch(Exception $e) { new TMessage('error', $e->getMessage()); } } TCombo::reload('form_Ticket', 'solicitante_id', $opt); TCombo::reload('form_Ticket', 'codigo_cadastro_origem', $options); }



ps. A tag code esta funcionando no forum?
FC

Gustavo

Olhando seu código parece que o valor retornado do key da combo é diferente de quando vc carrega a página, talvez seja por causa desta linha { $options [] = '--Selecione--';}, pode remover para testar, mas para confirmar dar um var_dump no objeto->combo no onSave e outro no objeto->combo do onEdit e compare acredito que ele está assumindo um index diferente.

Abraços
GE

Oi. Tentei tirar o indice nulo do array com o --Selecione-- e a unica coisa que diferenciou é que veio mostrando o como selecionado o primeiro valor do TCombo.

Dei os var_dump no onSave e onEdit como vc disse assim:

var_dump($object->tipo_origens);
print '<br />';

var_dump($object->codigo_cadastro_origem);
print '<br />';

var_dump($object->solicitante_id);
print '<br />';

no onSave ele retorna assim:

string(1) "1"
string(1) "2"
string(2) "22"

no onEdit vindo da lista ele vem assim:

int(1)
int(2)
int(22)

então converti o tipo da variavel para string assim:

$object->tipo_origens = (string) $pessoa->origem;
$object->codigo_cadastro_origem = (string) $pessoa->codigo_cadastro_origem;
$object->solicitante_id = (string) $pessoa->pessoa_codigo;

E apesar do var_dump retornar assim:
string(1) "1"
string(1) "2"
string(2) "22"
ele continuou não setando o valor das combos.

Mas ele monta as combos certas. Eu inclusive tentei concatenar um ' selected' no indice do valor que eu queria que selecionasse mas nao rolou...
FC

Gustavo

Realmente está difícil acredito que estamos deixar passar algo, porém eu contornaria esse problema com javascript assim
no OnEdit
TScript::create('$("select[name='list']").val('a');'); //ajustar o nome da combo e pegar o valor do objeto

Vou montar um exemplo criando essas condições para testar.
GE

Então, consegui resolver o problema da seguinte maneira.

Criei outro método static para setar os valores nas combos.

public static function onSetarValoresCombo($param) { $obj = new StdClass; $obj->tipo_origens = $param['tipo_origens']; $obj->codigo_cadastro_origem = $param['codigo_cadastro_origem']; $obj->solicitante_id = $param['solicitante_id']; TForm::sendData('form_Ticket', $obj, FALSE, FALSE); }


Depois lá no onEdit, apos criar os TCombo, eu chamei essa funçao passando um array com os valores que gostaria de setar nas combos.

assim

$this->form->setData($object); // fill the form $this->onSetarValoresCombo($vars);