Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
adicionar no TFieldList dinamicamente Olá, Como posso adicionar campos ao TFieldList dinamicamente após a mudança de uma TCombo? Adicionei a TFieldList ao formulário, mas não sei como inserir os dados em serviço de forma dinâmica $this->fieldlist = new TFieldList; $this->fieldlist->width = '100%'; $this->fieldlist->name = 'my_field_list'; $this->fieldlist->addField( 'Serviço',...
LB
adicionar no TFieldList dinamicamente  
Olá,
Como posso adicionar campos ao TFieldList dinamicamente após a mudança de uma TCombo?

Adicionei a TFieldList ao formulário, mas não sei como inserir os dados em serviço de forma dinâmica

$this->fieldlist = new TFieldList; $this->fieldlist->width = '100%'; $this->fieldlist->name = 'my_field_list'; $this->fieldlist->addField( '<b>Serviço</b>', $id_servico, ['width' => '30%'] ); $this->fieldlist->addField( '<b>Responsável</b>', $id_responsavel, ['width' => '30%'] ); $this->fieldlist->addField( '<b>Data Início</b>', $data_inicio, ['width' => '20%'] ); $this->fieldlist->addField( '<b>Data Final</b>', $data_final, ['width' => '20%'] ); $this->fieldlist->enableSorting(); $this->form->addField($id_servico); $this->form->addField($id_responsavel); $this->form->addField($data_inicio); $this->form->addField($data_final); $this->fieldlist->addHeader(); $this->fieldlist->addDetail( new stdClass ); $this->fieldlist->addDetail( new stdClass ); $this->fieldlist->addDetail( new stdClass ); $this->fieldlist->addDetail( new stdClass ); $this->fieldlist->addCloneAction();

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


NR

Vamos ver se entendi. Você tem uma combo fora do TFieldList, e com base no item selecionado nessa combo você quer recarregar uma combo que está no TFieldList?
LB

Isso mesmo Nataniel, por exemplo.
A combo fora do TFieldList vai estar a Classificação do Serviço, onde essa Classificação pode ter vinculado N serviços que eu quero adicionar no TFieldList
NR

adianti.com.br/framework_files/tutor/index.php?class=FormHierarchica

O que você precisa é bem parecido com o exemplo acima, a diferença é que precisa adicionar [ ] no fim do nome do campo, pois o TFieldList cria os campos como array:
 
  1. <?php
  2. TDBCombo::reloadFromModel('nome_form', 'nome_campo[]', 'banco', 'Model'...
  3. ?>
LB

Olá Nataniel,
Não consegui implementar a solução.
Estava tentando seguir como mando abaixo. A idéia é adicionar no TFieldList com o evento da Combo.

Não consegui avançar com isso..

 
  1. <?php
  2. //minha combo fora do TFieldList
  3. $id_servico = new TDBCombo('id_servico','database','Servico','id','nome');
  4. // a TFieldList no Form
  5. $this->form->appendPage('Serviços');
  6. $this->fieldlist = new TFieldList;
  7. $this->fieldlist->width = '100%';
  8. $this->fieldlist->name = 'my_field_list';
  9. $this->fieldlist->addField( '<b>Serviço</b>', $id_servico, ['width' => '30%'] );
  10. $this->fieldlist->addField( '<b>Responsável</b>', $id_responsavel, ['width' => '30%'] );
  11. $this->fieldlist->addField( '<b>Data Início</b>', $data_inicio, ['width' => '20%'] );
  12. $this->fieldlist->addField( '<b>Data Final</b>', $data_final, ['width' => '20%'] );
  13. $this->fieldlist->enableSorting();
  14. $this->form->addField($id_servico);
  15. $this->form->addField($id_responsavel);
  16. $this->form->addField($data_inicio);
  17. $this->form->addField($data_final);
  18. // ação da TDBCombo
  19. $id_classprojeto->setChangeAction(new TAction(array($this, 'onChangeActionServico')));
  20. public static function onChangeActionServico($param)
  21. {
  22. try
  23. {
  24. if (isset($param['key']))
  25. {
  26. // get the parameter $key
  27. $key=$param['key'];
  28. // open a transaction with database
  29. TTransaction::open('database');
  30. // instantiates object System_group
  31. $object = new ClassificacaoProjeto($key);
  32. $data = array();
  33. foreach ($object->getServicos() as $servico)
  34. {
  35. $dados = new stdclass();
  36. $dados->id_servico = $servico->id;
  37. $dados->id_responsavel = '';
  38. $dados->data_inicio = '';
  39. $dados->data_final = '';
  40. // não posso usar o $this por estar em uma função estática
  41. $this->fieldlist->addDetail($dados);
  42. }
  43. }
  44. }
  45. catch (Exception $e) // in case of exception
  46. {
  47. // shows the exception error message
  48. new TMessage('error', $e->getMessage());
  49. }
  50. }
  51. ?>

NR

Para fazer o que você quer vai ter que usar um pouco de javascript:
 
  1. <?php
  2. public static function onChangeActionServico($param)
  3. {
  4. try
  5. {
  6. if (isset($param['key']))
  7. {
  8. // get the parameter $key
  9. $key=$param['key'];
  10. // open a transaction with database
  11. TTransaction::open('database');
  12. // instantiates object System_group
  13. $object = new ClassificacaoProjeto($key);
  14. $servicos = $object->getServicos();
  15. TFieldList::clear('my_field_list'); // limpar fieldlist, deixando somente a primeira linha
  16. TFieldList::addRows('my_field_list', count($servicos)-1); // adicionar número de linhas igual ao total de serviços menos 1, pois a primeira linha é mantida
  17. $data = array();
  18. $js = "setTimeout(function() {";
  19. foreach ($servicos as $i => $servico)
  20. {
  21. $js .= "$('[name=id_servico\\\[\\\]]').eq({$i}).val({$servico->id});";
  22. }
  23. $js .= '}, 50 * ' . (count($servicos)+1) .');';
  24. TScript::create($js);
  25. }
  26. }
  27. catch (Exception $e) // in case of exception
  28. {
  29. // shows the exception error message
  30. new TMessage('error', $e->getMessage());
  31. }
  32. }
  33. ?>
LB

Obrigado Nataniel,
Estou tendo dificuldade ainda. O TDBCombo não está setando o valor do serviço passado no .val() da função do javascript.
LB

Ajustei o código vendo a documentação do select2.

Ficou dessa forma:

 
  1. <?php
  2. foreach ($servicos as $i => $servico)
  3. {
  4. $js .= "$('[name=id_servico]').eq({$i}).val({$servico->id}).trigger('change');";
  5. }
  6. ?>




Obrigado Nataniel pela ajuda, vlw demais!
AD

Nataniel Rabaioli, eu usei tua dica " ( 2019-01-25) Para fazer o que você quer vai ter que usar um pouco de javascript:"

js .= "$('[name=id_servico\\\[\\\]]').eq({$i}).val({$servico->id});";


Estou tendo problema quando o campo é do tipo "data"

$js .= "$('[name=vencimento\\\[\\\]]').eq({$i}).val({$dt_vencimento->format('d/m/Y')});";


Ele mostra assim: prntscr.com/td3tjd

Tu consegue me ajudar nisso?

Obrigado!
NR

A data é uma string, por isso precisa das aspas dentro de val(''), caso contrário vai interpretar como um cálculo, dividindo o dia pelo mês e pelo ano.
AD

Nataniel Rabaioli, Obrigado mestre!

Tentei tudo menos colocar entre aspas, deu certo.

Valeu!
LA

Olá.
Muito obrigada pelas explicações Nataniel, estava tendo essa mesma dificuldade e consegui executar facilmente com sua ajuda.
No momento só não estou conseguindo formatar o campo do tipo "data" para padrão br
tentei usar como no exemplo do Adriano, mas não funcionou.

js .= "$('[name=inicio_rec_prev\\\[\\\]]').eq({$i}).val(\'{$dt_iniprev->format('d/m/Y')}\');";


Conseguiria me ajudar?
Desde ja agradeço.
LA

Olá.
Muito obrigada pelas explicações Nataniel, estava tendo essa mesma dificuldade e consegui executar facilmente com sua ajuda.
No momento só não estou conseguindo formatar o campo do tipo "data" para padrão br
tentei usar como no exemplo do Adriano, mas não funcionou.

js .= "$('[name=inicio_rec_prev\\\[\\\]]').eq({$i}).val(\'{$dt_iniprev->format('d/m/Y')}\');";


Conseguiria me ajudar?
Desde ja agradeço.
NR

O que tem na variável $dt_iniprev?
LA

Obrigada pelo retorno Nataniel.
Para melhor compreensão, segue a função completa, desenvolvida para preencher uma fieldlist dinamicamente, a partir da seleção de um registro em uma outra fieldlist.

 
  1. <?php
  2. public function onSetAtividade($param)
  3. {
  4. $key = $param['atv_id'];
  5. if($key)
  6. {
  7. TTransaction::open(APPLICATION_NAME); // open a transaction
  8. $recursos = AtividadeConsultor::where('atividade_id', '=',$key)->load();
  9. if($recursos)
  10. {
  11. TFieldList::clear('recurso_fieldlist');
  12. TFieldList::addRows('recurso_fieldlist', count($recursos)-1);
  13. $js = "setTimeout(function() {";
  14. foreach($recursos as $i => $recurso )
  15. {
  16. //ESSE ERA O CONTEUDO DA VARIAVEL, ESTOU USANDO DIRETO (VIDE JS), MAS TAMBEM NAOFUNCIONA
  17. // $dt_iniprev = $recurso->inicio_rec_prev;
  18. $js .= "$('[name=atvxrec_id\\\[\\\]]') .eq({$i}).val({$recurso->id});";
  19. $js .= "$('[name=atividade_id\\\[\\\]]') .eq({$i}).val({$recurso->atividade_id});";
  20. $js .= "$('[name=consultor_id\\\[\\\]]') .eq({$i}).val({$recurso->consultor_id});";
  21. $js .= "$('[name=inicio_rec_prev\\\[\\\]]').eq({$i}).val(\'{$recurso->inicio_rec_prev->format('d/m/Y')}\');";
  22. $js .= "$('[name=fim_rec_prev\\\[\\\]]') .eq({$i}).val('{$recurso->fim_rec_prev}');";
  23. $js .= "$('[name=horas_rec_prev\\\[\\\]]') .eq({$i}).val('{$recurso->horas_rec_prev}');";
  24. $js .= "$('[name=inicio_rec_real\\\[\\\]]').eq({$i}).val('{$recurso->inicio_rec_real}');";
  25. $js .= "$('[name=fim_rec_real\\\[\\\]]') .eq({$i}).val('{$recurso->fim_rec_real}');";
  26. $js .= "$('[name=horas_rec_real\\\[\\\]]') .eq({$i}).val('{$recurso->horas_rec_real}');";
  27. }
  28. $js .= '}, 50 * ' . (count($recursos)+1) .');';
  29. TScript::create($js);
  30. TTransaction::close(); // close the transaction
  31. }
  32. }
  33. }
  34. ?>

NR

A função "format" nesse caso pertence à classe DateTime, por isso não é possível chamá-la diretamente em uma string($recurso->inicio_rec_prev). Se quiser usar dessa maneira precisa fazer o seguinte:
 
  1. <?php
  2. $nova_data = new DateTime($recurso->inicio_rec_prev);
  3. // agora sim pode usar a funcao format
  4. echo $nova_data->format('d/m/Y');
  5. ?>

Outra coisa, esse post é antigo, atualmente temos outras opções mais simples de preencher o fieldlist. Veja o exemplo no tutor, agora é possível usar a função sendData para isso:
https://adianti.com.br/framework_files/tutor/index.php?class=FormFieldListEventsView
AD

Olá Livea Araujo,

No meu caso não deu problema na formatação da data. A data eu tratei assim:

$dt_vencimento = new DateTime(TDate::date2us($param['data_documento'])); .... $js .= "$('[name=financeiro_parcelas_financeiro_vencimento\\\[\\\]]').eq({$i}).val('{$dt_vencimento->format('d/m/Y')}');";