Lançado Adianti Framework 7.6!
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 completo Meu Negócio Pronto
Use para si, ou transforme em um negócio: Inclui aulas e códigos-fontes
Gestor de conteúdo (SITE) + Loja Virtual (E-Commerce) + Emissor de Notas para infoprodutos


Meu negócio pronto 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.         
  15.         $this->form->addField($id_servico);
  16.         $this->form->addField($id_responsavel);
  17.         $this->form->addField($data_inicio);
  18.         $this->form->addField($data_final);
  19. // ação da TDBCombo
  20. $id_classprojeto->setChangeAction(new TAction(array($this'onChangeActionServico')));
  21. public static function onChangeActionServico($param)
  22.     {
  23.         try
  24.         {   
  25.             if (isset($param['key']))
  26.             {
  27.                 // get the parameter $key
  28.                 $key=$param['key'];
  29.                 
  30.                 // open a transaction with database
  31.                 TTransaction::open('database');
  32.                 
  33.                 // instantiates object System_group
  34.                 $object = new ClassificacaoProjeto($key);
  35.                 
  36.                 $data = array();
  37.                 foreach ($object->getServicos() as $servico)
  38.                 {
  39.                     $dados = new stdclass();
  40.                     $dados->id_servico $servico->id;
  41.                     $dados->id_responsavel '';
  42.                     $dados->data_inicio '';
  43.                     $dados->data_final '';
  44.                     
  45. // não posso usar o $this por estar em uma função estática
  46.                     $this->fieldlist->addDetail($dados);
  47.                 }
  48.                 
  49.             }
  50.         }
  51.         catch (Exception $e// in case of exception
  52.         {
  53.             // shows the exception error message
  54.             new TMessage('error'$e->getMessage());
  55.         }
  56.     }
  57. ?>

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.                 
  11.                 // open a transaction with database
  12.                 TTransaction::open('database');
  13.                 
  14.                 // instantiates object System_group
  15.                 $object = new ClassificacaoProjeto($key);
  16.                 $servicos $object->getServicos();
  17.                 TFieldList::clear('my_field_list'); // limpar fieldlist, deixando somente a primeira linha
  18.         
  19.                 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
  20.                 
  21.                 $data = array();
  22.                 $js "setTimeout(function() {";
  23.                 foreach ($servicos as $i => $servico)
  24.                 {
  25.                     $js .= "$('[name=id_servico\\\[\\\]]').eq({$i}).val({$servico->id});";
  26.                 }
  27.                 $js .= '}, 50 * ' . (count($servicos)+1) .');';
  28.         
  29.                 TScript::create($js);       
  30.             }
  31.         }
  32.         catch (Exception $e// in case of exception
  33.         {
  34.             // shows the exception error message
  35.             new TMessage('error'$e->getMessage());
  36.         }
  37.     }
  38.        
  39. ?>
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.                         
  10.             if($recursos)
  11.             {
  12.                 TFieldList::clear('recurso_fieldlist');                     
  13.                 TFieldList::addRows('recurso_fieldlist'count($recursos)-1);
  14.                 $js "setTimeout(function() {";
  15.                 foreach($recursos  as $i => $recurso )
  16.                 {      
  17.                    //ESSE ERA O CONTEUDO DA VARIAVEL, ESTOU USANDO DIRETO (VIDE JS), MAS TAMBEM NAOFUNCIONA
  18.                    // $dt_iniprev = $recurso->inicio_rec_prev; 
  19.                     
  20.                     $js .= "$('[name=atvxrec_id\\\[\\\]]')     .eq({$i}).val({$recurso->id});"
  21.                     $js .= "$('[name=atividade_id\\\[\\\]]')   .eq({$i}).val({$recurso->atividade_id});";
  22.                     $js .= "$('[name=consultor_id\\\[\\\]]')   .eq({$i}).val({$recurso->consultor_id});"
  23.                     $js .= "$('[name=inicio_rec_prev\\\[\\\]]').eq({$i}).val(\'{$recurso->inicio_rec_prev->format('d/m/Y')}\');";
  24.                     $js .= "$('[name=fim_rec_prev\\\[\\\]]')   .eq({$i}).val('{$recurso->fim_rec_prev}');";
  25.                     $js .= "$('[name=horas_rec_prev\\\[\\\]]') .eq({$i}).val('{$recurso->horas_rec_prev}');";
  26.                     $js .= "$('[name=inicio_rec_real\\\[\\\]]').eq({$i}).val('{$recurso->inicio_rec_real}');";
  27.                     $js .= "$('[name=fim_rec_real\\\[\\\]]')   .eq({$i}).val('{$recurso->fim_rec_real}');";
  28.                     $js .= "$('[name=horas_rec_real\\\[\\\]]') .eq({$i}).val('{$recurso->horas_rec_real}');";
  29.                 }
  30.                 $js .= '}, 50 * ' . (count($recursos)+1) .');';
  31.         
  32.                 TScript::create($js);   
  33.                 TTransaction::close(); // close the transaction     
  34.             }
  35.         }
  36.     }
  37. ?>

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')}');";