Combos vetoriais Olá, pessoal Tenho 3 combos (vetoriais) em um forme, porém estou com o seguinte problema, ao adicionar a segunda linha e escolher os item os valores das combos da primeira linha é alterado. Segue trecho do código abaixo. ...
RB
Combos vetoriais  
Olá, pessoal

Tenho 3 combos (vetoriais) em um forme, porém estou com o seguinte problema, ao adicionar a segunda linha e escolher os item os valores das combos da primeira linha é alterado.

Segue trecho do código abaixo.

 
  1. <?php
  2. //adciona criterio de filtro tipo endereço $filter = new TCriteria;
  3. $filter->add(new TFilter('id', '>','3'));
  4. //adciona criterio de filtro categoria natureza juridica
  5. $filter2 = new TCriteria;
  6. $filter2->add(new TFilter('id', '<', '0'));
  7. //adciona criterio de filtro categoria natureza juridica
  8. $filter3 = new TCriteria;
  9. $filter3->add(new TFilter('id', '<', '0'));
  10. $tipo1 = new TDBCombo('tipo1[]',self::$database,'TipoEndereco','id','{nome}','id',$filter);
  11. $tipo2 = new TDBCombo('tipo2[]',self::$database,'TipoContato','id','{nome}','id',$filter2);
  12. $tipo3 = new TDBCombo('tipo3[]',self::$database,'Tipo','id','{tipo->nome}','id',$filter3);
  13. $valor = new TEntry('value[]');
  14. $tipo1->setDefaultOption(false);
  15. $tipo2->setDefaultOption(false);
  16. $tipo3->setDefaultOption(false);
  17. $tipo1->setChangeAction( new TAction( array($this, 'onChangeAction')) );
  18. $tipo2->setChangeAction( new TAction( array($this, 'onChangeAction2')) );
  19. /cria lista de opções
  20. $this->fieldlist = new TFieldList;
  21. $this->fieldlist->width = '100%';
  22. $this->fieldlist->name = 'contato_list';
  23. $this->fieldlist->addField( '<b>Tipo 1</b>',$tipo1,['width' => '25%']);
  24. $this->fieldlist->addField( '<b>Tipo 2</b>',$tipo2,['width' => '25%']);
  25. $this->fieldlist->addField( '<b>Tipo 3</b>',$tipo3,['width' => '25%']);
  26. $this->fieldlist->addField( '<b>Valor</b>',$valor, ['width' => '25%']);
  27. //adiciona lista de campos ( contato ao formulário )
  28. $this->form->addField($tipo1);
  29. $this->form->addField($tipo2);
  30. $this->form->addField($tipo3);
  31. $this->form->addField($valor);
  32. //Habilita função de ordenação
  33. $this->fieldlist->enableSorting();
  34. //adiciona lista ao formulário
  35. $row = $this->form->addFields([$this->fieldlist]);
  36. public static function onChangeAction($param)
  37. {
  38. if (!empty($param['tipo1']))
  39. {
  40. $input_id = $param['_field_id'];//id do field tipo_contato_id
  41. $input_tipo = explode('_', $input_id);//valor do campo tipo_id
  42. $tipo1 = $param['_field_value'];//apenas o código
  43. $unique_id = end($input_tipo);
  44. try
  45. {
  46. $criteria = TCriteria::create( ['tipo_endereco_id' => $tipo1 ] );
  47. //categoria_juridica_id = parametro chave estrangeira da tabela master
  48. //formname,field(nome do campo),database , nome da model,key,value,ordercolumn = NULL,criteria, startEmpty = FALSE
  49. TDBCombo::reloadFromModel(self::$formName,'tipo2[]',self::$database,'TipoContato','id','{nome}','id',$criteria,TRUE);
  50. }
  51. catch (Exception $e)
  52. {
  53. new TMessage('error', $e->getMessage());
  54. }
  55. }
  56. else
  57. {
  58. TCombo::clearField(self::$formName,'tipo2[]'); //reload do formulario na segunda combo "tipo2_"
  59. }
  60. }
  61. public static function onChangeAction2($param)
  62. {
  63. if (!empty($param['tipo2']))
  64. {
  65. $input_id = $param['_field_id'];//id do field tipo_contato_id
  66. $input_tipo = explode('_', $input_id);//valor do campo tipo_id
  67. $tipo2 = $param['_field_value'];//apenas o código
  68. $unique_id = end($input_tipo);
  69. try
  70. {
  71. //$criteria1 = TCriteria::create( ['tipo1' => $tipo2 ] );
  72. $criteria = new TCriteria;
  73. $criteria->add(new TFilter('tipo_contato_id', '=', $tipo2));
  74. //categoria_juridica_id = parametro chave estrangeira da tabela master
  75. //formname,field(nome do campo),database , nome da model,key,value,ordercolumn = NULL,criteria, startEmpty = FALSE
  76. TDBCombo::reloadFromModel(self::$formName,'tipo3[]',self::$database,'Tipo','id','{tipo->nome}','id',$criteria1,TRUE);
  77. }
  78. catch (Exception $e)
  79. {
  80. new TMessage('error', $e->getMessage());
  81. }
  82. }
  83. }
  84. public function fireEvents($object)
  85. {
  86. $obj = new stdClass;
  87. if(get_class($obj) == 'stdClass')
  88. {
  89. if (!empty($object))
  90. {
  91. foreach ($object as $value)
  92. {
  93. if($value)
  94. {
  95. $obj->tipo1 = $value->tipo_endereco_id;
  96. $obj->tipo2 = $value->tipo_contato_id;
  97. $obj->tipo3 = $value->tipo_id;
  98. $obj->value = $value->value;
  99. }
  100. else
  101. {
  102. $obj->tipo1 = $value->tipo_endereco_id;
  103. $obj->tipo2 = $value->tipo_contato_id;
  104. $obj->tipo3 = $value->tipo_id;
  105. $obj->value = $value->value;
  106. }
  107. }
  108. }
  109. }
  110. TForm::sendData(self::$formName, $obj);
  111. }
  112. ?>

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


RB

Pessoal, Resolvido

 
  1. <?php
  2. //Linha 57
  3. TDBCombo::reloadFromModel(self::$formName,'tipo2_'.$unique_id,self::$database,'TipoContato','id','{nome}','id',$criteria,TRUE);
  4. //Linha 86
  5. TDBCombo::reloadFromModel(self::$formName,'tipo3_'.$unique_id,self::$database,'Tipo','id','{tipo->nome}','id',$criteria1,TRUE);
  6. ?>
RB

Pessoal.

Achei que tinha resolvido,mas não funcionou.

Alguém consegue identificar o problema.
JR

O que mudou quando vc usou o $unique_id ?
RB

João,

Os dados do primeiro e segundo combo não são preenchidos com as informações do banco ao editar ao editar

ap.imagensbrasil.org/image/q5C9Im
NR

Na função onChangeAction você também precisa passar o id do campo ao invés do nome "tipo2[]", senão no onchange da combo 1 todas as combos 2 serão recarregadas, pois possuem o mesmo nome:
 
  1. <?php
  2. //onChangeAction
  3. TDBCombo::reloadFromModel(self::$formName,'tipo2[]',self::$database,'TipoContato','id','{nome}','id',$criteria,TRUE);
  4. ?>
RB

Natanael,

Eu fiz desta forma, porém ao selecionar uma opção no combo da linha de baixo, os dados da linha de cima são limpos.

Veja como esta o código que estou utilizando.

O problema é na hora de editar os dados, a segunda combo e terceira não é preenchida.

 
  1. <?php
  2. public static function onChangeAction($param)
  3. {
  4. if (!empty($param['tipo1']))
  5. {
  6. $input_id = $param['_field_id'];//id do field tipo_contato_id
  7. $tipo1 = $param['_field_value'];//apenas o código
  8. $input_tipo = explode('_', $input_id);//valor do campo tipo_id
  9. $unique_id = end($input_tipo);
  10. try
  11. {
  12. $criteria = TCriteria::create( ['tipo_endereco_id' => $tipo1 ] );
  13. //tipo_endereco_id = parametro chave estrangeira da tabela master
  14. //formname,field(nome do campo),database , nome da model,key,value,ordercolumn = NULL,criteria, startEmpty = FALSE
  15. TDBCombo::reloadFromModel(self::$formName,'tipo2_'.$unique_id,self::$database,'TipoContato','id','{nome}','id',$criteria,TRUE);
  16. }
  17. catch (Exception $e)
  18. {
  19. new TMessage('error', $e->getMessage());
  20. }
  21. }
  22. else
  23. {
  24. TCombo::clearField(self::$formName,'tipo2_'.$unique_id); //reload do formulario na segunda combo "tipo2_"
  25. }
  26. }
  27. public static function onChangeAction2($param)
  28. {
  29. if (!empty($param['tipo2']))
  30. {
  31. $input_id = $param['_field_id'];//id do field tipo_contato_id
  32. $input_tipo = explode('_', $input_id);//valor do campo tipo_id
  33. $tipo2 = $param['_field_value'];//apenas o código
  34. $unique_id = end($input_tipo);
  35. try
  36. {
  37. $criteria1 = TCriteria::create( ['tipo_contato_id' => $tipo2 ] );
  38. //tipo_contato_id = parametro chave estrangeira da tabela master
  39. //formname,field(nome do campo),database , nome da model,key,value,ordercolumn = NULL,criteria, startEmpty = FALSE
  40. TDBCombo::reloadFromModel(self::$formName,'tipo3_'.$unique_id,self::$database,'Tipo','tipo_contato_id','{tipo->nome}','tipo_contato_id',$criteria1,TRUE);
  41. }
  42. catch (Exception $e)
  43. {
  44. new TMessage('error', $e->getMessage());
  45. }
  46. }
  47. else
  48. {
  49. TCombo::clearField(self::$formName,'tipo3_'.$unique_id); //reload do formulario na segunda combo "tipo3_"
  50. }
  51. }
  52. public function fireEvents($object)
  53. {
  54. $input_id = $param['_field_id'];//id do field tipo_contato_id
  55. $input_tipo = explode('_', $input_id);//valor do campo tipo_id
  56. $tipo2 = $param['_field_value'];//apenas o código
  57. $unique_id = end($input_tipo);
  58. if (!empty($object))
  59. {
  60. $obj = new stdClass;
  61. if(get_class($obj) == 'stdClass')
  62. {
  63. foreach ($object as $row => $value)
  64. {
  65. if($value)
  66. {
  67. $obj->{'tipo1_'.$unique_id} = $value->tipo_endereco_id[$row];
  68. $obj->{'tipo2_'.$unique_id} = $value->tipo_contato_id[$row];
  69. $obj->{'tipo3_'.$unique_id} = $value->tipo_id[$row];
  70. $obj->{'value_'.$unique_id} = $value->value[$row];
  71. }
  72. else
  73. {
  74. $obj->{'tipo1_'.$unique_id} = $value->tipo_endereco_id[$row];
  75. $obj->{'tipo2_'.$unique_id} = $value->tipo_contato_id[$row];
  76. $obj->{'tipo3_'.$unique_id} = $value->tipo_id[$row];
  77. $obj->{'value_'.$unique_id} = $value->value[$row];
  78. }
  79. }
  80. }
  81. }
  82. TForm::sendData(self::$formName, $obj);
  83. }
  84. ?>

RB

Segue link do video


https://vimeo.com/302955776
JR

no js do Adianti (components.min.js) na função tcombo_clear falta aceitar o campo por id
como nas outras functions de tcombo.
ex:
if ($("#" + t).length > 0) {
var t = "#" + t
}
RB

João Vitor,

Não entendi.

RB

Ola, ainda não consegui resolver este problema.

Alguém ai pode me ajudar ?