Dificuldade em filtrar itens combo dinâmico Olá, galera Quero carregar itens no combo 2 conforme a categoria do combo 1, porém não estou conseguindo identificar onde estou errando na hora de fazer o filtro, alguém pode me ajudar ? Segue abaixo fonte que setou utilizando. ...
RB
Dificuldade em filtrar itens combo dinâmico  
Olá, galera

Quero carregar itens no combo 2 conforme a categoria do combo 1, porém não estou conseguindo identificar onde estou errando na hora de fazer o filtro, alguém pode me ajudar ?

Segue abaixo fonte que setou utilizando.
 
  1. <?php
  2. //adciona criterio de filtro categoria natureza juridica
  3. $filter = new TCriteria;
  4. $filter->add(new TFilter('id', '<', '4'));
  5. //categoria juridica
  6. $natureza_categoria = new TDBCombo('natureza_categoria_id','xxxx','CategoriaNaturezaJuridica','id','descricao','descricao',$filter);
  7. $natureza_categoria->setDefaultOption(false);
  8. $natureza_categoria->setSize('width:100%');
  9. $filter1 = new TCriteria;
  10. $filter1->add(new TFilter('categoria_id', '=',$natureza_categoria));
  11. //natureza juridica
  12. $cod_nat_juridica = new TDBCombo('natureza_juridica_id','centinel','NaturezaJuridica','id','codigo_descricao',$filter1);
  13. $cod_nat_juridica->setDefaultOption(false);
  14. $cod_nat_juridica->setChangeAction( new TAction( array($this, 'NaturezaJuridica')) );
  15. //metodo NaturezaJuridica
  16. public static function NaturezaJuridica($param)
  17. {
  18. try
  19. {
  20. TTransaction::open('xxxxx');
  21. if ($param['natureza_categoria_id'])
  22. {
  23. $criteria = TCriteria::create( ['categoria_id ' => $param['natureza_categoria_id'] ] );
  24. // formname, field, database, model, key, value, ordercolumn = NULL, criteria = NULL, startEmpty = FALSE
  25. TDBCombo::reloadFromModel('frm_empresa', 'categoria_id', 'centinel', 'NaturezaJuridica', 'id', '{descricao} ({id})', 'descricao', $criteria, TRUE);
  26. }
  27. else
  28. {
  29. TCombo::clearField('frm_empresa', 'natureza_juridica_id');
  30. }
  31. TTransaction::close();
  32. }
  33. catch (Exception $e)
  34. {
  35. new TMessage('error', $e->getMessage());
  36. }
  37. }
  38. ?>


Model Categoria

 
  1. <?php
  2. /**
  3. * NaturezaJuridica Active Record
  4. * @author <your-name-here>
  5. */
  6. class NaturezaJuridica extends TRecord
  7. {
  8. const TABLENAME = 'natureza_juridica';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. private $categoria_natureza_juridica;
  12. private $juridica;
  13. /**
  14. * Constructor method
  15. */
  16. public function __construct($id = NULL, $callObjectLoad = TRUE)
  17. {
  18. parent::__construct($id, $callObjectLoad);
  19. parent::addAttribute('codigo_descricao');
  20. parent::addAttribute('categoria_id');
  21. }
  22. /**
  23. * Method set_categoria_natureza_juridica
  24. * Sample of usage: $natureza_juridica->categoria_natureza_juridica = $object;
  25. * @param $object Instance of CategoriaNaturezaJuridica
  26. */
  27. public function set_categoria_natureza_juridica(CategoriaNaturezaJuridica $object)
  28. {
  29. $this->categoria_natureza_juridica = $object;
  30. $this->categoria_natureza_juridica_id = $object->id;
  31. }
  32. /**
  33. * Method get_categoria_natureza_juridica
  34. * Sample of usage: $natureza_juridica->categoria_natureza_juridica->attribute;
  35. * @returns CategoriaNaturezaJuridica instance
  36. */
  37. public function get_categoria_natureza_juridica()
  38. {
  39. // loads the associated object
  40. if (empty($this->categoria_natureza_juridica))
  41. $this->categoria_natureza_juridica = new CategoriaNaturezaJuridica($this->categoria_natureza_juridica_id);
  42. // returns the associated object
  43. return $this->categoria_natureza_juridica;
  44. }
  45. ?>


Model CategoriaJuridica

 
  1. <?php
  2. /**
  3. * CategoriaNaturezaJuridica Active Record
  4. * @author <your-name-here>
  5. */
  6. class CategoriaNaturezaJuridica extends TRecord
  7. {
  8. const TABLENAME = 'categoria_juridica';
  9. const PRIMARYKEY= 'id';
  10. const IDPOLICY = 'serial'; // {max, serial}
  11. /**
  12. * Constructor method
  13. */
  14. public function __construct($id = NULL, $callObjectLoad = TRUE)
  15. {
  16. parent::__construct($id, $callObjectLoad);
  17. parent::addAttribute('descricao');
  18. }
  19. }
  20. ?>



desde já obrigado pela atenção.




Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (8)


AM

Olá Rubens,

Dê uma olhada em:

https://www.adianti.com.br/framework_files/tutor/index.php?class=FormInteraction
NR

Tá faltando 1 parâmetro na segunda instância da TDBCombo, linha 15
MC

Experimente primeiro deixar o $filter1 em branco para mudar de acordo com o combo 2
 
  1. <?php
  2. $filter1 = new TCriteria;
  3. $filter1->add(new TFilter('categoria_id', '<',$natureza_categoria'0'));
  4. ?>


na linha 35 tente
 
  1. <?php
  2. TCombo::clearField('frm_empresa', 'Categoria_id');
  3. ?>

Boa sorte
MC

Experimente primeiro deixar o $filter1 em branco para mudar de acordo com o combo 2
$filter1 = new TCriteria;
$filter1->add(new TFilter('categoria_id', '<', '0'));


na linha 35 tente

TCombo::clearField('frm_empresa', 'categoria_id');

Boa sorte
RB

Miuller,

fiz como indicou porém combo dois não carrega nenhum item.

Só lembrando que a ordem é seleciona item combo 1 e carrega combo 2 conforme item combo um.



//Trecho alterado

 
  1. <?php
  2. ............
  3. //categoria juridica combo 1
  4. $natureza_categoria = new TDBCombo('natureza_categoria_id','centinel','CategoriaNaturezaJuridica','id','descricao','descricao');
  5. //combo dois
  6. $filter1 = new TCriteria;
  7. $filter1->add(new TFilter('categoria_id', '<', 0));
  8. //natureza juridica
  9. $cod_nat_juridica = new TDBCombo('natureza_juridica_id','centinel','NaturezaJuridica','id','codigo_descricao','codigo_descricao',$filter1);
  10. $cod_nat_juridica->setChangeAction( new TAction( array($this, 'NaturezaJuridica')) );
  11. ..................
  12. if ($param['natureza_categoria_id'])
  13. {
  14. $criteria = TCriteria::create( ['categoria_id ' => $param['natureza_categoria_id'] ] );
  15. //formname, field, database, model, key, value, ordercolumn = NULL, criteria = NULL, startEmpty = FALSE
  16. TDBCombo::reloadFromModel('frm_empresa', 'categoria_id', 'centinel', 'NaturezaJuridica', 'id', '{descricao} ({id})', 'descricao', $criteria, TRUE);
  17. }
  18. else
  19. {
  20. TCombo::clearField('frm_empresa', 'categoria_id');
  21. }
  22. ?>

MC

Primeiramente a mensagem de erro que vc mandou o print na tela diz que está ocorrendo um erro de sql, ou seja, a combo não está conseguindo filtrar(not be converted to string), estava faltando um parâmetro na sua combo.

Reescrevi o código das combos para facilitar o entendimento
 
  1. <?php
  2. //combo 1(master)
  3. $natureza_categoria_id = new TDBCombo('natureza_categoria_id' ,'centinel','CategoriaNaturezaJuridica','id','descricao' ,'descricao asc' );
  4. //combo 2 (detail)
  5. $natureza_juridica_id = new TDBCombo('natureza_juridica_id' ,'centinel','NaturezaJuridica' ,'id','codigo_descricao','codigo_descricao asc',$filter1 );
  6. ?>

Segundo, sua combo1 tem nome, se chama natureza_categoria_id, então o parâmetro da primeira combo se chama "natureza_categoria_id", com isso sua function vai ordenar a segunda combo(natureza_juridica_id) de acordo com a primeira, abaixo tentei reescrever o código, observe o nome das combos

 
  1. <?php
  2. try
  3. {
  4. TTransaction::open('centinel'); //base de dados
  5. if ($param['natureza_categoria_id'])//se existe parâmetro da primeira combo(nome da primeira combo)
  6. {
  7. $criteria = TCriteria::create( ['categoria_id' => $param['natureza_categoria_id'] ] ); //categoria id = parametro chave estrangeira da tabela master
  8. // formname , field(nome do campo) , database , nome da model , key , value , ordercolumn = NULL, criteria, startEmpty = FALSE
  9. TDBCombo::reloadFromModel('frm_empresa', 'natureza_juridica_id', 'centinel' , 'NaturezaJuridica' , 'id' , '{descricao}', 'id', $criteria, TRUE);
  10. }
  11. else
  12. {
  13. TCombo::clearField('frm_empresa', 'natureza_categoria_id'); //reload do formulario frm_empresa na segunda combo "natureza_juridica_id"
  14. }
  15. }
  16. ?>


Não testei, mas a lógica é essa, se não der certo me manda um email que eu te envio um exemplo de código estado x cidade. boa sorte
RB

Miuller,

Mais uma vez obrigado pela atenção,alterei conforme indicou mas sem sucesso.

simplesmente não carrega os dados do combo 2, nem da erro.

<a href="attach/3991/Captura de tela de 2017-12-12 14-04-38.png">Captura de tela de 2017-12-12 14-04-38.png</a>
RB

Miuller,

Consegui resolver, estava cometendo um amadorismo na hora de atribuir a ação a categoria.

 
  1. <?php
  2. ...................
  3. //adciona criterio de filtro categoria natureza juridica
  4. $filter = new TCriteria;
  5. $filter->add(new TFilter('id', '<', '4'));
  6. //combo 1(master)
  7. $categoria_juridica_id = new TDBCombo('categoria_juridica_id' ,'centinel','CategoriaJuridica','id','descricao','descricao asc',$filter);
  8. $categoria_juridica_id->setDefaultOption(false);
  9. $categoria_juridica_id->setChangeAction( new TAction( array($this, 'onChangeAction')) );
  10. $filter1 = new TCriteria;
  11. $filter1->add(new TFilter('id', '<','0'));
  12. //combo 2 (detail)
  13. $natureza_juridica_id = new TDBCombo('natureza_juridica_id','centinel','NaturezaJuridica','id','codigo_descricao','codigo_descricao asc',$filter1);
  14. static function onChangeAction($param)
  15. {
  16. try
  17. {
  18. TTransaction::open('centinel'); //base de dados
  19. if ($param['categoria_juridica_id'])//se existe parâmetro da primeira combo(nome da primeira combo)
  20. {
  21. $criteria = TCriteria::create( ['categoria_juridica_id' => $param['categoria_juridica_id'] ] );
  22. //$criteria = new TCriteria;
  23. //$criteria->add(new TFilter('categoria_juridica_id', '=', $param['categoria_juridica_id']));
  24. //categoria_juridica_id = parametro chave estrangeira da tabela master
  25. // formname,field(nome do campo),database , nome da model,key,value,ordercolumn = NULL,criteria, startEmpty = FALSE
  26. TDBCombo::reloadFromModel('frm_empresa','natureza_juridica_id','centinel','NaturezaJuridica','id','{codigo_descricao}', 'codigo_descricao',$criteria,TRUE);
  27. }
  28. else
  29. {
  30. TCombo::clearField('frm_empresa', 'natureza_juridica_id'); //reload do formulario frm_empresa na segunda combo "natureza_juridica_id"
  31. }
  32. TTransaction::close();
  33. }
  34. catch (Exception $e)
  35. {
  36. new TMessage('error', $e->getMessage());
  37. }
  38. }
  39. ?>


Valeu pela força.